我正在准备将我团队的整个项目组合迁移到 Java 11。所有应用程序均基于多年来内部开发的框架,其中某些部分已有 12 年以上的历史。
我已遵循中的建议这个帖子 https://winterbe.com/posts/2018/08/29/migrate-maven-projects-to-java-11-jigsaw/ (and 这个网页 https://docs.oracle.com/javase/9/migrate/来自 Oracle – 它根本没有帮助),使用 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 依赖项中删除提供匹配包的工件。不幸的是,这样做会在其他地方产生错误,因为删除依赖项会使其他一些包不可用。例如,如果我将 xml-apis 保留在依赖项中,则会出现“包 x 可从多个模块访问”错误。如果我将其从所有将其作为传递依赖项拉取的依赖项中排除,则会收到“xxx 无法解析为类型”错误。
依赖排除可能是一个解决方案,但依赖于该框架的产品组合非常广泛,并且排除意味着要寻找可能存在数百个可能存在相关依赖关系的位置作为传递依赖关系。
Question
我的问题是关于如何继续解决问题#2。
目前,我采取了指定源和目标级别 1.8 的方式,这不是一个可行的选项,但它是迄今为止我发现的唯一可以在 JDK 11 上成功编译的选项。
[编辑] 问题 1 的解决归功于这个答案 https://stackoverflow.com/a/23055737/2749913另一个问题。