Java 8 到 Java 9 迁移 mavenised 项目的最佳方式

标签 java maven java-9 java-10 java-platform-module-system

我正在将我的项目从 Java 8 迁移到 Java 9。我的项目已经过 mavenised。现在为了迁移到 Java 9,我计划创建一个单独的模块目录,模块的所有必需依赖项都将放在该目录中。

要通过 maven 执行此操作,我知道的唯一方法是使用 maven 的复制插件将所有必需的依赖项复制到模块目录中。因此,在为模块运行 maven 安装后,依赖的 jar 将被复制到存储库文件夹中(默认情况下),同时也会复制到该模块目录文件夹中。

因此将有一个 jars 的副本以及 pom.xml 中的硬编码,用于复制模块目录中的特定依赖项。

这种方法似乎并不干净,有没有什么办法可以让 maven 自动读取我的 module-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>

module-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;

}

将 module-info.java 添加到现有 java 10 模块并运行 maven 后,我遇到类似“模块 a 和模块 b 中使用了包存在”的问题。

我认为在运行 maven 时它正在寻找 .m2/repository 中的模块依赖关系,并且那里有大量 jar,因为 m2./repository 对于我的多个模块是通用的。

所以我打算做的是为每个模块创建一个单独的模块目录,并将该模块所需的 jar 放入其中,这甚至可以工作。

最佳答案

我假设您正在努力确保 Maven 在模块和类路径方面“做正确的事”,即将您的模块直接依赖于前者,而所有其他依赖于后者。如果是这样,您无需做任何事情 - 从 3.7 版开始,只要您将 module-info.java 添加到 src/main,Maven Compiler Plugin 就会为您完成/java 目录。

您可以通过使用 mvn clean compile -X 在 Debug模式下运行 Maven 来验证这一点。当您仔分割析输出时,您会看到哪些 JAR 最终位于哪条路径上。

关于Java 8 到 Java 9 迁移 mavenised 项目的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51493016/

相关文章:

java - Java 工具用于自动从 jar 名称派生模块名称的算法

java - 您可以在多个线程上启动 Spring Boot Rest 应用程序吗?

java - 如何运行 JShell 文件?

java - Bukkit 前缀和后缀

javascript - 如何停止默认插件执行?

maven - jar文件的目的在汤姆·怀特(Tom White),第四版的 “Hadoop”书中提到过吗?

maven - 使用运行 thor 脚本的 Exec Maven 插件构建失败

Java 9、Jigsaw 和自动模块

java - 我们可以在 Java 8 中使用流来合并这三个嵌套的 for 循环吗?

java - 删除chrome浏览器的cookies和缓存