模块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

上一篇: module maven project with nested modules

下一篇: Mercurial: how to amend the last commit?