【问题标题】:Understanding errors with JPMS modules了解 JPMS 模块的错误
【发布时间】:2021-01-12 07:00:06
【问题描述】:

我很难理解这些错误的含义,更不用说开始解决它们了。我正在尝试将 java 平台模块(使用 jdk 14)与一个简单的“基于 gradle 的多模块”项目(使用 jdk 8 一切正常)一起使用。该项目使用 spring-boot 和 spring-data-jdbc。其实我的核心依赖是

implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-freemarker'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.projectlombok:lombok'

当我将 module-info.java 添加到每个项目源根目录时,我的 IDE (intellJ) 非常友好地提示我要导出/需要哪些模块,并且在我开始编译之前一切看起来都很好。

我在此处包含一个 git repo 链接,指向作为此问题主题的项目 - https://github.com/m41na/todo-modules-demo

如果您遇到了这些(或类似)问题,您能否说明一下您是如何解决这些问题的?

error: the unnamed module reads package org.springframework.data.jdbc.core.convert from both spring.data.jdbc and spring.data.relational
error: module spring.context reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.boot.starter.data.jdbc reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.boot.starter.jdbc reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.data.jdbc reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.boot.starter reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.jdbc reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.tx reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.boot.autoconfigure reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.boot reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.aop reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.expression reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
the unnamed module reads package org.springframework.data.jdbc.core.convert from both spring.data.jdbc and spring.data.relational

error: module spring.core reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.boot.starter.logging reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module logback.classic reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module org.apache.logging.slf4j reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
module spring.context reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc

error: module jul.to.slf4j reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module org.slf4j reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
module spring.boot.starter.data.jdbc reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc

error: module java.annotation reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
module spring.boot.starter.jdbc reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc

error: module org.yaml.snakeyaml reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.jcl reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
module spring.data.jdbc reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc

error: module logback.core reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.beans reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
module spring.boot.starter reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc

error: module spring.data.relational reads package org.springframework.data.jdbc.core.convert from both spring.data.jdbc and spring.data.relational
module spring.jdbc reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc

error: module spring.data.commons reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
module spring.tx reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc

【问题讨论】:

  • 我对您的情况一无所知,但是您显示的错误表明您的类路径中有两个 jar 正在贡献具有相同名称的包,因此系统(可能是 ClassLoader ) 不知道该使用哪一个。 spring.data.relationalspring.data.jdbc 是以某种方式与这些 jar 相关联的名称。我会寻找这些名称在您的设置中出现的位置,并且可能会尝试消除其中一个。我不知道在 Gradle 中排除包的具体细节......我使用 Maven。
  • ...如果您遇到这些(或类似)问题...“ – @StephenMaina – 我最近解决了 (1)、(2) 和 ( 3) 与 com.lingocoder.mrjar plugin。将MRE 发送到 git hub,我可以帮助您应用该插件来修复您的 MRE。 TIA。
  • 我看到 lingocoder 有一个很大的红色免责声明 '由于 Gradle 5.6.1 中的重大更改,确认当前版本的 mrJar 仅适用于 Gradle 版本 5.0.0 到 5.5。 1'。这在我的情况下不起作用,因为我使用的是 gradle 6.5
  • 为了完整起见,我添加了一个演示项目的链接,这是这个问题的主题 - github.com/m41na/todo-modules-demo
  • ......一个很大的免责声明......“ -​​ @StephenMaina - 这只是一个旧文档。自编写以来,mrJar v0.0.16 已通过Gradle 5.6.2, 6.0.x, 6.1.x and 6.6.1 成功测试。查看项目45others

标签: java spring spring-data java-platform-module-system spring-data-jdbc


【解决方案1】:

TL;DR — 我已经使用 mrJar Gradle 插件解决了您的 split packages 错误 in this clone of your project1.


冗长的答案

...我很难理解这些错误的含义...

欢迎来到split packages的世界……

...“拆分包”是一个古老的 Java 术语,其中两个具有相同名称的包存在于不同的库/应用程序中。由于配置可靠,Java 9 不允许在不同模块中拆分包……

那句话来自this blog

...如果您遇到这些(或类似)问题...

正如several other Stack Overflow questions 所证明的那样,拆分包对于将项目构建为 JPMS 模块的任何人都是不可避免的。

...您能否说明一下您是如何解决这些问题的?...

参考 TL;DR,我已通过应用我建议的插件解决了您项目的拆分包问题。 Download and build the demo 检查结果。

正如我在该演示文档中提到的,Java 14+ 支持将在接下来的一两天内添加到该插件中。一旦完成,我将更新演示并编辑此答案。但我认为,与其等到那时,你(和其他感兴趣的潜伏者今天可以从 0.0.16 版的 JDK 13 支持中受益。

Another solution I recently proposed 是 Mark Reinhold 建议的“Bridges to the class path”方法的实现。我在 cmets 中提到的数字 23 采用了这种方法。但我个人更喜欢插件方法。这更容易,而且省力。






1 我有充分的权威表明,mrJar 插件正在升级过程中,支持 JDK14+。预计将在接下来的 1-2 天内发布 v0.0.17。

【讨论】:

  • 这个插件太棒了!!非常感谢您的回答。这为我正在进行的工作解锁了下一步。并感谢您提供的那些链接。其中的信息是黄金。
  • …这个插件太棒了!!…“——@StephenMaina——非常简洁。 – “...非常感谢您的回答...” — 很高兴!解封别人很好。但我为 SO 做出贡献的主要目标是我自己的持续改进。为此,我急切地想知道:我的答案可以通过什么方式改进,以便您将其标记为已接受?我已经问过that question before。无济于事。 – “...其中的信息是金...” - 您的评论表明我的回答对您有所帮助。那么请您现在回答 my 的问题来帮助 me 吗? TIA。
猜你喜欢
  • 2019-07-12
  • 2018-06-01
  • 1970-01-01
  • 2021-08-21
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
相关资源
最近更新 更多