Как открыть JarFile для чтения, не встречая исключение ZipException? - PullRequest
1 голос
/ 28 декабря 2011

Я программирую на 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.Любой вклад здесь приветствуется.

1 Ответ

1 голос
/ 28 декабря 2011

Maven снова наносит удар.У меня была область ресурсов тестирования, настроенная для фильтрации Maven , поэтому в полученном zip-файле, вероятно, были зашифрованы внутренности.Я надеюсь, что мой сбой здесь поможет другим устранить подобные проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...