2010-04-22 4 views
11

메이븐에 두 가지 다른 버전의 WAR를 만들고 싶습니다. 아뇨, 그것은 현재 상황을 알려주는 방식입니다. 어셈블리에 의해 묘사 된 WAR 버전에서 다른 분류 자와 동일한 종속성으로 종속성을 대체하려고합니다. 예를 들어,이 어셈블리가 작동 할 것으로 예상했습니다.메이븐 어셈블리 : 다른 분류 자와의 종속성을 포함하십시오.

<assembly> 
    <id>end-user</id> 
    <formats> 
    <format>war</format> 
    </formats> 
    <dependencySets> 
    <dependencySet> 
     <excludes> 
     <exclude>group:artifact:jar:${project.version}</exclude> 
     </excludes> 
     <includes> 
     <include>group:artifact:jar:${project.version}:end-user</include> 
     </includes> 
    </dependencySet> 
    </dependencySets> 
</assembly> 

이 방법은 작동하지 않지만 올바른 방향으로 가고 있습니까? 관련성이있는 Maven assembly pageMaven Definitive Guide 섹션의 모든 페이지를 이미 읽었습니다. 모든 포인터가 도움이 될 것입니다.

+0

비슷한 문제가 있습니다. 이 FAQ 질문이 나를 도왔다 http://maven.apache.org/plugins/maven-assembly-plugin/faq.html#dashClassifier – Stewart

답변

8

개인적으로 가장 명확한 해결책은 두 개의 프로필을 사용하는 것입니다 (하나는 분류 자의 아티팩트에 따라, 다른 하나는 "일반"아티팩트에 따라 다름). 그러나 실제로 사용자 정의 어셈블리를 사용하여 원하는 것을 얻을 수 있습니다. 나는 네가 올바른 방향으로 가고 있다고 생각하지 않는다. 다음은 내가 어떻게 할 것인가입니다 ...

먼저 어셈블리에 대한 특정 프로젝트를 만들고 webapp와 분류자를 종속 항목으로하는 이슈를 선언하십시오. 이런 식으로 뭔가 :

<project> 
    ... 
    <dependencies> 
    <dependency> 
     <groupId>${project.groupId}</groupId> 
     <artifactId>artifact</artifactId> 
     <version>${project.version}</version> 
     <classifier>end-user<classifier> 
    </dependency> 
    <dependency> 
     <groupId>${project.groupId}</groupId> 
     <artifactId>zewebapp</artifactId> 
     <version>${project.version}</version> 
     <type>war</type> 
    </dependency> 
    </dependencies> 
    <build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2-beta-5</version> 
     <configuration> 
      <descriptors> 
      <descriptor>src/main/assembly/end-user.xml</descriptor> 
      </descriptors> 
     </configuration> 
     <executions> 
      <execution> 
      <id>make-assembly</id> 
      <!-- this is used for inheritance merges --> 
      <phase>package</phase> 
      <!-- append to the packaging phase. --> 
      <goals> 
       <goal>single</goal> 
       <!-- goals == mojos --> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

그런 다음, 조립 기술자 인은 : 포장을 풀 때

<assembly> 
    <id>end-user</id> 
    <formats> 
    <format>war</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySet> 
     <unpack>true</unpack> 
     <unpackOptions> 
     <excludes> 
      <exclude>**/artifact-*.jar</exclude> 
     </excludes> 
     </unpackOptions> 
     <includes> 
     <include>*:war</include> 
     </includes> 
    </dependencySet> 
    <dependencySet> 
     <unpack>false</unpack> 
     <outputDirectory>WEB-INF/lib</outputDirectory> 
     <includes> 
     <include>group:artifact:jar:*:end-user</include> 
     </includes> 
    </dependencySet>  
    </dependencySets> 
</assembly> 

기본적으로,이 zewebapp의 전쟁을 얻기 위해 그것을 풀고 있지만 원치 않는 아티팩트를 제외하는 어셈블리 플러그인을 알려줍니다 . 그런 다음 어셈블리 플러그인이 분류자를 사용하여 이슈를 가져오고 WEB-INF/lib에 배치합니다 (원래대로 바꿉니다). 마지막으로, 모든 것이 전쟁으로 포장됩니다.

간단한 예제를 통해 테스트했는데 제대로 작동합니다.

+0

멋지다, 고마워 ... 나는 거기에서 어셈블리로 할 수있는 방법이 있었으면 좋겠다. 동일한 프로젝트 였지만 내가 잘못된 방향으로 가고 있다는 의견이 도움이되었습니다. –

+0

@James war 모듈에서 (분류자를 사용하거나 사용하지 않고) 두 가지 종속성을 선언하고 스코프를 가지고 놀아서 가능할 수도 있습니다. 그러나 이는 다소 불분명 할 수 있으며 별도의 모듈 접근 방식을 선택합니다. –

4

includes/include *에 대한 이슈 좌표를 지정할 때 "버전"정보가 필요하지 않습니다.

이 작동합니다 : (가)/*이 부분이 잘못 포함 포함에 대한

<assembly> 
    <id>end-user</id> 
    <formats> 
    <format>war</format> 
    </formats> 
    <dependencySets> 
    <dependencySet> 
     <includes> 
     <include>group:artifact:jar:end-user</include> 
     </includes> 
    </dependencySet> 
    </dependencySets> 
</assembly> 

은 내가 maven assembly documentation 생각합니다. "Artifact 좌표는 단순한 groupId : artifactId 형식으로 주어 지거나 groupId : artifactId : type : version [: classifier] 형식으로 정규화 될 수 있습니다." 그러나, 내 테스트에서 "버전"필요하지 않습니다. 나는 here에서 힌트를 얻었다.

내가 알아 차 렸을 때 생각 났지만, 미래에 다른 사람들에게 유용 할 것이라고 생각했습니다.

관련 문제