java - 可从 Eclipse RCP 中的多个模块访问的包
问题描述
我将 Eclipse RCP 项目从 Eclipse 2019-12 更新到 2020-03。更新后,我在导出时遇到构建错误,如下所示:“包 javax.xml.parsers 可以从多个模块访问:java.xml”。
我在我的项目中使用 Java 11、没有 module-info.java 文件、Eclipse 3 兼容层和 eclipse 产品导出向导。
错误信息对我来说基本上很清楚。它在类路径上检测到某些类两次,这是不允许的。一旦类由 JDK 模块“java.xml”提供。第二个副本来自 javax.xml osgi 包。我的问题是这两个包都无法删除。JDK 模块有很多依赖的 JDK 模块,它们在代码中被积极使用,我不认为它们可以通过一些库来补充。OSGI 包被许多非常基本的 eclipse 包使用。所以它也不能被删除。
所以我有两个问题:
- 为什么 Eclipse RCP 的新版本会破坏项目?这以前被认为是一个错误吗?(我没有找到票)
- 我怎样才能让我的项目在没有太大变化的情况下再次运行?
编辑 1:添加了可重现的示例: https ://workupload.com/file/wKUZTXJXsR9
编辑 2:另见 Eclipse Bug Ticket: https ://bugs.eclipse.org/bugs/show_bug.cgi?id=562761
我创建了一个最小的例子。可以通过向导导出产品来查看问题。我在 Application.java 中使用 javax.xml 中的 DocumentBuilderFactory 来触发问题。我发现了一些事情:
- 需要对 org.eclipse.help.ui 的插件依赖来触发问题。尽管其他插件也依赖于 javax.xml 插件。
- 如果我将直接依赖项添加到 javax.xml 插件,Eclipse 会在编辑器中告诉您问题。但是我们对它只有一个传递依赖,因此没有得到任何提示。
这提出了一些新问题:
- 似乎 org.eclipse.help.ui 插件会导致问题,但我们在应用程序中需要它。这是一个可能的错误吗?有替代品吗?
- 如果我只有对 javax.xml 插件的传递依赖,为什么 Eclipse 编辑器不显示问题?还有一个可能的错误?
解决方案
我找到了解决这个问题的方法:当使用目标定义(*.target 文件)而不是运行平台(Eclipse IDE 的自动目标定义)时,根本不会发生错误!我不知道这两个目标之间到底有什么区别,因为它们都包含“javax.xml”包。但是当使用目标文件时,“javax.xml”包不会在自动添加依赖项时添加到产品文件中,并且以后不会抱怨需要这个包“javax.xml”。不知何故,当使用目标文件时,根本不需要“javax.xml”,然后就不会发生错误。
我认为 Eclipse RCP 中存在一个错误,在使用运行平台时会导致此问题。但我还是建议使用目标定义文件,因为这会带来很多其他优势。
推荐阅读
- bash - 运行使用 OpenVINO 和 OpenCV 的 Go 程序 - /usr/bin/ld: 找不到 -lXXX
- android - 什么类型的控件可以让初次使用的用户了解应用程序?可以自动化吗?
- python - 如何连接 3D 空间中的散点?
- sql - 需要包含前一行所有值的单行
- react-native - 安装 react-native-push-notification 后无法构建应用程序
- struct - 如何将单个结构复制到 __global__ 内存中?
- uwp - 在 uwp 应用程序中定位 Windows 版本
- angular - RxJS groupBy 对可观察自定义数组的 ngrx 效果
- caching - DNS 预取和预连接:仅适用于非缓存资源?
- kubernetes - 当 10GB 分配给每个节点的引导磁盘时,Kubernetes 磁盘压力警告