我在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的情况下修复此问题?
由于
答案 0 :(得分:7)
首先,在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战斗,在那里你将失去战斗力。