programing tip

Maven WAR 종속성

itbloger 2020. 10. 10. 09:40
반응형

Maven WAR 종속성


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

감사합니다.


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>

실제로 Maven은 설계 상 프로젝트의 종속성으로 선언 된 전쟁의 전 이적 종속성을 해결하지 않습니다. 실제로 MNG-1991 에 대한 문제가 있지만 Maven 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 플러그인에서 프로젝트 클래스 경로에 포함 할 올바른 아티팩트 목록을 결정하는 데 사용됩니다.

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


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

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

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

then configure maven-war-plugin overlay:

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

In the above example in test project I overwrite webresources configuration files (like conxtext etc.).

EDIT: This solution wasn't tested with Maven 3.


Good point, Justin. That got me actually solving my problem, namely: including a war into an assembly AND including all its transitive dependencies. I could not duplicate the war-dependency as 'jar' as you suggested since the assembly plugin would not find a jar referenced by that groupId/artefactId, but

  • duplicating the war-dependency as type pom

works! The war and its transitive dependencies are not included in the assembly. To exclude the (now also appearing) pom file I had to add an exclude element like this:

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

into my assembly.xml file.

I think this could also be a workaround for the original question of this thread.


If you list the dependency on the war project as a jar dependency it seems to pickup the required jars/resources. I'm using Maven 2.2 + m2eclipse.

참고URL : https://stackoverflow.com/questions/1769586/maven-war-dependency

반응형