1. 개요

이 빠른 사용방법(예제)에서는 Maven 프로젝트를 실행 가능한 Jar 파일로 패키징하는 데 중점을 둡니다 .

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

2. 구성

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

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

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

<modelVersion>4.0.0</modelVersion>
<groupId>com.baeldung</groupId>
<artifactId>core-java</artifactId>
<version>0.1.0-SNAPSHOT</version>
<packaging>jar</packaging>

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

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

2.1. 수동 구성

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

필요한 모든 의존성을 지정할 폴더에 복사하는 것으로 시작합니다.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>
                    ${project.build.directory}/libs
                </outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

주목해야 할 두 가지 중요한 측면이 있습니다.

먼저 목표 copy-dependencies를 지정하여 Maven에게 이러한 의존성을 지정된 outputDirectory 에 복사하도록 지시합니다 . 이 경우  프로젝트 빌드 디렉토리 (일반적으로 대상 폴더) 내에 libs 라는 폴더를 만듭니다 .

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

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>libs/</classpathPrefix>
                <mainClass>
                    com.baeldung.executable.ExecutableMavenJar
                </mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

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

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

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

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

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

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

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

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

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
            <configuration>
                <archive>
                <manifest>
                    <mainClass>
                        com.baeldung.executable.ExecutableMavenJar
                    </mainClass>
                </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </execution>
    </executions>
</plugin>

수동 접근 방식과 마찬가지로 기본 클래스에 대한 정보를 제공해야합니다. 차이점은 Maven 어셈블리 플러그인이 필요한 모든 의존성을 jar 파일에 자동으로 복사한다는 것 입니다.

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

예제의 출력 이름은 core-java-jar-with-dependencies.jar 입니다.

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

2.3. Apache Maven Shade 플러그인

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

구성을 살펴 보겠습니다.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <shadedArtifactAttached>true</shadedArtifactAttached>
                <transformers>
                    <transformer implementation=
                      "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.baeldung.executable.ExecutableMavenJar</mainClass>
                </transformer>
            </transformers>
        </configuration>
        </execution>
    </executions>
</plugin>

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

첫째, <shadedArtifactAttached>jar에 패키징 할 모든 의존성을 표시합니다 .

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

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

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

  • 장점jar 파일 내부의 의존성 , 음영 및 클래스 재배치로 아티팩트 패키징의 고급 제어
  • 단점 – 복잡한 구성 (특히 고급 기능을 사용하려는 경우)

2.4. 하나의 Jar Maven 플러그인

실행 가능한 jar 를 만드는 또 다른 옵션 은 One Jar 프로젝트입니다.

이것은 파일 시스템의 jar아닌 아카이브 내부의 jar에서 클래스와 리소스를로드하는 방법을 알고있는 사용자 정의 클래스 로더를 제공합니다 .

구성을 살펴 보겠습니다.

<plugin>
    <groupId>com.jolira</groupId>
    <artifactId>onejar-maven-plugin</artifactId>
    <executions>
        <execution>
            <configuration>
                <mainClass>org.baeldung.executable.
                  ExecutableMavenJar</mainClass>
                <attachToBuild>true</attachToBuild>
                <filename>
                  ${project.build.finalName}.${project.packaging}
                </filename>
            </configuration>
            <goals>
                <goal>one-jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

구성에 표시된대로 attachToBuild = true 를 사용하여 기본 클래스를 지정하고 모든 의존성을 빌드에 연결해야 합니다 .

또한 출력 파일 이름을 제공해야합니다. 또한 Maven의 목표는 one-jar 입니다. One Jar는 런타임시 의존성 jar 가 파일 시스템으로 확장되지 않도록 하는 상용 솔루션입니다 .

  • 장점 – 깔끔한 위임 모델, 클래스가 One Jar의 최상위 수준이되도록 허용하고, 외부 jar 를 지원하며 네이티브 라이브러리를 지원할 수 있습니다.
  • 단점 – 2012 년부터 적극적으로 지원되지 않음

