Maven으로 실행 가능한 JAR을 만드는 방법

1. 소개

이 빠른 기사에서는 Maven 프로젝트를 실행 가능한 Jar 파일로 패키징하는 데 중점을 둘 것 입니다.

일반적으로 jar 파일을 만들 때 IDE를 사용하지 않고 쉽게 실행할 수 있습니다. 이를 위해 실행 파일을 만들기 위해 이러한 각 접근 방식을 사용하는 구성 및 장단점에 대해 설명합니다.

2. 구성

실행 가능한 jar 를 생성하기 위해 추가 종속성이 필요하지 않습니다. Maven Java 프로젝트를 만들고 main (…) 메서드 가있는 클래스가 하나 이상 있어야 합니다.

이 예에서는 ExecutableMavenJar 라는 Java 클래스를 만들었습니다 .

또한 pom.xml 에 다음 요소가 포함되어 있는지 확인해야합니다 .

4.0.0 com.baeldung core-java 0.1.0-SNAPSHOT jar

여기서 가장 중요한 측면은 유형입니다. 실행 가능한 jar 를 만들려면 구성이 jar 유형을 사용하는지 다시 확인하십시오 .

이제 다양한 솔루션을 사용할 수 있습니다.

2.1. 수동 구성

maven-dependency-plugin 의 도움으로 수동 접근 방식부터 시작하겠습니다 .

먼저 필요한 모든 종속성을 지정할 폴더에 복사합니다.

 org.apache.maven.plugins maven-dependency-plugin   copy-dependencies prepare-package  copy-dependencies    ${project.build.directory}/libs     

주목해야 할 두 가지 중요한 측면이 있습니다. 먼저 목표 copy-dependencies를 지정하여 Maven에게 이러한 종속성을 지정된 outputDirectory 에 복사하도록 지시합니다 .

이 경우 프로젝트 빌드 디렉토리 (일반적으로 대상 폴더) 내에 libs 라는 폴더를 만듭니다 .

두 번째 단계에서는 첫 번째 단계에서 복사 한 종속성에 대한 링크를 사용하여 실행 파일 및 클래스 경로 인식 jar 를 만들 것입니다 .

 org.apache.maven.plugins maven-jar-plugin    true libs/  com.baeldung.executable.ExecutableMavenJar     

위에서 언급 한 가장 중요한 부분은 매니페스트 구성입니다. 모든 종속성 ( libs / 폴더)이있는 클래스 경로를 추가 하고 기본 클래스에 대한 정보를 제공합니다.

클래스의 정규화 된 이름을 제공해야합니다. 즉, 패키지 이름이 포함됩니다.

이 접근 방식의 장점과 단점은 다음과 같습니다.

  • 장점 – 각 단계를 지정할 수있는 투명한 프로세스
  • 단점 – 수동, 종속성은 최종 jar 밖에 있습니다. 즉, 실행 가능한 jarlibs 폴더에 액세스 할 수 있고 jar에 대해 표시 되는 경우에만 실행됩니다.

2.2. Apache Maven 어셈블리 플러그인

Apache Maven 어셈블리 플러그인을 사용하면 사용자가 종속성, 모듈, 사이트 문서 및 기타 파일과 함께 프로젝트 출력을 하나의 실행 가능한 패키지로 집계 할 수 있습니다.

어셈블리 플러그인의 주요 목표는 모든 어셈블리를 만드는 데 사용되는 단일 목표입니다 (다른 모든 목표는 더 이상 사용되지 않으며 향후 릴리스에서 제거 될 예정 임).

pom.xml 의 구성을 살펴 보겠습니다 .

 org.apache.maven.plugins maven-assembly-plugin   package  single      com.baeldung.executable.ExecutableMavenJar     jar-with-dependencies     

수동 접근 방식과 유사하게 메인 클래스에 대한 정보를 제공해야합니다. 차이점은 Maven 어셈블리 플러그인이 모든 필수 종속성을 jar 파일에 자동으로 복사한다는 것 입니다.

구성 코드 의 descriptorRefs 부분에서 프로젝트 이름에 추가 될 이름을 제공했습니다.

이 예제의 출력은 core-java-jar-with-dependencies.jar 로 이름이 지정됩니다 .

  • 장점jar 파일 내의 종속성 , 단일 파일 만
  • 단점 – 아티팩트 패키징의 기본 제어 (예 : 클래스 재배치 지원 없음)

2.3. Apache Maven Shade 플러그인

Apache Maven Shade 플러그인은 프로젝트를 실행하는 데 필요한 모든 종속성으로 구성된 uber-jar에 아티팩트를 패키징하는 기능을 제공합니다 . 또한 일부 종속성의 패키지 인 음영 처리 (예 : 이름 바꾸기)를 지원합니다.

