Java 8 到 Java 9 mavenised 项目的最佳迁移方式
Java 8 to Java 9 migration optimal way for mavenised project
我正在将我的项目从 Java 8 迁移到 Java 9。我的项目已经过 mavenised。现在迁移到 Java 9,我计划创建一个单独的模块目录,模块的所有必需依赖项都将放在其中。
对于通过maven 执行此操作,我知道的唯一方法是使用maven 的复制插件将所有必需的依赖项复制到模块目录中。因此,在 运行 maven 为模块安装后,依赖的 jar 将被复制到存储库文件夹中(默认情况下),同时也会复制到该模块目录文件夹中。
所以在 pom.xml 中会有一个 jars 的副本和硬编码,用于在模块目录中复制特定的依赖项。
这种方法似乎不干净,有没有什么办法可以让 maven 自动读取我的模块-info.java 文件并复制所需的依赖项,而不是在类路径中,而是在指定目录中
这是我的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.aa.bb</groupId>
<artifactId>cc</artifactId>
<version>0.0.1</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>dd</artifactId>
<name>dd</name>
<groupId>com.aa.cc</groupId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>10</maven.compiler.source>
<maven.compiler.target>10</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.11</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<release>10</release>
<compilerArgs>
<arg>--module-path</arg>
<arg>./moduledir</arg>
</compilerArgs>
</configuration>
<dependencies>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>6.2</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
模块-info.java
module com.some_module_name {
requires com.fasterxml.jackson.core;
requires com.fasterxml.jackson.databind;
requires org.apache.commons.codec;
requires spring.beans;
requires spring.context;
}
将模块-[=43=] 添加到现有的 java 10 模块和 运行 maven 后,我遇到了类似 "package exist is used in module a and module b" 的问题。
我认为 运行 Maven 正在 .m2/repository 中寻找模块依赖关系,并且那里有大量 jar,因为 m2./repository 对于我的多个模块很常见。
所以我打算做的是为每个模块创建一个单独的模块目录,并将该模块所需的 jar 放入其中,甚至可以工作。
我假设您正在努力确保 Maven "does the right thing" 关于模块和 class 路径,即将您的模块直接依赖于前者,而所有其他依赖于后者.如果是这样,您无需执行任何操作 - 从 3.7 版开始,只要您将 module-info.java
添加到 src/main/java
目录,Maven 编译器插件就会为您完成。
您可以通过 运行 Maven 在调试模式下使用 mvn clean compile -X
验证这一点。当您仔细分析输出时,您会看到哪些 JAR 最终位于哪条路径上。
我正在将我的项目从 Java 8 迁移到 Java 9。我的项目已经过 mavenised。现在迁移到 Java 9,我计划创建一个单独的模块目录,模块的所有必需依赖项都将放在其中。
对于通过maven 执行此操作,我知道的唯一方法是使用maven 的复制插件将所有必需的依赖项复制到模块目录中。因此,在 运行 maven 为模块安装后,依赖的 jar 将被复制到存储库文件夹中(默认情况下),同时也会复制到该模块目录文件夹中。
所以在 pom.xml 中会有一个 jars 的副本和硬编码,用于在模块目录中复制特定的依赖项。
这种方法似乎不干净,有没有什么办法可以让 maven 自动读取我的模块-info.java 文件并复制所需的依赖项,而不是在类路径中,而是在指定目录中
这是我的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.aa.bb</groupId>
<artifactId>cc</artifactId>
<version>0.0.1</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>dd</artifactId>
<name>dd</name>
<groupId>com.aa.cc</groupId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>10</maven.compiler.source>
<maven.compiler.target>10</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.11</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<release>10</release>
<compilerArgs>
<arg>--module-path</arg>
<arg>./moduledir</arg>
</compilerArgs>
</configuration>
<dependencies>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>6.2</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
模块-info.java
module com.some_module_name {
requires com.fasterxml.jackson.core;
requires com.fasterxml.jackson.databind;
requires org.apache.commons.codec;
requires spring.beans;
requires spring.context;
}
将模块-[=43=] 添加到现有的 java 10 模块和 运行 maven 后,我遇到了类似 "package exist is used in module a and module b" 的问题。
我认为 运行 Maven 正在 .m2/repository 中寻找模块依赖关系,并且那里有大量 jar,因为 m2./repository 对于我的多个模块很常见。
所以我打算做的是为每个模块创建一个单独的模块目录,并将该模块所需的 jar 放入其中,甚至可以工作。
我假设您正在努力确保 Maven "does the right thing" 关于模块和 class 路径,即将您的模块直接依赖于前者,而所有其他依赖于后者.如果是这样,您无需执行任何操作 - 从 3.7 版开始,只要您将 module-info.java
添加到 src/main/java
目录,Maven 编译器插件就会为您完成。
您可以通过 运行 Maven 在调试模式下使用 mvn clean compile -X
验证这一点。当您仔细分析输出时,您会看到哪些 JAR 最终位于哪条路径上。