다중 모듈 프로젝트의 Maven 테스트 종속성


86

멀티 모듈 프로젝트를 빌드하기 위해 maven을 사용합니다. 내 모듈 2는 컴파일 범위의 모듈 1 src와 테스트 범위의 모듈 1 테스트에 의존합니다.

모듈 2-

   <dependency>
       <groupId>blah</groupId>
       <artifactId>MODULE1</artifactId>
       <version>blah</version>
       <classifier>tests</classifier>
       <scope>test</scope>
   </dependency>

이것은 잘 작동합니다. 내 모듈 3이 Module1 src에 의존하고 컴파일 타임에 테스트한다고 가정하십시오.

모듈 3-

   <dependency>
       <groupId>blah</groupId>
       <artifactId>MODULE1</artifactId>
       <version>blah</version>
       <classifier>tests</classifier>
       <scope>compile</scope>
   </dependency>

를 실행 mvn clean install하면 내 빌드가 모듈 3까지 실행되고 모듈 1 테스트 종속성을 해결할 수 없어 모듈 3에서 실패합니다. 그런 다음 mvn install모듈 3에서만 수행하고 돌아가서 mvn install부모 pom에서 실행 하여 빌드합니다. 이 문제를 어떻게 해결할 수 있습니까?


부모님 pom이 어떻게 생겼는지 공유해 주시겠습니까?
Chris Gummer

답변:


127

무엇을 하려는지 의심 스럽지만 프로젝트 (module1)를 위해 만든 테스트를 다른 프로젝트에서 재사용하고 싶다고 가정합니다. 첨부 된 테스트 사용에 대한 가이드 하단의 메모에 설명되어 있습니다 .

이 가이드의 이전 버전 <classifier>tests</classifier>에서는 <type>test-jar</type>. 이것은 현재 일부 경우에 작동하지만 설치 전 라이프 사이클 단계가 호출되면 테스트 JAR 모듈 및 소비자의 리액터 빌드 중에 제대로 작동하지 않습니다. 이러한 시나리오에서 Maven은 리액터 빌드의 출력이 아닌 로컬 / 원격 저장소에서 테스트 JAR을 확인합니다. 분명히 저장소의 JAR이 오래되었거나 완전히 누락되어 빌드 실패를 일으킬 수 있습니다 (참조 : MNG-2045 ).

따라서 먼저 컴파일 된 테스트를 JAR로 패키징하고 일반적인 재사용을 위해 배포하려면 maven-jar-plugin다음과 같이 구성합니다 .

<project>
  <build>
    <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-jar-plugin</artifactId>
       <version>2.2</version>
       <executions>
         <execution>
           <goals>
             <goal>test-jar</goal>
           </goals>
         </execution>
       </executions>
     </plugin>
    </plugins>
  </build>
</project>

그런 다음 평소와 같이 테스트 JAR 아티팩트를 설치 / 배포합니다 ( mvn install또는 사용 mvn deploy).

마지막으로 테스트 JAR을 사용하려면 지정된 유형의 종속성을 지정해야합니다 test-jar.

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>com.myco.app</groupId>
      <artifactId>foo</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>test-jar</type>
      <scope>test</scope>
    </dependency>
  </dependencies>
  ...
</project>

3
파스칼. 우선 모든 메이븐 질문에 답 해주셔서 감사합니다 !! 이 질문에 대해. 여전히 문제가 있습니다. 모든 자식 개체에서 사용하려는 핵심 모듈 중 하나에 testBase 클래스가 있습니다. 현재 CI에 maven 빌드가 있습니다. test-jar에 배포를 설치하고 싶지 않고 트렁크에서 새 복사본을 확인하고 mvn 테스트를 실행하려면. 아직 테스트 항아리가 없기 때문에 실패합니다. 어떻게 처리해야하는지 아십니까?
Roman

@Roman 실행 설치는 "자연스러운"방법입니다. 하지만 해결 방법을 찾은 것 같습니다.
Pascal Thivent

이 시점에서 보류 된 것은 2045 년이 아닌 3559 호인 것
HDave

이것이 무슨 일이 일어나고 있는지 설명하지만 해결 방법을 제공하지는 않습니다. 그것은 단지 OP (그리고 예를 들어 I)가 이미하고있는 것을하는 것을 제안합니다.
Antoniossss

19

Pascals 질문에 대한 내 의견과 관련하여 나는 어리석은 대답을 찾은 것 같습니다.

<plugins>
    <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.2</version>
        <executions>
            <execution>
            <goals>
                <goal>test-jar</goal>
            </goals>
            <phase>test-compile</phase>
        </execution>
        </executions>
        <configuration>
            <outputDirectory>${basedir}\target</outputDirectory>
        </configuration>
    </plugin>
</plugins>

여기에서 볼 수있는 주요 차이점은 <phase>태그입니다.

나는 test-jar를 만들 것이며, 패키지 단계 이후뿐만 아니라 테스트의 컴파일 단계에서 사용할 수있을 것입니다.

나를 위해 작동합니다.


1
예, 매우 편리합니다. 공유해 주셔서 감사합니다. 배포 방법은 회사 디렉터리가있을 때만 더 낫다고 생각합니다 (예, 이것이 강력히 권장된다는 것을 압니다). 감사합니다 @Roman
Damien

2

https://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.html 은 다음과 같이 말합니다.

테스트 클래스를 포함하는 jar를 만드는 방법 테스트 클래스를 포함하는 jar를 만들려면 해당 클래스를 다시 사용하고 싶을 것입니다. 이 문제를 해결하는 방법에는 두 가지가 있습니다.

  1. The easy way 현재 프로젝트의 테스트 클래스로 연결된 jar를 만들고 전이 테스트 범위 종속성을 풉니 다.

  2. The preferred way 테스트 클래스로 별도의 프로젝트를 만듭니다.

자세한 내용은 해당 기사를 읽으십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.