我正在准备将我团队的整个项目组合迁移到 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 的问题:目前,我只是想解决编译问题。
我目前有两个问题:
- “错误:包 com.sun.rowset 不可见。(包 com.sun.rowset 在模块 java.sql.rowset 中声明,不会导出它)”
- “包 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 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/