2013-08-29 4 views
3

maven으로 빌드 된 다중 모듈 프로젝트가 있습니다. 매일 프로젝트의 통합 테스트를 실행해야합니다. 런타임에 모듈 내에서 정의 된 통합 테스트가 순환 종속성을 가지기 때문에 표준 메이븐 빌드주기 중에는이 작업을 수행 할 수 없습니다. 순환 의존성은 내가 자신의 폼에 선언하는 것은 불법입니다.maven-ant-task가있는 다중 모듈 프로젝트의 통합 테스트를위한 클래스 경로를 얻습니다.

대신 모든 모듈 jar 및 테스트 - jars를 종속성으로 나열하는 Global이라는 별도의 프로젝트를 만들었습니다. 전역 모듈은 모든 모듈과 동일한 상위 모듈을가집니다. 아이디어는 maven-ant-tasks를 사용하여 모든 모듈 jar와 test-jars의 classpath를 얻고 거기에서 계속 진행할 수있을 것이라는 것입니다.

<dependency> 
    <groupId>mygroup</groupId> 
    <artifactId>A</artifactId> 
    <version>${project.version}</version> 
</dependency> 
<dependency> 
    <groupId>mygroup</groupId> 
    <artifactId>A</artifactId> 
    <version>${project.version}</version> 
    <type>test-jar</type> 
    <scope>test</scope> 
</dependency> 

<dependency> 
    <groupId>mygroup</groupId> 
    <artifactId>B</artifactId> 
    <version>${project.version}</version> 
</dependency> 
<dependency> 
    <groupId>mygroup</groupId> 
    <artifactId>B</artifactId> 
    <version>${project.version}</version> 
    <type>test-jar</type> 
    <scope>test</scope> 
</dependency> 

...etc 

문제는 내가 세계의 pom.xml 파일에 선언 된 모든 항아리와 시험 단지를 포함하는 클래스 경로를 얻이 수없는 것이다 다음과 같이 글로벌의 pom.xml 파일 종속성 섹션입니다 (및 해당 런타임 종속성)을 사용할 수 있습니다. 나는 (다른 것들 중에서) 시도했다 :

<dependencies pathId="cp1" type="jar" usescope="runtime"> 
    <pom file="${basedir}/pom.xml"> 
     <profile id="DEV" /> 
    </pom> 
</dependencies> 

[1] 이것은 모든 런타임 의존성을 가져온다. 그게 잘못된 것은 아닙니다.

<dependencies pathId="cp2"> 
    <dependency groupId="mygroup" artifactId="Global" version="myVersion" scope="test" type="test-jar"/> 
</dependencies> 

[2] 이것은 Global-myversion-tests.jar와 함께 모든 런타임 종속성을 가져 오지만 다른 테스트 - 병은 가져 오지 않습니다.

<dependencies pathId="cp3" type="test-jar" usescope="test"> 
    <pom file="${basedir}/pom.xml"> 
     <profile id="DEV" /> 
    </pom> 
</dependencies> 

[3] 이것은 아무것도 가져 오지 않습니다.

