gpt4 book ai didi

java - 如何打开 Jar 文件进行读取而不遇到 ZipException?

转载 作者:太空宇宙 更新时间:2023-11-04 08:25:22 24 4
gpt4 key购买 nike

我从事 Java 编程已有大约 15 年了。虽然这是一个基本问题,但这并不是因为故意无视 Java API 或阅读文档。坦率地说,我真的很震惊,我遇到了一种情况,我无法使用命令行工具创建一个简单的 jar 文件并使用 java.util.jar.* API 打开它。我的详分割步过程如下。

我使用 jar -cf 创建一个简单的 .jar 文件进行测试。它包含一个文本文件。以下是我的 shell 的输出,显示了我如何在 Maven 项目的 src/test/resources 目录中创建它:

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

(拾取_JAVA_OPTIONS:-Dfile.encoding=UTF-8是为了解决Mac错误,终端上的默认文件编码为MacRoman。如果您想在屏幕上看到准确表示的Unicode字符,您需要手动将文件编码设置为UTF-8。据我所知,这与我遇到的问题无关。)

然后,当创建 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();
}
}
}

异常(exception)情况是:

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)

回顾一下:

  • 我使用 jar 命令行工具的最简单调用在测试用例可访问的位置创建了一个 source.jar 文件。
  • 我验证该文件确实存在,无论是在视觉上还是在我的测试用例中。
  • 我已在 emacs 中使用 jar -xfunzip 成功打开此文件。这是一个有效的 jar 和 zip 文件。
  • 我在测试用例中确认当前正在运行的用户可以读取它。

我觉得承认这一点很愚蠢,但我想我对 JarFile 构造函数如何工作连最基本的理解都没有。非常感谢这里的任何意见。

最佳答案

Maven再次出击。我为 Maven filtering 设置了测试资源区域所以生成的 zip 文件的内部结构很可能是困惑的。我希望我在这里的失败可以帮助其他人解决类似的问题。

关于java - 如何打开 Jar 文件进行读取而不遇到 ZipException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8659907/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com