【问题标题】:Struggling to update JRE dependencies within Maven and Eclipse努力在 Maven 和 Eclipse 中更新 JRE 依赖项
【发布时间】:2013-04-16 12:44:40
【问题描述】:

我正在尝试在 Eclipse 中构建large Open Source project;它使用 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)

did some research 似乎这个错误意味着 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 就这么简单,但显然不是。那么我该如何解决这个错误呢?

【问题讨论】:

  • 使用 Eclipse 时,您必须明确告诉它使用另一个 JRE,而不是它自己使用的 JRE。这是使用 Apple Java 6 运行的。较新的 Eclipse 需要 Oracle Java,它会自动修复该问题。

标签: eclipse maven java


【解决方案1】:

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

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

【讨论】:

  • 谢谢斯蒂芬,正确回答了这个问题 - 我想知道是否是这种情况。这表明Java(TM) SE Runtime Environment (build 1.7.0_17-b02),所以我想还有其他东西阻止它支持 ZIP64 - 我会提出一个新的 SO 问题。
  • 另一种可能是 ZIP 文件损坏。您是否尝试过使用其他实用程序打开它?
  • 看起来不错,但确实包含一些相当大的文件。尝试使用 WinRAR 和本地 Windows 资源管理器快捷方式生成它。
  • 现在我不太确定 - 在安装了最新 JRE 7 的 Ubuntu 上运行 JAR 时出现同样的错误,这里肯定会发生一些奇怪的事情......
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 谢谢 - 这样做是否也会更新用于各种外部 JAR 的 JRE,或者是否也需要追踪并重新构建这些 JRE?即“java.util.zip”是否被内置到其他 JAR 中,或者它只是在构建时被链接。 (甚至运行时间?)
    • @CarlosP 它只是从您正在使用的 JDK/JRE 的库中链接的。还要确保您在 JAVA_HOME 的 JDK 是 JDK 7,因为这就是 Maven 将要使用的
    猜你喜欢
    • 1970-01-01
    • 2011-04-15
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    相关资源
    最近更新 更多