물론 [각 모듈에 대해 [2]와 같이 선언하면 트릭을 수행 할 수 있지만 새 모듈을 추가하거나 제거 할 때마다 gazillion 파일을 편집 할 필요가없는 설치 프로그램을 만들려고합니다. BTW 나는 maven-ant-task-2.1.3을 사용하고있다.

입력 해 주셔서 감사합니다.

은 ---

당신은 이제까지 내가 받는다는 빌드를 위해 뜻 가정 순환 종속성이

이 안 --- @yannisf 받아 대답을 편집합니다. 때 CoolerDms 모듈 B에 DMS 시스템 변경 수 (UploadToCoolDms 미래에 그런 식으로 : UploadToDocumentManagementSystem

모듈 B에서 구현 :

모듈 A는 인터페이스가 선언 : 런타임에 순환 종속성을 갖는 것은 예를 들어, 매우 일반적입니다 앱의 나머지 부분에 부작용이없는 새로운 구현으로 대체 될 수 있음).

모듈 B는 컴파일 시간에 따라 (정의에 의해, 실행뿐만 아니라)은

모듈 A는

메이븐이 선언 할 수없는 런타임에 B에 의존한다. 필자가 공감할 수있는 이유는 다중 모듈 프로젝트의주기 (테스트 포함)를 특정 순서로 완료해야한다는 것입니다. 그것은 A의 테스트를 위해 B에 대한 런타임 의존성을 없애면 실제로 선언 할 필요가 없습니다 (이는 우수 사례이며 어쨌든 반드시 발생해야 함).

당신은 대신 충분히

공정 개미 작업에 의존의 것들을 받는다는 방법을해야, 나는 받는다는 - 개미 - 작업이 사용하기 위해 만들어지지 방식을 볼 수 있습니다. 글로벌 치어에서

당신은

인가 (항아리, 테스트 항아리) 같은 유물 듀얼 타입을 선언하는 일반적인 문제인가? 예를 들어 모듈 A에는 모듈 B의 테스트에도 사용하려는 테스트 용 샘플이 들어 있습니다. B가 A jar (컴파일 범위)와 A test-jar (테스트 범위)에 의존한다고 선언하는 것은 잘못된 것입니다. 통합 테스트 프로젝트는 단위 테스트뿐만 아니라 동일한 모듈의 샘플 및 리소스를 사용하여 모듈을 사용하는지 정당화 할 수 있습니까?

tl; dr version : 나는 모듈에서 선언 된 테스트를 재정렬하고 통합 테스트를 위해 별도의 모듈을 만들려고합니다 (20 명의 개발자가 공을 가질 수 있다고 가정). 대답 해 주셔서 고맙습니다. 패배를 인정하고 프로젝트를 메이븐과 함께 작업하는 대신 메이븐이 프로젝트와 작업하도록하기 위해 그만 두십시오. :).

답변

2

여러 가지 방법으로 메이븐 규칙을 위반하려고합니다. 1.주기적인 의존성을 가지면 안됩니다. 2. 개미 작업에 의존하는 대신에 일을해야합니다. 3. 글로벌 pom에서 같은 아티팩트 (jar, test-jar)에 대해 이중 유형을 선언하고 있습니다.

처음에는이 질문에 대한 답을 얻지 못했지만 한 발 뒤로 물러나서 레이아웃을 다시 생각해보십시오. 통합 테스트는 모든 종속성을 필요로하며 단위 테스트보다 훨씬 까다로운 작업입니다. 그래서, 기존 프로젝트에 그것들을 넣으려고하는 대신 같은 그룹에 별도의 maven 프로젝트를 만들고, src/java/test 밑에 통합 테스트만을 호스트 할 것이고, main은 비어있을 것이다. 프로젝트.

+0

충분합니다. 이것은 3 년 전의 프로젝트였습니다. 'mavenized'했기 때문에 실제로 기동 할 공간이별로 없었습니다. 시간을내어 주셔서 감사합니다. – dkateros

+0

허용. 나는 질문 끝에 약간의 편집을했다. 나는 너를 빨리 보게되어서 고맙다. 다시 한번 감사드립니다. – dkateros

+0

[1] 런타임 의존성 "모듈 A는 런타임에 B에 종속됩니다"는 인터페이스의 구현을 "자동 감지"(또는 봄의 경우 XML 읽기) 할 컨테이너에 의해 수행되는 느슨한 종속성입니다. 컴파일 시간 의존성은 중요하며, maven은주기를 받아들이지 않습니다. 비록 당신이 메이븐을 속이더라도, 깨지기 쉽고, 유지하기가 어렵고 정통 적이 지 않을 것입니다. [2] 멋지다. [3] 테스트의 공통 부분은 다른 모든 프로젝트에서 테스트 종속성으로 포함될 별도의 모듈로 이동하는 것이 좋습니다. – yannisf