2.5. Spring Boot Maven 플러그인

마지막으로 살펴볼 마지막 솔루션은 Spring Boot Maven 플러그인입니다.

이를 통해 실행 가능한 jar 또는 war 아카이브 를 패키징 하고 애플리케이션을 "제자리"에서 실행할 수 있습니다.

이를 사용하려면 Maven 버전 3.2 이상을 사용해야합니다. 자세한 설명은 여기에서 볼 수 있습니다 .

구성을 살펴 보겠습니다.

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
            <configuration>
                <classifier>spring-boot</classifier>
                <mainClass>
                  com.baeldung.executable.ExecutableMavenJar
                </mainClass>
            </configuration>
        </execution>
    </executions>
</plugin>

Spring 플러그인과 다른 플러그인 사이에는 두 가지 차이점이 있습니다. 실행 목표는 repackage 이고 분류자는 spring-boot 입니다.

이 플러그인을 사용하기 위해 Spring Boot 애플리케이션이 필요하지 않습니다.

  • prosjar 파일 내의 의존성 , 액세스 가능한 모든 위치에서 실행할 수 있으며, jar 파일 등의 의존성을 제외하고 아티팩트를 패키징하는 고급 제어 , war 파일의 패키징 도 가능합니다.
  • 단점 – 잠재적으로 불필요한 Spring 및 Spring Boot 관련 클래스 추가

2.6. 실행 가능한 Tomcat이있는 웹 애플리케이션

마지막 부분에서는 aj ar 파일에 압축 된 독립형 웹 애플리케이션을 다루고 싶습니다 .

이를 위해서는 실행 가능한 jar 파일을 생성하도록 설계된 다른 플러그인을 사용해야합니다.

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.0</version>
    <executions>
        <execution>
            <id>tomcat-run</id>
            <goals>
                <goal>exec-war-only</goal>
            </goals>
            <phase>package</phase>
            <configuration>
                <path>/</path>
                <enableNaming>false</enableNaming>
                <finalName>webapp.jar</finalName>
                <charset>utf-8</charset>
            </configuration>
        </execution>
    </executions>
</plugin>

목표는 로 설정되어 간부 전쟁 만 , 경로 우리의 서버가 내부에 지정된 구성 등의 추가 속성, 태그 finalName , 캐릭터

aj ar 을 빌드하기 위해 man package를 실행 하면 대상 디렉토리에 webapp.jar생성 됩니다.

애플리케이션을 실행하려면 콘솔에 java -jar target / webapp.jar 를 작성하고 브라우저에서 localhost : 8080 /을 지정하여 테스트 해 봅니다 .

  • 전문가 – 하나의 파일로 배포 및 실행 용이
  • 단점 – Tomcat 임베디드 배포판을 aw ar 파일 에 패킹하기 때문에 파일 크기가 훨씬 큽니다.

이 플러그인은 Tomcat7 서버를 지원하는 최신 버전입니다. 오류를 피하기 위해 서블릿에 대한 의존성이 제공된 대로 범위가 설정되어 있는지 확인할 수 있습니다 . 그렇지 않으면 실행 가능한 jar런타임충돌이 발생합니다 .

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <scope>provided</scope>
</dependency>

3. 결론

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

이 예제의 전체 구현은 다음 GitHub 프로젝트에서 찾을 수 있습니다 : 실행 가능한 jar실행 가능한 war .

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

이 기사는 더 많은 통찰력을 제공하고 필요에 따라 선호하는 접근 방식을 찾는 데 도움이되기를 바랍니다.

한 가지 빠른 마지막 참고 사항 : 번들로 제공하는 항아리의 라이센스가 이러한 종류의 작업을 금지하지 않도록합니다. 일반적으로 그렇지는 않지만 고려할 가치가 있습니다.