当前位置: 首页 > 知识库问答 >
问题:

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

章博耘
2023-03-14

我正在准备迁移到我的团队的整个项目组合的Java11。所有应用程序都基于多年来内部开发的框架,有些部分已经超过12年。

我遵循了这篇文章中的建议(以及来自Oracle的这一网页——这一点都没有帮助),使用版本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中声明,模块java.sql.rowset不导出它)”

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

第一个问题源于这样一个事实:过去有人有使用classcom的绝妙想法。太阳行集。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的类替换该类。

第二个问题对我来说更重要。我们使用了许多产生错误的包,主要用于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依赖项中删除提供匹配包的工件。不幸的是,这样做会在其他地方产生错误,因为删除依赖项会使其他一些包不可用。例如,如果在依赖项中保留XMLAPI,则会出现“PackageX可从多个模块访问”错误。如果我将它从作为可传递依赖项拉入的所有依赖项中排除,则会出现“xxx无法解析为类型”错误。

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

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

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

[编辑]由于对另一个问题的回答,问题1得以解决。

共有1个答案

漆雕彬彬
2023-03-14

今天我碰到了问题2。

就我而言,这足以避免进口

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

这个artifact/jar包含相同的(与XML相关的)类,这些类与java11lib冲突。这是因为我们得到错误“可以从多个模块访问包x”。

就我而言,我不需要再做任何事情了。

在你的例子中,(“xxx不能解析为类型”)我想你需要确保在编译时java.xml导入模块。

本页建议

这可以通过创建一个文件来实现。mvn/jvm。在项目文件夹中进行配置,并将选项放入其中。下面是一个简单的例子:

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

javac选项用于在Java中包含模块。

 类似资料:
  • 在 Ubuntu 系统中,使用了源码的方式安装了一个软件,因为某些特性需要源码安装。该软件有一些第三方模块,如果使用 apt-get 的方式安装第三方模块,会提示需要该软件安装后才可以安装这些第三方模块,也就是 apt-get 的方式是无法知道通过源码方式已经安装了的软件的。 现在安装第三方模块也采用了源码方式进行安装,但是这样比较麻烦,有没有更好的方式来安装这些第三方模块?

  • maven jetty插件有这个错误。我认为出现这个问题是因为插件的传输依赖性与新库冲突。这个错误出现在我将jersey1更改为jersey2并从com更改所有依赖项之后。sun到org。glassfish用于服务器客户端/核心/rs ws等。 等等 有人能回答如何避免这种错误吗?谢谢。 更新1:http://pastebin.com/ag2zdiSH链接到完整的pom

  • 我升级为不和谐。JSV12,但它破坏了我现有的v11代码。下面是一些导致错误的示例: 如何将代码迁移到Discord。JSV12并修复这些错误?在哪里可以看到v12引入的突破性更改?

  • 我有一个用于java程序的库。 它包含下一行: 它在java8上运行正常,但在我尝试在java11上启动它之后,我得到了ClassCastException JAVAClassCastException:类jdk。内部的加载器。ClassLoaders$AppClassLoader不能强制转换为java类。网URLClassLoader 有可能解决这个pb而不修改库吗?AFAIK,Java应该向下

  • 问题内容: 我正在将Java代码库迁移到纯Scala,并且只能使用这一段代码。我有一个IntervalMap的实现,即一个数据结构,可让您有效地将范围映射到,和操作全部所在的位置(与IntervalTree或SegmentTree略有不同)。 这段代码使用Java,并且在迁移到Scala时遇到了两个大问题: Scala没有-我决定使用(奇怪的Scala有但没有)存储密钥并将值存储在辅助中来解决它。