簡體   English   中英

將 Java 9 個模塊引入單片 Spring Tomcat 項目

[英]Introducing Java 9 modules to a monolithic Spring Tomcat project

I have a standard monolithic Spring Java project which gets packaged as a war (with our code in class files within the war, not in a single jar) and deployed into a Tomcat. 我們有不同的 Spring 配置文件,允許在不同的實例上針對不同的用例部署相同的戰爭。 該項目是用 Maven 構建的,所有源代碼都在src/main/java中。

作為擺脫遺留結構的工作的一部分,我們希望開始將 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 找到了新的 Java 類,但似乎v2/module-info.java聲明在編譯器中堅持使用一個模塊來聲明遺留的東西java/ 我看到很多“在未命名的模塊中聲明了包 X,但模塊 X 沒有讀取它”,這意味着構建失敗。

我想要發生的是上面模塊v2中的新代碼可以訪問:

  • 遺留代碼中的任何內容
  • 只有v2-util模塊公開的內容。

我的猜測是我誤解了模塊系統的工作原理,而我想做的事情是不可能的。

重要的一點:我沒有設置任何類型的 Maven 模塊系統,我只是使用 build-helper-maven-plugin 告訴它新的源文件夾。

最好的方法是什么?

我也不了解模塊系統。 據我所知,運行時當前出於兼容性原因而忽略了模塊系統。 因此,讓我們檢查編譯過程。

我有一個 spring(非 springboot)應用程序,並對 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 中有模塊替換作為官方依賴項(請參閱用 Java EE API 替換已棄用的 JPMS 模塊)。

確保這些模塊替換“提供”了 scope 以避免出現類轉換異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM