0

我正在尝试在 Eclipse中构建一个大型开源项目;它使用 Maven,所以我安装了各种插件(m2eclipse 等),但我对这个设置有点不熟悉。

我可以毫无问题地构建和运行我感兴趣的特定 JAR。但是,当新构建的 JAR 尝试打开一个大的 ZIP 文件时,我得到了这个:

Exception in thread "main" java.lang.RuntimeException: java.util.zip.ZipException: invalid CEN header (bad sig
nature)
        at org.opentripplanner.graph_builder.impl.GtfsGraphBuilderImpl.buildGraph(GtfsGraphBuilderImpl.java:17
9)
        at org.opentripplanner.graph_builder.GraphBuilderTask.run(GraphBuilderTask.java:127)
        at org.opentripplanner.graph_builder.GraphBuilderMain.main(GraphBuilderMain.java:51)
Caused by: java.util.zip.ZipException: invalid CEN header (bad signature)
        at java.util.zip.ZipFile.open(Native Method)
        at java.util.zip.ZipFile.<init>(Unknown Source)

做了一些研究,似乎这个错误意味着 java.util.ZipFile 无法读取文件,因为它是 ZIP64 格式。显然这是在 Java 1.7 中修复的,所以我尽职尽责地更新了 OS X 上的 JDK,并尝试通过在 Eclipse 中右键单击它来更改 Maven 项目,然后更改 Project Facet,这反过来似乎已经更新了该项目中的 JRE 库到 1.7:

在此处输入图像描述

但是,这不起作用 - 即使重新构建了整个项目,我仍然会收到错误消息。

旧的 java.util.zip 是否有可能仍然从某个地方被拉入?我不太熟悉 Java 中的链接是如何工作的,旧的 JDK 可以像这样“嵌入”在依赖项中吗?还是 java.util.zip 只是在目标机器上使用?(这绝对是 JRE 1.7)我知道抛出异常的代码实际上包含在一个单独的 JAR 中,该 JAR 作为 Maven 依赖项引入:

在此处输入图像描述

我是否需要针对 Java 1.7 追踪并重新构建这个外部 JAR,这是这里的问题吗?或者是否有一个 Maven“父项目”的概念将我的新 JRE 1.7 退回到 1.6?对不起,如果这些问题是幼稚的。

我最初认为它会像在运行时机器上更新 JRE 一样简单,但显然不是。那么我该如何解决这个错误呢?

4

3 回答 3

2

假设问题确实是由使用旧版本的 Java 引起的,那么重建不会有任何区别。真正的问题是您的应用程序 JAR运行在较旧的 JRE 上。

在您用于运行应用程序的命令 shell 中,运行java -version. 这将告诉您运行时将使用什么 JDK/JREjava -jar yourApp.jar ...

于 2013-04-16T12:59:17.570 回答
0

与 maven 的关系最重要的一点是请记住,事实的来源是 Maven 中的 pom 文件,而不是IDE。所以更改编译器版本必须在 pom.xml 文件中完成,而不是在 IDE 中。

于 2013-04-16T12:50:11.710 回答
0

Maven 会忽略您在 Eclipse 中使用的 JRE,您必须使用 Maven 编译插件配置强制它。这是此链接中的方法http://maven.apache.org/plugins/maven-compiler-plugin/examples/compile-using-different-jdk.html但使用版本 1.7 而不是 1.3

于 2013-04-16T12:51:39.080 回答