【问题标题】:Java build issues - Java 8 to Java 11 migrationJava 构建问题 - Java 8 到 Java 11 的迁移
【发布时间】:2022-01-17 15:38:31
【问题描述】:

我们正在从 Java 8 迁移到 Java 11。
我们有一个遗留项目 Y,它依赖于另一个遗留项目 X。
项目 X 没有来源,它只是大约 300 个 jar 的集合。
该构建是基于 ant 的,没有 maven。

我现在无法使用 JDK 11 构建项目 Y(既不能在 Eclipse 中,也不能在外部)
因为它说 “包 org.w3c.dom 可以从多个模块访问:, java.xml”

我在 Eclipse 中的 import org.w3c.dom.Document; 行上收到此错误

当我进行外部构建(使用 ant,在 Eclipse 之外)时,我可以成功构建(使用与 JDK 8 下基本相同的 build.xml)?! 为什么只有 Eclipse 会抱怨? !是不是因为我在下面引用的这个 javac 错误。

我在这里阅读(这些与我的问题直接相关):

https://stackoverflow.com/a/53824670/2300597
The package org.w3c.dom is accessible from more than one module: <unnamed>, java.xml
http://mail.openjdk.java.net/pipermail/jigsaw-dev/2018-December/014077.html

但我仍然无法解决这些构建问题。
我尝试了 7-8 种不同的方法,但没有任何帮助。

我认为冲突在于这 300 个 jar 中的一些 jar 中的 org.w3c.dom 包和 JDK 模块中的同一包 java.xml 之间。

奇怪的是org.w3c.dom.Document 似乎没有出现在这 300 个 jar 中,只是同一包中的其他类出现在 jar 中。

我陷入僵局,我看不出有什么办法解决这个问题。
我不能轻易更改项目 X,因为它是多个旧项目使用的共享库。
另一方面,我无法从项目 Y 的构建路径中删除 java.xml 模块。
所以我不知道如何解决这个问题。

难道没有办法直接说:好吧,先使用JDK中的类,然后使用JAR中的类(即使它们共享同一个包,它们也不是同一个类)。

修复这些错误的正确方法是什么?

【问题讨论】:

  • @meriton 我说我读过这个,但我仍然看不到解决方案。这就是我问的原因。
  • 另外,我们不需要知道您尝试了 多少 项,而是知道您尝试了 哪些 项。我们还能如何检查您是否已经尝试过我们将要描述的解决方案?
  • @meriton 好的,我主要在 Eclipse 中进行了尝试,指定了使项目 Y 依赖于 X 的不同方法(在类路径中,在模块路径中)。然后更改各种编译器选项。将 300 个 jar 直接添加为项目 Y 中的 JAR 依赖项。还尝试将项目 X 转换为模块等。我无法描述我今天 6-7 小时所做的一切。
  • 所以我问的是一般情况下,这种结构似乎根本无法工作。正确的?看来我们需要对这一切进行更全面的返工。
  • 好吧,听起来你还没有从我链接的答案中尝试过 (3) 解决方案。那么也许可以尝试并报告回来?

标签: java eclipse java-8 java-11


【解决方案1】:

Java 从版本 9 开始支持 JPMS(Java 平台模块系统)。

在 Java 平台模块系统中,不允许在多个模块中使用同一个包。因此,解决方案是找到导出此包org.w3c.dom 的模块(jar)并删除其中的一个模块或包。

【讨论】:

  • 谢谢,您能否详细说明这部分:“因此,解决方案是找到导出此包 org.w3c.dom 的模块(jar)并删除其中的一个模块或包。 "我不明白。请注意,我还在学习 JPMS,对它不是很熟悉。
  • @peter.petrov 你有一个项目,它有 N 个依赖项。您的项目和每个依赖项都是一个 jar 模块(如果我们在 jpms 中)。所以,问题是这个集合中的两个模块导出这个包,这是不允许的。所以,问题是找到有这个包的模块(jar)。当心。您的项目可以使用 libA 作为依赖项,bu libA 可以使用具有此包的 libB。因此,在您的 IDE 中,您不仅应该检查您的依赖项,还应该检查依赖项的依赖项等。像这样。
  • 好的...假设我找到了这些具有org.w3c.dom 的JAR。那么“并删除其中的一个模块或包”是什么意思。 ?
  • 到目前为止,显然没有人提到过一些事情。即使您设法编译了代码,它也不会运行,除非您将 java.xml 从环境中排除,否则,org.w3c.dom 包中的类将只能在该模块中查找而无处可寻别的。但是当你说你不能在构建时排除java.xml(因为它被使用了),你显然也不能从运行时排除它。这一切都假设这些org.w3c.dom.X 类无论如何都不在java.xml 模块中,因此完全是多余的。
  • 当我尝试制作类似的场景时,javac确实抱怨尝试创建,例如org.w3c.dom.Foo,我必须使用 Java 8 合规级别预先创建它。然后,当此类确实存在时,javac 不会像 Eclipse 那样抱怨访问 org.w3c.dom.Document,而是抱怨访问 org.w3c.dom.Foo,就像运行时一样。所以这并不是javac 忽略了这个问题。您必须刻意调整选项才能编译此代码。
猜你喜欢
  • 2021-02-24
  • 1970-01-01
  • 2019-09-20
  • 2020-03-01
  • 2020-06-09
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
相关资源
最近更新 更多