我有一个标准的单块Spring项目,它被打包为war ( war中的代码,而不是一个jar中的类文件)并部署到Tomcat中。我们有不同的Spring配置文件,允许为不同的用例在不同的实例上部署相同的war。该项目是用src/main/java
中所有源代码的Maven构建的。
作为摆脱遗留结构的工作的一部分,我们希望开始为新代码使用Java模块,并随着时间的推移将遗留结构中的内容重构为涵盖核心和配置文件特定功能的新模块。
我正在尝试向新文件夹src/main/v2
添加新代码,我还向该文件夹添加了一个module-info.java
文件。我对v2-util
也做了同样的工作,它给出了:
src/main/java/com/mycompany/MyClass.java
src/main/v2/com/mycompany/MyV2Class.java
src/main/v2/module-info.java
src/main/v2-util/com/mycompany/v2-util/MyV2UtilityClass.java
src/main/v2-util/module-info.java
pom.xml
注意,src/main/java
没有 module-info.java
文件。这是因为遗留项目的依赖关系图很复杂,并且充满了成为自动模块或有拆分包的东西。事实证明,实施src/main/java/module-info.java
声明是不可能的,而且耗费时间,这主要是因为将第三方jars上的包从同一个提供者中分离出来。
试图编译上面的结构是可行的: Maven找到了新的v2/module-info.java
类,但是似乎v2/module-info.java
声明迫使编译器坚持使用一个模块来处理java/
中遗留的内容。我看到很多“包X是在未命名的模块中声明的,但是模块X不读取它”,这意味着构建失败。
我想要发生的是上面模块v2
中的新代码可以访问:
v2-util
模块.公开的内容。
我的猜测是,我误解了模块系统的工作方式,而我想要做的事情是不可能的。
重要的一点是:我还没有设置任何类型的Maven模块系统,我只是使用了build maven-plugin来告诉它新的源代码文件夹。
最好的方法是什么?
发布于 2022-09-16 10:57:06
我也不懂模块系统。据我所知,运行时由于兼容性的原因,目前正在忽略模块-系统。因此,让我们检查编译过程。
我有一个spring (非spring引导)应用程序,并对maven中的编译器做了一些调整:
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
(...)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.0</version>
<configuration>
<compilerArgs>
<arg>--add-exports</arg>
<arg>java.base/sun.security.rsa=ALL-UNNAMED</arg>
<arg>--add-exports</arg>
<arg>java.base/sun.security.util=ALL-UNNAMED</arg>
<arg>--add-exports</arg>
<arg>java.base/sun.security.x509=ALL-UNNAMED</arg>
<arg>--add-opens</arg>
<arg>java.base/java.lang=ALL-UNNAMED</arg>
</compilerArgs>
</configuration>
</plugin>
对于过去属于JDK并被排除在JDK 9>之外的库,在maven中有一些模块替换作为官方依赖项(参见Replacements for deprecated JPMS modules with Java EE APIs )。
确保那些模块替换具有“提供”的作用域,以避免出现类异常。
https://stackoverflow.com/questions/73742701
复制相似问题