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

2024-01-02

我正在准备将我团队的整个项目组合迁移到 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 的问题:目前,我只是想解决编译问题。

我目前有两个问题:

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

依赖排除可能是一个解决方案,但依赖于该框架的产品组合非常广泛,并且排除意味着要寻找可能存在数百个可能存在相关依赖关系的位置作为传递依赖关系。

Question

我的问题是关于如何继续解决问题#2。

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

[编辑] 问题 1 的解决归功于这个答案 https://stackoverflow.com/a/23055737/2749913另一个问题。


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

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

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

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

就我而言,我不需要做更多的事情。

在您的情况下,(“xxx 无法解析为类型”)我猜您需要确保在编译时导入模块 java.xml 。

此页面建议 https://nipafx.dev/maven-on-java-9#

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

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

--add-modules 是 javac 选项,用于在 Java 中包含模块。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 无法安装分发配置文件

    我想向 AppStore 提交一个应用程序 我的第一个应用程序 我已经在我的设备中测试了该应用程序 因此我已经有了开发配置文件 但我无法在 Xcode 中安装分发配置文件 我已按照该过程操作 我不知道多少次 但是当我尝试通过管理器添加配置文
  • 如何避免 Struts2 验证

    我有一个index jsp我从中调用一个动作类TestAction 单击超链接 其中有方法 显示 从数据库加载组合框的值以及执行方法 以显示在页面上test jsp On test jsp 我有一些输入字段和组合框 单击 test jsp
  • PHP 中单引号和双引号字符串有什么区别?

    我有点困惑为什么我在 PHP 中看到一些代码 其中的字符串放在单引号中 有时放在双引号中 我只知道在 NET或者C语言中 如果它是在单引号中 那就意味着它是一个字符 而不是一个字符串 Answer recommended by PHP co
  • 如何查明“svn up”是否成功完成?

    I run sudo svn username radek update codebase force 每天晚上在自动化测试开始之前从我的 php 脚本 在 SuSE 上 获取 因此 测试是在今天签入的最新代码上完成的 我怎么能确定知道sv
  • Gradle 无法解决 Android Studio 中的依赖关系

    我在 Android Studio 中导入了一个 Phonegap 项目 并将其设为基于 Gradle 的项目 现在我正在尝试编译一些外部依赖项 但出现此错误 错误 72 13 无法解析 com loopj android android
  • 类型“typeof“http””上不存在属性“服务器”

    我知道var someModule require someModule 一般被替换为import as someModule from someModule 但我不知道如何使用 Typescript ES6 语法来表达以下 Node js
  • 在 C# 中重置 IronScheme 引擎

    有没有办法 重置 IronScheme 引擎 我的本质目标是确保对 string Eval 的连续调用是独立执行的 例如 我想被执行 define x 1 0 x 5 0 Eval 然后重置并通话 x 3 0 Eval 失败就像它自己执行一
  • 使用 IE 11 的 Angular 4 应用程序“无法从释放的脚本执行代码”

    我有一个 Angular 应用程序 我认为它是版本 4 IE 11 在此应用程序中的登录序列期间崩溃 无法从释放的脚本执行代码 根据 IE 控制台 错误发生在 polyfills 包的第 10939 行 var testString del
  • C++ 中结构的奇怪行为 [第 1 部分]

    考虑 struct box int array 3 int main box a 1 如果上面的代码在 C 中有效 那么为什么下面的代码不起作用 struct box int simple int int main box b 2 是什么原
  • Android构建工具1.1.0,单元测试文件夹?

    我最近在我的 android 项目中安装了来自 google 的最新工具 buildscript repositories jcenter mavenCentral dependencies classpath com android to
  • 是什么触发为 AWS Lambda 访问 VPC 资源创建 ENI

    我们部署了多个 lambda 可以使用以下方式访问我们的 VPC VpcConfig环境 据我了解 AWS Lambda 通常会按需创建 lambda 但如果您将它们连接到您的 VPC 那么 AWS 将 在某些时候 在指定的子网之一上创建
  • 在 Windows 10 中使用 WPF 对大写单词进行拼写检查

    我有一个 WPF 应用程序 其中有一些文本框CharacterCasing CharacterCasing Upper也SpellCheck IsEnabled true 在 Windows 7 中 这工作正常 但在 Windows 10
  • Rails 中的业务逻辑在哪里?

    我是一名 ASP NET MVC 开发人员 刚刚开始我的第一个 Rails 大型项目 但是我很困惑将业务逻辑放在哪里 在 ASP NET 上 我创建了一个包含处理业务逻辑的服务 域驱动设计 的库 我听说 Rails 使用胖模型瘦控制器的概念
  • NestJS:每个模块导入 HttpModule 的新实例

    我的nestjs系统是一个通过API调用连接多个系统的系统 对于每个系统 我创建了一个模块来处理它们的进程 每个模块都导入HttpModule 我想为每个模块的 HttpModule 都有单独的 Axios 拦截器 这是我测试功能的尝试 o
  • Java 8 流条件处理

    我感兴趣的是将一个流分成两个或多个子流 并以不同的方式处理元素 例如 一个 大 文本文件可能包含 A 类型的行和 B 类型的行 在这种情况下我想要执行以下操作 File lines path filter line gt isTypeA l
  • 使用 mysql-proxy 操作登录信息

    是否可以在 mysql proxy 的 lua 脚本中拦截和更改登录信息 例如 如果用户像这样访问代理 mysql h localhost P 4040 u bob D orders p 我希望连接不仅重定向到后端服务器 而且还更改用户名
  • 如何将“2021-01-19T16:20:04+0000”解析为 time.Time

    我已经尝试过以下格式 应该可以捕获 0000我读到的时区偏移量https golang org pkg time pkg constants https golang org pkg time pkg constants ts err ti
  • 根据 Woocommerce 中的每日时间范围对特定产品进行折扣

    在我的 WooCommerce 网站上 我正在尝试举办 特别午餐 每日活动 这意味着 从 11 00 到 15 00 特定产品将因 午餐特惠 每日活动而打折 我希望这个 特别午餐 活动能够在一周的每一天重复发生 如何才能实现这一目标 我在网
  • C++:创建未初始化的占位符变量而不是默认对象

    我现在正从 Java 转向 C 每当 Java 中常用的概念不能直接映射到 C 时 我就会遇到一些困难 例如 在 Java 中我会这样做 Fruit GetFruit String fruitName Fruit fruit if frui
  • 如何解决将 Java 8 代码迁移到 Java 11 时的依赖性和包问题

    我正在准备将我团队的整个项目组合迁移到 Java 11 所有应用程序均基于多年来内部开发的框架 其中某些部分已有 12 年以上的历史 我已遵循中的建议这个帖子 https winterbe com posts 2018 08 29 migr