Я программирую на Java около 15 лет.Хотя это основной вопрос, это не связано с преднамеренным незнанием API Java или чтением документации.Честно говоря, я действительно встревожен тем, что столкнулся с ситуацией, когда я не могу создать простой файл JAR с помощью инструментов командной строки и открыть его с помощью java.util.jar.*
API. Мой подробный пошаговый процессниже.
Я использовал jar -cf
, чтобы создать простой .jar
файл для тестирования.Он содержит один текстовый файл в нем.Вот вывод из моей оболочки, показывающий, как я создал его в каталоге src/test/resources
моего проекта Maven:
Laird-Nelsons-MacBook-Pro:resources ljnelson$ cat > a.txt
Hello!
Laird-Nelsons-MacBook-Pro:resources ljnelson$ jar cf source.jar .
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
Laird-Nelsons-MacBook-Pro:resources ljnelson$ ls -al
total 16
drwxr-xr-x 4 ljnelson staff 136 Dec 28 13:21 .
drwxr-xr-x 4 ljnelson staff 136 Dec 28 13:01 ..
-rw-r--r-- 1 ljnelson staff 7 Dec 28 13:21 a.txt
-rw-r--r-- 1 ljnelson staff 445 Dec 28 13:21 source.jar
Laird-Nelsons-MacBook-Pro:resources ljnelson$ jar tf source.jar
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
META-INF/
META-INF/MANIFEST.MF
a.txt
(Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
- для обхода ошибки Mac, где кодировка файла по умолчанию на терминалеэто MacRoman
. Вам нужно вручную установить кодировку файла на UTF-8
, если вы хотите видеть точно отображаемые символы Unicode на вашем экране. Насколько мне известно, это не имеет ничего общего с проблемой, которую я вижу.)
Тогда следующий код тестового примера завершается неудачно при создании JarFile
:
public File getSourceJarFile() throws IOException, URISyntaxException {
final URL url = this.getClass().getResource("/source.jar");
assertNotNull(url);
final URI uri = url.toURI();
assertNotNull(uri);
final String path = uri.getPath();
assertNotNull(path);
return new File(path);
}
@Test
public void testWTF() throws IOException, URISyntaxException {
final File file = this.getSourceJarFile();
assertNotNull(file);
assertTrue(file.isFile());
assertTrue(file.canRead());
// At this point, the file itself is there and can be read by this user.
JarFile jarFile = null;
try {
jarFile = new JarFile(file); // XXX KABOOM
} finally {
if (jarFile != null) {
jarFile.close();
}
}
}
Исключение составляет:
java.util.zip.ZipException: error in opening zip file
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:127)
at java.util.jar.JarFile.<init>(JarFile.java:135)
at java.util.jar.JarFile.<init>(JarFile.java:99)
at com.foobar.TestCaseJarFileWTF.testWTF(TestCaseJarFileWTF.java:72)
Напомним:
- Я создаю файл
source.jar
в месте, доступном для моего тестового примера, используя простейший вызов инструмента командной строки jar
. - Я проверяю, что этот файл действительно существует, как визуально, так ив моем тестовом случае.
- Я успешно открыл этот файл в
emacs
, с jar -xf
и с unzip
.Это действительный файл jar и zip. - В моем тестовом примере я подтверждаю, что он может быть прочитан текущим пользователем.
Я чувствую себя глупо, признавая это, но я думаю,У меня не должно быть даже самого базового понимания того, как работает конструктор JarFile
.Любой вклад здесь приветствуется.