java - 如何解决将 Java 8 代码迁移到 Java 11 的依赖和包问题

标签 java maven

我正在准备将我团队的整个项目组合迁移到 Java 11。所有应用程序都基于多年来在内部开发的框架,其中一些部分已有 12 年以上的历史。

我已遵循 this post 中的建议(和来自 Oracle 的 this web page - 它根本没有帮助),使用 versions-maven-plugin-version 将所有依赖项更新到最新的 GA 版本。

机器上只安装了一个 JDK (11.0.4),Eclipse 配置为源级别 1.8、目标 11 和版本 11。我还没有考虑在运行时环境中从 1.8 过渡到 11 的问题:目前,我只是想解决编译问题。

我目前有两个问题:

  1. “错误:包 com.sun.rowset 不可见。(包 com.sun.rowset 在模块 java.sql.rowset 中声明,不会导出它)”
  2. “包 org.w3c.dom 可以从多个模块访问:, java.xml”

问题1

注意:此问题已解决,请参阅本文底部的“编辑”部分。

第一个问题源于这样一个事实,即过去有人有使用类 com.sun.rowset.CachedRowSetImpl 的绝妙想法,这不是 API(而且他们开始时可能不是使用它)。

我所做的,使用其他问题和给定的答案作为基础,是用这个配置 Maven:

<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.release>11</maven.compiler.release>

我可能在暗中摸索,但无论是在 Eclipse 中还是在命令行中,该配置都没有效果。我将围绕该不正确的用法添加测试,以便我可以将该类替换为另一个实际上是 API 的类。

问题2

第二个问题对我来说更为关键。我们使用许多产生该错误的包,主要用于 XML 处理。以下是其中一些软件包:

org.w3c.dom.Attr
org.w3c.dom.Document
org.w3c.dom.Element
org.w3c.dom.Node
org.w3c.dom.NodeList
org.xml.sax.SAXException
javax.xml.parsers.DocumentBuilder
javax.xml.parsers.DocumentBuilderFactory
javax.xml.parsers.ParserConfigurationException
javax.xml.transform.OutputKeys
javax.xml.transform.Result
javax.xml.transform.Source
javax.xml.transform.Transformer
javax.xml.transform.TransformerException
javax.xml.transform.TransformerFactory
javax.xml.transform.dom.DOMSource
javax.xml.transform.stream.StreamResult
javax.xml.transform.stream.StreamSource
javax.xml.validation.Schema
javax.xml.validation.SchemaFactory
javax.xml.validation.Validator

一种解决方案是从 Maven 依赖项中删除提供匹配包的 Artifact 。不幸的是,这样做会在其他地方产生错误,因为删除依赖项会使其他一些包不可用。例如,如果我将 xml-apis 留在依赖项中,则会出现“包 x 可从多个模块访问”错误。如果我将它从所有将其作为传递依赖项拉出的依赖项中排除,我会收到“xxx 无法解析为类型”错误。

依赖排除可能是一种解决方案,但基于该框架的投资组合非常广泛,排除意味着寻找可能存在数百个位置,在这些位置中,有罪的依赖可能作为传递依赖存在。

问题

我的问题是关于如何着手解决问题 #2。

目前,我已将源和目标级别指定为 1.8,这不是一个可行的选项,但它是迄今为止我发现的唯一允许编译在 JDK 11 上成功的选项。

[编辑] 由于 this answer,问题 1 已解决另一个问题。

最佳答案

我今天突然想到了问题 2。

就我而言,避免导入就足够了

<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>

此 Artifact/jar 包含相同的(与 XML 相关的)类,这些类与 Java 11 库冲突。这是因为我们收到错误“包 x 可从多个模块访问”。

在我的例子中,我不需要再做任何事情。

在你的情况下,(“xxx cannot be resolved to a type”)我猜你需要确保在编译时导入模块 java.xml 。

This page suggests

This is possible by creating a file .mvn/jvm.config in the project's folder and putting the options in there. Here's a simple example:

--add-modules java.xml.bind
--add-opens java.base/java.lang=ALL-UNNAMED
--illegal-access=deny

--add-modules 是在 Java 中包含模块的 javac 选项。

关于java - 如何解决将 Java 8 代码迁移到 Java 11 的依赖和包问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57426105/

相关文章:

Eclipse/Maven/SonarQube : Invalid value of sonar. 库

java - 如何从 shaded jar 中排除 *.DSA 和 *.SF 文件?

java - JPA : how to persist an object with some cascading relations? 仍然是 Javax.persistence.PersistenceException...

docker - 无法在 docker 镜像中缓存 maven 依赖项

maven - Jenkins/Maven 工作 - 运行测试套件两次?

java - GAE Java 超时

java - ivy:使用分类器从 maven 安装

Java 和编译时常量

java - java中构造函数类型不匹配

java - Android 是否允许后台应用程序在正在运行的应用程序上打开 View ?