2010-06-30 2 views
12

모든 모듈과 그 종속성을 포함하여 다중 모듈 maven 프로젝트의 uber 항아리를 만들 필요가있는 시나리오가 있습니다. maven shade plugin을 사용해 보았습니다. 하지만 모듈 수준에서 사용할 때만 작동하는 것 같습니다. 그때 빌드 휴식을 부모 치어에서 플러그인 항목을 추가하는 경우 부모 받는다는 프로젝트의 <packaging>가 치어이기 때문에 의미가 납니까다중 모듈 프로젝트에서 Maven 음영 플러그인 사용 - NullPointerException

[INFO] Replacing original artifact with shaded artifact. 
[INFO] Replacing null with C:\Projects\foo.bar\target\foobar-0.0.1-SNAPSHOT-shaded.pom 
[INFO] ------------------------------------------------------------------------ 
[ERROR] BUILD ERROR 
[INFO] ------------------------------------------------------------------------ 
[INFO] Error creating shaded jar: null: NullPointerException -> [Help 1] 

(그것은 그늘에 부모 치어를 시도). 하지만 다중 모듈 프로젝트를위한 uber 항아리를 만드는 방법이 있어야합니다 ... 어떤 아이디어 사람들 ???

+0

가능성있는 해결 방법을 해결되었다 : 개별 모듈 항아리에 대한 종속성 받는다는 프로젝트를 만들고이 프로젝트에 쉐이더 플러그인을 사용 – Manoj

+2

그럴 가능성은 희박합니다. –

답변

13

음영 처리를 위해 부모 프로젝트의 POM 파일을 사용해서는 안됩니다. 이를 위해 별도의 집계 프로젝트를 사용해야합니다. 상위 메이븐 프로젝트는 상속에 사용되며, 애그리 게이터 프로젝트는 하위 프로젝트 그룹에 대해 집계 함수를 수행하는 데 사용됩니다. 그들의 JARs를 함께 uber jar로 음영 처리하는 것과 같습니다. 이 프로젝트는 하위 프로젝트를 참조하고 음영 플러그인 구성을 가진 프로젝트의 루트 디렉토리 (모든 하위 모듈의 폴더와 동일한 레벨)의 pom 파일 일뿐입니다. 이 pom에 지정된 packaing이 JAR인지 확인하십시오.

여기에는 POM 관계 및 집계와 상속의 차이점을 설명하는 documentation이 있습니다.

+0

비슷한 문제가있어서이 대답을 발견했습니다. 그러나 내가 말한 프로젝트 구조를 정확히 가지고 있지만 작동하지 않습니다. 내 최상위 (집계) 프로젝트는 POM 유형이며 여러 하위 모듈을 포함합니다. 이 애그리 게이터에서 uber-jar를 그늘지게하려 할 때, 단지 POM을 제공하지만 JAR은 제공하지 않습니다. 몇 가지 추가 힌트를 줄 수 있다면 정말 좋을까요? 감사합니다. –

+0

@Adrian Shum - 내 조언은 플러그인의 설명서를 읽고 사용법이 올바른 일을하는지 확인하는 것입니다. http : //maven.apache.org/plugins/maven-shade-plugin/여전히 문제가 있다면 코드/설정없이 도움을받는 것이 어렵습니다. 가능한 한 많은 세부 사항을 포함하여 다른 질문을 게시하여 성취하려는 것을 설명하고 어떤 문제가 발생하는지 설명하십시오. pom의 shade-plugin 설정을 포함하는 것을 잊지 마십시오. 그러면 여기서 질문에 연결하면 내가 당신을 도울 수 있는지 알게 될 것입니다. –

+0

outputfile config를 사용하여 pom 패키지 된 aggregator를 강제로 jar로 출력 할 수 있습니다. 즉 대상/foo_bar.jar입니다. 아마 지원되지 않을 수도 있지만 작동합니다. – mlathe

3

예! 할 수있어! :-)

음영에는 구현 문제가 있습니다. pom (jar 또는 web이 아님) 프로젝트에서 실행되는시기는 알지 못합니다. Pom 프로젝트는 바이너리 아티팩트를 생성하지 않으며 음영은 병합, 이동 등의 파일을 찾지 못하고 NPE를 던집니다.

이 문제를 해결하려면 aggegate-Pom 프로젝트에서 상위 POM을 만드십시오. 그 안에 어떤 프로파일 (. 예를 들어 alwaysActiveProfiles)로 구성 그늘 정의 및 구성을 넣고 설치/명령을 사용하여 배포 :

MVN이 명령이 음영을 설치합니다 -P -alwaysActiveProfiles

배포 부모를 실행하지 않고 shade plugin pom (-alwaysActiveProfiles 옵션 supress shade plugin 실행)을 실행하면 종속 프로젝트가 작동합니다. 귀하의 음영 부모 치어는 수 다음과 같습니다

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 

<modelVersion>4.0.0</modelVersion> 
<groupId>xxxxxxxx</groupId> 
<artifactId>web-pom</artifactId> 
<name>web-pom</name> 
<version>1.0.0-SNAPSHOT</version> 
<packaging>pom</packaging> 

<build> 
    <pluginManagement> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-shade-plugin</artifactId> 
       <version>1.4</version> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>shade</goal> 
         </goals> 
         <configuration> 
          ... 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </pluginManagement> 
</build> 
<dependencies> 
    ... 
</dependencies> 

<profiles> 
    <profile> 
     <id>alwaysActiveProfiles</id> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-shade-plugin</artifactId> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 

그렇지 않으면 그늘이 당신의 의존성 그늘 치어 프로젝트에서 실행되지 않습니다, 당신의 setting.xml은 기본적으로 활성화 alwaysActiveProfiles이 있어야합니다 것을 기억하십시오.

2
내가 플러그인의 버전 1.6과 같은 문제가되었다

, 나는 2.2로 업데이트하고 문제가

관련 문제