【问题标题】:Java 8 to Java 9 migration optimal way for mavenised projectJava 8 到 Java 9 迁移 mavenised 项目的最佳方式
【发布时间】:2018-12-31 17:53:09
【问题描述】:

我正在将我的项目从 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 放入其中,这样它甚至可以工作。

【问题讨论】:

  • 首先请显示您的 pom 文件和您的代码以及为什么喜欢有单独的模块目录?为什么你认为你需要在模块目录中复制特定的 deps?为什么你认为 Maven 应该读取 module-info 文件?听起来你可能误解了 module-info / pom.xml 文件的概念?
  • 为什么你认为你不能相信 maven 会为你做依赖管理并将工件放在它们所属的地方?
  • 注意:Java 9 自 2018 年 3 月起已不再支持。 Java 9 应该被“跳过”……它破坏了很多东西。选择 Java 10 会更容易,它的支持将于 9 月结束,届时迁移到 Java 11(这是一个 LTS 版本)应该不是问题。无论如何:根本不考虑 Java 9,选择 Java 10。
  • @jwenting:maven 也将 .m2/repository 作为自动模块。我无法弄清楚 module-dir maven 默认使用什么来解析模块所需的依赖项
  • @GiacomoAlzetta:我不同意你的建议。跳过 Java 9 并直接从 Java 8 迁移到 Java 10 会使迁移(稍微)更加复杂,因为您在同一迁移中面临 Java 9 的 Java 10 的挑战,却不知道任何特定问题来自哪里.我绝对建议逐个版本进行。

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


【解决方案1】:

我假设您正在努力确保 Maven 在模块和类路径方面“做正确的事”,即将模块的直接依赖关系放在前者上,而将所有其他依赖关系放在后者上。如果是这样,您无需执行任何操作 - 从 3.7 版开始,只要您将 module-info.java 添加到您的 src/main/java 目录,Maven 编译器插件就会为您执行此操作。

您可以使用mvn clean compile -X 在调试模式下运行 Maven 来验证这一点。当您仔细分析输出时,您会看到哪些 JAR 最终在哪个路径上。

【讨论】:

  • 您也可以使用--show-module-resolution 找出模块路径中解析的模块。
  • @Nicolai +1 不知道:|这是个好消息。附言有趣的是你没有金徽章,刚才注意到了,即使你想要其中的一些
  • 通过 mvn clean compile -x 选项检查后,我可以看到 maven 默认将所有 jar 添加到 .m2/repository 中,这些 jar 符合 module-path 中的模块,这样我们没有明确提及 module-path 。同样经过谷歌搜索,这是 Maven 用于将 jar 限定为模块的逻辑 Maven 将 jar 提供给 JDK ModuleFinder 如果 ModuleFinder 将 Jar 视为模块,则 Maven 将 Jar 添加到 --module-path 如果 ModuleFinder 不考虑Jar 作为一个模块 Maven 将它添加到 -classpath
猜你喜欢
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 2011-05-09
  • 2020-09-29
  • 2015-02-21
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多