7

Mavenに、正しくコンパイルされるマルチモジュールプロジェクトがありますが、正しくパッケージ化されていません。

メインのMavenpom.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を移動せずにこれを修正するにはどうすればよいですか?

ありがとう

4

1 に答える 1

14

まず、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}を使用する必要があります!!

1つのステップで2つのレベルにジャンプしないことをお勧めします...プロジェクトの構造を次のように変更する必要があります。

/
+- 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との戦闘を開始し、戦闘を失います。

于 2012-06-28T15:35:31.950 に答える