模块maven项目与嵌套模块
我有一个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>
这是一个用于生产的依赖项,如果你有像“战争”这样的打包类型,它将被打包。
我看到过这样的事情,我认为是一个错字:
<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>
并在module1中:
<modules>
<module>module1-src</module>
<module>module1-test</module>
</modules>
否则,你会开始与Maven战斗,从而放弃战斗。
链接地址: http://www.djcxy.com/p/6411.html