¡Hola, Mondo!

Maven shade plugin 본문

Beji/Etc

Maven shade plugin

베지(Beji) 2016. 9. 1. 15:24

 

uber-jar



'uber-jar'라는 것은 자바 어플리케이션의 모든 패키지와, 그에 의존관계에 있는 패키지 라이브러리까지 모두 하나의 'jar' 에 담겨져 있는 것 을 말한다.

 

 



 

mvn package



해당 프로젝트의 의존성 라이브러리들은 그대로 둔채 패키징한다.

프로젝트가 의존하고 있는 다른 라이브러리로 함께 패키징하려면, --> uber-jar 파일을 생성하려면, "maven-assembly-plugin" 나 "maven-shade-plugin" 를 사용해야 한다.

 

 

 

 

Maven assembly plugin



dependencies 로 참조한 모든 것을 포함(class 등)해서 패키징하는 방법이다.


<build>
<plugins>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>x.x.x</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>

 

 

 

Maven shade plugin



패키징시에 dependency 옵션 중 scope의 값에 따라 해당 dependency를 패키징에 포함 할지 안할지를 결정할 수 있어 가벼운 jar 파일을 생성할 수 있다.

//패키지에 포함할 dependency


<dependency>
<groupId>com.xxxx.xxxxxxxx</groupId>
<artifactId>xxxx</artifactId>
<version>x.x.x</version>
<classifier>jar-with-dependencies</classifier>

<scope>compile</scope>
</dependency>

 

//패키지에 포함하지 않을 dependency


<dependency>
<groupId>com.xxxx.xxxxxxxx</groupId>
<artifactId>xxxx</artifactId>
<version>x.x.x</version>
<classifier>jar-with-dependencies</classifier>

<scope>provided</scope>
</dependency>

 

maven 명령시 goal을 'shade:shade'로 지정하여 실행할 수 있지만, <executions> 설정을 통해 package 에 shade를 바인딩하는 설정을 통해 'mvn package'로 구동할 수 있다.

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <configuration>
                <!-- put your configurations here -->                         
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

 




  

Resource Transformer

shade 플러그인을 사용할 때, Resource Transformer 설정을 하면

서로 다른 artifacts 들로부터 uber-jar 를 생성할때, classes 및 resources 파일들을 '중복없이' 패키징 할 수 있게 해준다.


각 Resources Transformer 설정의 종류 및 특징은 아래와 같다

Transformers in org.apache.maven.plugins.shade.resource
ApacheLicenseResourceTransformer Prevents license duplication
ApacheNoticeResourceTransformer Prepares merged NOTICE
AppendingTransformer Adds content to a resource
ComponentsXmlResourceTransformer Aggregates Plexus components.xml
DontIncludeResourceTransformer Prevents inclusion of matching resources
IncludeResourceTransformer Adds files from the project
ManifestResourceTransformer Sets entries in the MANIFEST
PluginXmlResourceTransformer Aggregates Mavens plugin.xml
ServicesResourceTransformer Relocated class names in META-INF/services resources and merges them.
XmlAppendingTransformer Adds XML content to an XML resource


 




(1) ManifestResourcesTransformer

자바 'MANIFEST' 파일의 entries 를 세팅해 준다.

실행 가능한 jar 파일을 생성할시에 자바 어플리케이션을 구동할 MainClass를 지정해야하는데, 이것은 'MANIFEST' 파일의 entry 중 하나이다.

다음과 같이 <configuration> 설정에 추가한다.

 <configuration>
    <transformers>
        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <mainClass>com.asuraiv.project.aaa.MainClass</mainClass>
        </transformer>
    </transformers>
</configuration>

실행 가능한 jar 파일을 생성할시에 자바 어플리케이션을 구동할 MainClass를 지정해야하는데, 이것은 'MANIFEST' 파일의 entry 중 하나이다. 위 예제처럼 <mainClass> 설정으로 해당 어플리케이션의 메인클래스를 입력한다.






(2) AppendingTransformer


maven-assembly-plugin 을 사용하면, 파일내에 명시된 클래스의 namespace가 중복되는 경우, 파일들이 동일한 이름으로 존재하는 경우에 가장 마지막 것만 남는다. 하지만, maven-shade-plugin의 AppendingTransformer를 설정해주면, 파일의 중복문제, namespace의 중복문제를 해결해준다. (하나의 파일로 합쳐짐)

<configuration>
    <transformers>
        <transformer
            implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <mainClass>org.springframework.batch.core.launch.support.CommandLineJobRunner</mainClass>                                   
        </transformer>
        <transformer
            implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
            <resource>META-INF/spring.handlers</resource>
        </transformer>
        <transformer
            implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
            <resource>META-INF/spring.schemas</resource>
        </transformer>
</configuration







MANIFEST.MF이란?

Manifest 파일은 해당 자바 어플리케이션의 정보 즉, 일종의 메타정보(패키지 관련 정보 및 파일 확장 관련 정보)를 담고 있는 파일이다.

JAR 파일을 생성할 때 자동적으로 기본 manifest 파일이 생성된다.

하나의 아카이브 안에는 오직 하나의 manifest 파일이 존재하고 META-INF 디텍토리에 있어야 한다.



[참고]

http://asuraiv.blogspot.kr/2016/01/maven-shade-plugin-1-resource.html

http://stewie38.tistory.com/91


Comments