gpt4 book ai didi

maven - 如何使用嵌套模块打包多模块 maven 项目

转载 作者:行者123 更新时间:2023-12-04 13:53:00 26 4
gpt4 key购买 nike

我在 Maven 中有一个可以正确编译但没有正确打包的多模块项目。

在主 maven pom.xml ,我包括这样的模块:

<modules>
<module>module1</module>
<module>module1/test</module>
<module>module2</module>
<module>module2/test</module>
...
<module>moduleN</module>
<module>moduleN/test</module>
</modules>

与 maven 约定不同,该项目必须将其测试源代码树编译为单独的模块,因为测试代码的编译依赖项与主源代码的依赖项不同。因此解决方案是将所有测试模块设置为依赖于任何主要源模块,以确保它们以正确的顺序编译。

这个项目的目录结构非常不标准。我已将 pom.xml 放置在我认为它们所属的位置。虽然我无法更改此目录结构 - 它超出了我的控制范围。它是这样的:
/
+- pom.xml
+- module1/
+- pom.xml
+- src/
+- com/
+- company/
+- Module1.java
+- test/
+- pom.xml
+- src/
+- com/
+- company/
+- Module1Test.java
...

这是常规源模块的 pom.xml 的样子。这完美地工作:
<?xml version="1.0" encoding="UTF-8"?>
<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.company</groupId>
<artifactId>project</artifactId>
<version>5.3.1-SNAPSHOT</version>
</parent>

<artifactId>module1</artifactId>
<packaging>jar</packaging>

<dependencies>
<dependency>
<groupId>com.company</groupId>
<artifactId>modulex</artifactId>
<version>${product.version}-SNAPSHOT</version>
</dependency>
</dependencies>

<build>
<finalName>${project.artifactId}</finalName>
<sourceDirectory>src</sourceDirectory>

<directory>target</directory>
<outputDirectory>target/classes</outputDirectory>
<testOutputDirectory>target/test-classes</testOutputDirectory>

...
</build>

</project>

这是一个测试模块的 pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<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.company</groupId>
<artifactId>project</artifactId>
<version>5.3.1-SNAPSHOT</version>

<!-- I was forced to do this because this module was 2 levels deep -->
<relativePath>../../pom.xml</relativePath>
</parent>

<artifactId>module1.test</artifactId>
<packaging>jar</packaging>

<dependencies>
<dependency>
<groupId>com.company</groupId>
<artifactId>module1</artifactId>
<version>${product.version}-SNAPSHOT</version>
</dependency>
</dependencies>

<build>
<finalName>${project.artifactId}</finalName>
<sourceDirectory>src</sourceDirectory>
<testSourceDirectory>src</testSourceDirectory>

<directory>target</directory>
<outputDirectory>target/classes</outputDirectory>
<testOutputDirectory>target/test-classes</testOutputDirectory>

...
</build>

</project>

但是,由于测试模块是主模块的子目录,因此一旦尝试打包 module.test,就会出现以下错误:
[ERROR] Failed to execute goal on project module1.test: Could not resolve dependencies for project com.company:module1.test:jar:5.3.1-
SNAPSHOT: Could not find artifact com.company:module1:jar:5.3.1-SNAPSHOT in repo1.maven.org (http://repo1.maven.org/maven2/) -> [Help 1]

出于某种原因,Maven 认为它需要从存储库中获取这个 jar,即使它之前只是构建了它......

我是否需要像其他人一样将 module1/test 中的 pom.xml 移动到父级别?如何在不移动 pom.xml 的情况下解决此问题?

谢谢

最佳答案

首先,在 Maven 中,生产代码和测试代码有不同的文件夹。

src/main/java

src/test/java

此外,src/main/java 中的代码将由 maven-compiler-plugin 编译,其目标是:编译,而测试代码 src/test/java 也将由 maven-compiler-plugin 编译,但其目标是:testCompile .

如果您有不同的测试和生产依赖项,您可以定义一个范围以及依赖项,如下所示:
   <dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.2.1</version>
<scope>test</scope>
</dependency>

这意味着这将仅在测试代码区域内可用,并且不会被打包。
如果您不定义范围:
   <dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.2.1</version>
</dependency>

这是一个用于生产的依赖项,如果你有像“war”这样的打包类型,它将被打包。

我见过这样的事情,我认为这是一个错字:
<dependencies>
<dependency>
<groupId>com.company</groupId>
<artifactId>modulex</artifactId>
<version>${product.version}-SNAPSHOT</version>
</dependency>
</dependencies>

这是完全错误的,因为你必须使用:
  <dependencies>
<dependency>
<groupId>com.company</groupId>
<artifactId>modulex</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>

${product.version} 没有定义,你应该使用 ${project.version} 来代替!!

我建议不要在一个步骤中跳过两个级别...
您应该像这样更改项目的结构:
/
+- pom.xml
+- module1/
+- pom.xml
+-- module1-src
+- pom.xml
+- src/main/java
+- com/
+- company/
+- Module1.java
+-- module1-test
+- pom.xml
+- src/
+- com/
+- company/
+- Module1Test.java
...

基于上述结构,您将获得如下信息:
<modules>
<module>module1</module>
<module>module2</module>
...
<module>moduleN</module>
</modules>

在模块1中:
<modules>
<module>module1-src</module>
<module>module1-test</module>
</modules>

否则,您将开始与 Maven 战斗,您将失去战斗。

关于maven - 如何使用嵌套模块打包多模块 maven 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11244453/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com