首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将Java 9模块引入单片Spring项目

将Java 9模块引入单片Spring项目
EN

Stack Overflow用户
提问于 2022-09-16 09:25:47
回答 1查看 43关注 0票数 1

我有一个标准的单块Spring项目,它被打包为war ( war中的代码,而不是一个jar中的类文件)并部署到Tomcat中。我们有不同的Spring配置文件,允许为不同的用例在不同的实例上部署相同的war。该项目是用src/main/java中所有源代码的Maven构建的。

作为摆脱遗留结构的工作的一部分,我们希望开始为新代码使用Java模块,并随着时间的推移将遗留结构中的内容重构为涵盖核心和配置文件特定功能的新模块。

我正在尝试向新文件夹src/main/v2添加新代码,我还向该文件夹添加了一个module-info.java文件。我对v2-util也做了同样的工作,它给出了:

代码语言:javascript
运行
复制
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来告诉它新的源代码文件夹。

最好的方法是什么?

EN

Stack Overflow用户

发布于 2022-09-16 10:57:06

我也不懂模块系统。据我所知,运行时由于兼容性的原因,目前正在忽略模块-系统。因此,让我们检查编译过程。

我有一个spring (非spring引导)应用程序,并对maven中的编译器做了一些调整:

代码语言:javascript
运行
复制
<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 )。

确保那些模块替换具有“提供”的作用域,以避免出现类异常。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73742701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档