2009-11-20 4 views
71

수용체 테스트를위한 프로젝트를 작성 중이며 다양한 이유로이 프로젝트는 WAR로 패키지 된 다른 프로젝트에 의존합니다. 나는 maven-dependency-plugin을 사용하여 WAR의 압축을 풀었지만, 패키지 파일을 풀어서 클래스 패스에 포함되도록 WEB-INF/lib/*.jarWEB-INF/classes/*을 포함시킬 수 없다. 그래서 빌드가 실패한다. 이 파일을 클래스 경로에 포함시키는 방법이 있습니까? 아니면 WAR에 의존하는 더 좋은 방법이 있습니까?Maven WAR 의존성

감사합니다.

답변

11

overlays을 사용하십시오. 첫째, 테스트 프로젝트에는 war 패키징이 있어야합니다.

테스트 할 전쟁 프로젝트의 의존성을 선언 : (테스트 프로젝트에서 위의 예에서

<plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-war-plugin</artifactId> 
     <configuration> 
      <webResources> 
       <resource> 
        <directory>${basedir}/src/main/webresources</directory> 
        <filtering>true</filtering> 
       </resource> 
      </webResources> 
      <overlays> 
       <overlay/> 
       <overlay> 
        <groupId>your.group</groupId> 
        <artifactId>your-project-artifactId</artifactId> 
       </overlay> 
      </overlays> 
     </configuration> 
    </plugin> 

내가 webresources 구성 파일을 덮어 쓰기 :

<dependency> 
    <groupId>${project.groupId}</groupId> 
    <artifactId>your-project-arftifactId</artifactId> 
    <version>${project.version}</version> 
    <type>war</type> 
    <scope>test</scope> 
</dependency> 

다음 받는다는 전쟁 - 플러그인 오버레이를 구성 병음 같이.

편집 : 전쟁 프로젝트의 종속성으로 선언의이 솔루션은 메이븐 3.

+1

내가이 부결 :

<plugin> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> <configuration> <attachClasses>true</attachClasses> </configuration> </plugin> 

이것은 당신이 수락 테스트 프로젝트에서 사용할 수있는 클래스 이슈를 생성합니다. 나는 이것이 Maven3을 사용하고 있기 때문에 있는지 모르지만 실제로/myclass와/lib 폴더는 다중 WAR 의존성을 통해 전이 적으로 포함된다. 다시 - 투표 해 죄송합니다. 분명히 이것은 "올바른"대답입니다. – HDave

21

테스트되지는 사실, 디자인, 메이븐 이적 종속성을 해결되지 않습니다. 실제로 그 문제는 MNG-1991이지만 Maven 2.x에서는 해결되지 않으며 확신 할 수 없습니다. 오버레이가이 문제를 해결할 수 있는지 잘 모르겠습니다. 제안 된 솔루션에 대한 필자의 이해는 pom 형식의 프로젝트와 같이 종속성을 복제하는 것입니다.


(편집 : 마지막에 걸쳐

내가 AppFuse에 프로젝트의 개발을 도와되었습니다 좀 더 파고 후, 나는 아래에 인용하고있어 this thread에서 뭔가 흥미로운 것을 발견 나는 출전 플러그인 을 개발 한 달 어디에 우리가 메이븐 전쟁 플러그인 전쟁 오버레이 기능을 많이 사용합니다. 그것은 정말 멋진 기능입니다!

전쟁 오버레이로 최대 전력을 얻기 위해 그 프로젝트가 전쟁 유물을 완전히 본격적인 의존성으로 사용할 수있게합니다. 간단히 :

1) 유물, 등 작업 정상적인 컴파일에 대한 프로젝트의 클래스 경로에 포함 할 수있는 전쟁 의존성의/WEB-INF/classes 디렉토리의 내용.
2) 전쟁 의존성 아티팩트의 전이 종속성이 이되어 다른 플러그인에서 사용할 수 있습니다. 컴파일 및 귀 - 그럼 더 이상 마른 전쟁을 만들 때 모든 종속성을 포함해야!

플러그인은 이제 지난 몇 달 간 에 대한 AppFuse 프로젝트에서 활발하게 사용되어 왔으며, 그것이 유용하고 안정적인 지점에 있다고 생각합니다. war 플러그인 팀이 warpath 기능을 war 플러그인에 포함시키는 데 관심이 있으십니까? 그것을 접대하는 것은 가장 자연적인 장소 인 것처럼 보일 것입니다.

따라서 경험이 없지만 maven warpath plugin은 실제로 멋지고 단순하며 중앙 저장소에서 사용할 수 있습니다.

[...] 
<dependencies> 
    <dependency> 
    <groupId>org.appfuse</groupId> 
    <artifactId>appfuse-web</artifactId> 
    <version>2.0</version> 
    <type>war</type> 
    </dependency> 
    <dependency> 
    <groupId>org.appfuse</groupId> 
    <artifactId>appfuse-web</artifactId> 
    <version>2.0</version> 
    <type>warpath</type> 
    </dependency> 
</dependencies> 
[...] 

모두 전쟁 : 당신이 출전 유형의 종속성과 같은 클래스 패스에 포함 할 전쟁 종속성을

[...] 
<build> 
    <plugins> 
    <plugin> 
     <groupId>org.appfuse</groupId> 
     <artifactId>maven-warpath-plugin</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <extensions>true</extensions> 
     <executions> 
     <execution> 
      <goals> 
      <goal>add-classes</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 
[...] 

그리고 추가를 사용하려면 pom.xml 파일에 다음과 같은 플러그인 구성 요소를 포함 전쟁 유형은 전쟁 오버레이를 수행하기 위해 Maven 전쟁 플러그인에 의해 사용되며 warpath 유형은 프로젝트 클래스 경로에 포함 할 올바른 인공물 목록을 결정하기 위해 Warpath 플러그인에 의해 사용됩니다.

나는 그것을 시도를 줘야 할 것.)

+1

파스칼, 내 프로젝트에서 다른 서버 (하나의 서버에 대한 각 모듈)에서 통합 테스트를 실행하기위한 별도의 모듈이 있습니다. 이러한 테스트 모듈에는 테스트 클래스가 있으며 war 및 overlay의 종속성을 사용합니다. 나는 위대한 일을한다. – cetnar

+0

글쎄, 내가 쓴 것처럼, 잘 모르겠다. 피드백에 감사 드리며, 알아두면 좋다. 당신은 전쟁의 전이 종속성과 전쟁의 자바 클래스뿐만 아니라 작동하는지 확인할 수 있습니까? –

+0

예. 작동합니다. WEB-INF \ lib의 모든 라이브러리가 복사됩니다. – cetnar

-1

가 픽업 필요한 항아리/자원을 보인다 종속성이 항아리로 전쟁 프로젝트에 대한 종속성을 표시합니다. Maven 2.2 + m2eclipse를 사용하고 있습니다.

4

좋은 지적, 저스틴. 그게 내 문제를 실제로 해결해주었습니다. 즉 어셈블리에 전쟁을 포함하고 모든 전이 종속성을 포함합니다. 나는 유형 치어으로 전쟁 의존성을 복제 조립 플러그인이의 groupId/artefactId에 의해 참조 항아리를 찾을 것이기 때문에 당신이 제안 '항아리'와 같은 전쟁 의존성을 복제하지만

  • 없습니다

작품! 전쟁 및 그 전이 종속성은 어셈블리에 포함되어 있지 않습니다. 내 assembly.xml 파일로

<excludes> 
    <exclude>*:pom</exclude> 
    </excludes> 

: 내가이 같은 배제 요소를 추가했다 (현재도 나타나는) 치어 파일을 제외합니다.

이 스레드의 원래 질문에 대한 해결 방법이 될 수도 있다고 생각합니다.

101

maven-war-plugin 2.1-alpha-2 이후 다른 옵션이 있습니다. 당신의 WAR 프로젝트에서 : 나는 그것을 테스트하기 전에

<dependency> 
    <groupId>your-group-id</groupId> 
    <artifactId>your-artifact-id</artifactId> 
    <version>your-version</version> 
    <classifier>classes</classifier> 
</dependency> 
+5

나에게있어서이 문제는 단지 전이 의존성을 끌어 내지 않는다는 것입니다. – hertzsprung

+1

예,이 힌트를 주셔서 감사합니다 :) 그것은 부분적으로 저에게 도움이되었습니다. maven 명령 줄을 사용하면 모든 것이 정상입니다. Eclipse에서 maven (m2e)을 사용하면 전쟁에서 클래스를 참조하는 테스트 빌드도 괜찮습니다.하지만 테스트 (junit)를 실행하려고 할 때 작동하도록 m2e 작업 영역 해상도를 해제해야합니다. 그렇지 않으면 junit 실행은 전쟁의 참조 된 클래스에 대해 ClassNotFoundException을 발생시킵니다. 어떻게 든 그것들은 junit 실행 클래스 경로에 포함되지 않습니다. 전쟁 프로젝트는 프로젝트의 빌드 경로에있는 maven 종속성 라이브러리 아래에 나열되어 있습니다. 어떤 생각? – Gandalf

+1

의존성의 pom을 프로젝트의 종속성으로 추가하여 전이 의존성을 얻을 수 있습니다. 클래스에 의존성이있는 경우 –

관련 문제