Maven WAR 종속성


82

저는 수락 테스트를위한 프로젝트를 작성 중이며 다양한 이유로 WAR로 패키지 된 다른 프로젝트에 의존합니다. 나는 받는다는 - 종속성 플러그인을 사용하여 WAR의 압축을 풀 관리,하지만 난 압축을 푼를 포함하는 내 프로젝트를 얻을 수 WEB-INF/lib/*.jarWEB-INF/classes/*빌드가 실패하도록 클래스 경로에 포함되어야한다. 이러한 파일을 클래스 경로에 포함하는 방법이 있습니까, 아니면 WAR에 의존하는 더 좋은 방법이 있습니까?

감사합니다.

답변:


115

maven-war-plugin 2.1-alpha-2 이후로 또 다른 옵션이 있습니다. WAR 프로젝트에서 :

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

그러면 다음과 함께 수락 테스트 프로젝트에서 사용할 수있는 클래스 아티팩트가 생성됩니다.

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

6
저에게 유일한 문제는 전 이적 종속성을 가져 오지 않는다는 것입니다
hertzsprung

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

1
프로젝트의 종속성으로 종속성의 pom을 추가하여 전 이적 종속성을 얻을 수 있습니다. 당신은 치어의 클래스에와의 의존성 얻을 그래서
요나탄 Cloutier의

이 플러그인은 pom의 <build> 설정으로 이동해야합니다.
MichaelCleverly

제 경우에는 src / main / resources / *가 필요했고 "-classes.jar"에도 포함되어 있습니다-훌륭합니다!
Jonas Berlin

24

실제로 Maven은 설계 상 프로젝트의 종속성으로 선언 된 전쟁의 전 이적 종속성을 해결하지 않습니다. 거기에 대한 문제, 실제로 MNG-1991 있지만 메이븐 2.X에서 해결되지 않고 나는 있는지 모르겠어요 오버레이가이 문제를 해결 할 수 있다면 나도 몰라. 제안 된 솔루션에 대한 나의 이해는 예를 들어 pom 유형의 프로젝트에서 종속성을 복제하는 것입니다.


(편집하다 : 좀 더 파헤친 후, 아래에서 인용하고 있는 이 스레드 에서 흥미로운 것을 발견했습니다 .

저는 지난 달에 Maven 전쟁 플러그인에서 전쟁 오버레이 기능을 많이 사용하는 AppFuse 프로젝트 개발을 돕고 있습니다. 정말 멋진 기능입니다!

전쟁 오버레이로 최대의 힘을 얻기 위해 프로젝트에서 전쟁 아티팩트를 완전한 종속성으로 사용할 수 있도록하는 Warpath 플러그인을 개발했습니다. 간단히 말해서 :

1) war 의존성 아티팩트에있는 / WEB-INF / classes 디렉토리의 내용은 일반 컴파일 등의 작업을위한 프로젝트의 클래스 경로에 포함될 수 있습니다.
2) 전쟁 종속성 아티팩트의 전이 종속성은 다른 플러그인 (예 : 컴파일 및 귀)에서 사용할 수있게되므로 더 이상 스키니 전쟁을 만들 때 모든 종속성을 포함 할 필요가 없습니다!

플러그인은 이제 지난 몇 달 동안 AppFuse 프로젝트에서 적극적으로 사용되었으며, 사용 가능하고 안정적인 시점에 있다고 생각합니다. war 플러그인 팀이 war 플러그인에 warpath 기능을 포함하는 데 관심이 있습니까? 그것을 호스팅하는 가장 자연스러운 장소 인 것 같습니다.

그래서 나는 그것에 대한 경험이 없지만 maven warpath 플러그인은 실제로 멋지고 간단 해 보이며 중앙 저장소에서 사용할 수 있습니다. 이를 사용하려면 pom.xml파일 에 다음 플러그인 구성 요소를 포함하십시오 .

[...]
<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>
[...]

그리고 warpath 유형 종속성으로 클래스 경로에 포함하려는 전쟁 종속성을 추가하십시오 .

[...]
<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>
[...]

war 및 warpath 종속성 유형이 모두 필요합니다. war 유형은 Maven war 플러그인에서 전쟁 오버레이를 수행하는 데 사용되고 warpath 유형은 Warpath 플러그인에서 프로젝트 클래스 경로에 포함 할 올바른 아티팩트 목록을 결정하는 데 사용됩니다.

나는 그것을 시도 할 것입니다.)


1
Pascal, 내 프로젝트에는 다른 서버에서 통합 테스트를 실행하기위한 별도의 모듈이 있습니다 (한 서버에 대한 각 모듈). 이러한 테스트 모듈에는 테스트 클래스가 있으며 전쟁 및 오버레이의 종속성을 사용합니다. 나는 잘 작동합니다.
cetnar 2009

글쎄요, 글쎄요, 잘 모르겠습니다. 피드백에 감사드립니다. 알게되어 기쁩니다. 전쟁의 자바 클래스뿐만 아니라 전쟁의 전 이적 종속성에서도 작동하는지 확인할 수 있습니까?
Pascal Thivent

알았어 고마워. 이제 어떻게 작동하는지 봅니다 (중요한 부분은 두 번째 문장입니다 : 테스트 프로젝트에 패키징 전쟁도 필요함 ).
Pascal Thivent

1
이 플러그인의 문제는 m2eclipse에서 지원하지 않는다는 것입니다 : maven.40175.n5.nabble.com/…
milan

이 플러그인은 또한 Maven 릴리스 및 어셈블리 플러그인을 모두 중단합니다. 둘 다 warpath 플러그인을 사용하는 WAR의 종속성을 해결하려고 시도하기 때문에 Maven은 type = warpath 종속성을 해결할 수 없다고 중단합니다. 안타깝게도 작동하지 않습니다.
HDave 2010

14

오버레이를 사용 합니다 . 첫째, 테스트 프로젝트에는 패키징도 있어야합니다 war.

테스트하려는 전쟁 프로젝트의 종속성을 선언하십시오.

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

그런 다음 maven-war-plugin 오버레이를 구성하십시오.

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

위의 테스트 프로젝트 예제에서 웹 리소스 구성 파일 (conxtext 등)을 덮어 씁니다.

편집 : 이 솔루션은 Maven 3에서 테스트되지 않았습니다.


1
나는 그것을 테스트하기 전에 이것을 투표했다. Maven3을 사용하고 있기 때문에 이것이인지 모르겠지만 실제로 내 / classes 및 / lib 폴더가 여러 WAR 종속성을 통해 전 이적으로 포함됩니다. 다시 한 번 투표 해 주셔서 죄송합니다. 분명히 이것은 "정답"입니다.
HDave 2010

4

좋은 지적이야, 저스틴. 그것은 내가 실제로 내 문제를 해결하게했다. 즉, 전쟁을 어셈블리에 포함시키고 모든 전 이적 의존성을 포함하는 것이다. 어셈블리 플러그인이 해당 groupId / artefactId에서 참조하는 jar를 찾을 수 없기 때문에 제안한대로 전쟁 종속성을 'jar'로 복제 할 수 없었지만

  • 전쟁 의존성을 pom 유형으로 복제

공장! 전쟁과 그 전 이적 의존성은 어셈블리에 포함되지 않습니다. (지금도 나타나는) pom 파일을 제외하려면 다음과 같이 제외 요소를 추가해야했습니다.

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

내 assembly.xml 파일에.

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


-1

전쟁 프로젝트에 대한 종속성을 jar 종속성으로 나열하면 필요한 jar / resources를 선택하는 것 같습니다. Maven 2.2 + m2eclipse를 사용하고 있습니다.

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