구성을 살펴 보겠습니다.

 org.apache.maven.plugins maven-shade-plugin    shade   true   com.baeldung.executable.ExecutableMavenJar      

이 구성에는 세 가지 주요 부분이 있습니다.

먼저, jar에 패키지 할 모든 종속성을 표시합니다 .

둘째, 변환기 구현을 지정해야합니다. 우리는 우리의 예에서 표준을 사용했습니다.

마지막으로 애플리케이션의 기본 클래스를 지정해야합니다.

출력 파일의 이름은 core-java-0.1.0-SNAPSHOT-shaded.jar입니다 . 여기서 core-java 는 프로젝트 이름이고 그 뒤에 스냅 샷 버전과 플러그인 이름이 있습니다.

  • pros – dependencies inside the jar file, advanced control of packaging your artifact, with shading and class relocation
  • cons – complex configuration (especially if we want to use advanced features)

2.4. One Jar Maven Plugin

Another option to create executable jar is the One Jar project.

This provides custom classloader that knows how to load classes and resources from jars inside an archive, instead of from jars in the filesystem.

Let's take a look at the configuration:

 com.jolira onejar-maven-plugin    org.baeldung.executable. ExecutableMavenJar true  ${project.build.finalName}.${project.packaging}    one-jar    

As it is shown in the configuration, we need to specify the main class and attach all dependencies to build, by using attachToBuild= true.

Also, we should provide the output filename. Moreover, the goal for Maven is one-jar. Please note, that One Jar is a commercial solution, that will make dependency jars not expanded into the filesystem at runtime.

  • pros – clean delegation model, allows classes to be at the top-level of the One Jar, supports external jars and can support Native libraries
  • cons – not actively supported since 2012

2.5. Spring Boot Maven Plugin

Finally, the last solution we'll look at is the Spring Boot Maven Plugin.

This allows to package executable jar or war archives and run an application “in-place”.

To use it we need to use at least Maven version 3.2. The detailed description is available here.

Let's have a look at the config:

 org.springframework.boot spring-boot-maven-plugin    repackage   spring-boot  com.baeldung.executable.ExecutableMavenJar     

There are two differences between Spring plugin and the others. First, the goal of the execution is called repackage, and the classifier is named spring-boot.

Please note, that we don't need to have Spring Boot application in order to use this plugin.

  • pros – dependencies inside a jar file, you can run it in every accessible location, advanced control of packaging your artifact, with excluding dependencies from the jar file etc., packaging of war files as well
  • cons – adds potentially unnecessary Spring and Spring Boot related classes

2.6. Web Application With Executable Tomcat

In the last part, we want to cover the topic of having a standalone web application, that is packed inside a jar file. In order to do that, we need to use different plugin, designed for creating executable jar files:

 org.apache.tomcat.maven tomcat7-maven-plugin 2.0   tomcat-run  exec-war-only  package  / false webapp.jar utf-8    

The goal is set as exec-war-only, path to your server is specified inside configuration tag, with additional properties, like finalName, charset etc. To build a jar, run man package, which will result in creating webapp.jar in your target directory. To run

To run the application, just write this in your console: java -jar target/webapp.jar and try to test it by specifying the localhost:8080/ in a browser.

  • pros – having one file, easy to deploy and run
  • cons – a size of the file is much larger, due to packing Tomcat embedded distribution inside a war file

Please note, that this is the latest version of this plugin, which supports Tomcat7 server. To avoid errors, please check that your dependency for Servlets has scope set as provided, otherwise, there will be a conflict at the runtime of executable jar:

 javax.servlet javax.servlet-api provided 

3. Conclusion

이 기사에서는 다양한 Maven 플러그인으로 실행 가능한 jar 를 만드는 여러 방법을 설명했습니다 .

이 튜토리얼의 전체 구현은이 (실행 가능한 jar) 및이 (실행 가능한 전쟁) Github 프로젝트에서 찾을 수 있습니다.

테스트하는 방법? 프로젝트를 실행 가능한 jar 로 컴파일하려면 mvn clean package 명령으로 Maven을 실행하십시오 .

이 기사가 주제에 대한 더 많은 통찰력을 제공하고 필요에 따라 선호하는 접근 방식을 찾을 수 있기를 바랍니다.

한 가지 빠른 마지막 참고 사항-번들링하는 항아리의 라이센스가 이러한 종류의 작동을 금지하지 않는지 확인하십시오. 일반적으로 그렇지는 않지만 고려할만한 가치가 있습니다.