Maven 입문 | Java 응용 프로그램 개발 | maven-jar-plugin 실행 가능한 Jar 생성

앞장에서 프로그램의 실행은 간단히 했지만 아직 완전하지 않다.

target 폴더에 패키지된 Jar 파일이 생성되었지만, 이를 그대로 실행하려고 하면 동작하지 않는다. 예를 들어, 아래와 같이 명령을 실행해 보자.

java -jar target/SampleMavenApp-1.0-SNAPSHOT.jar

그러면 다음과 같은 에러 메시지가 출력된다.

target/SampleMavenApp-1.0-SNAPSHOT.jar에 기본 Manifest 속성이 없습니다.

mvn package으로 생성된 Jar 파일은 실행 가능한 Jar가 아니다. 매니페스트 파일이 제대로 생성되지 않기 때문에 그대로는 사용할 수 없다.

maven-jar-plugin 설정에 대해

Jar 파일의 생성은 maven-jar-plugin이라는 플러그인에 의해 이루어 진다. 이 플러그인에 매니페스트 파일 작성을 위한 설정 정보를 추가하면 다음과 같은 형태가 된다.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.2</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>메인 클래스 지정</mainClass>
                <addClasspath>true</addClasspath>
                <addExtensions>true</addExtensions>
                <packageName>패키지</packageName>
            </manifest>
        </archive>
    </configuration>
</plugin>

설정 정보를 작성하는 <configuration>안에, 아카이브에 관한 설정인 <archive> 태그가 있다. 그 안에 매니페스트 파일에 대한 <manifest> 태그가 있고, 여기에 매니페스트에 대한 정보를 작성한다. 작성하는 내용은 다음과 같다.

태그 설명
<mainClass> 메인 클래스를 지정한다.
<addClasspath> 클래스 패스(Class-Path 값)을 추가할지 여부를 지정한다. 이것은 true로 하면 된다.
<addExtensions> 확장 정보가 포함된다. 이것은 <dependencies>에 작성된 라이브러리 정보 를 내보내는 위한 것이다. 이것도 true 하면 된다.
<packageName> Jar 패키지(Package)을 출력한다.

특히 라이브러리도 사용하지 않고, SampleMavenApp와 같은 간단한 프로그램이라면 <mainClass> 만 지정하면 된다.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.2</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.devkuma.App</mainClass>
                <addClasspath>true</addClasspath>
                <addExtensions>true</addExtensions>
                <packageName>com.devkuma</packageName>
            </manifest>
        </archive>
    </configuration>
</plugin>

이렇게 pom.xml에 작성하고, mvn package으로 Jar 파일을 생성하여 java -jar으로 SampleMavenApp-1.0-SNAPSHOT.jar을 실행해 본다. 이번에는 문제없이 실행할 수 있을 것이다.

$ java -jar target/SampleMavenApp-1.0-SNAPSHOT.jar 
Hello World!

pom.xml의 완성판 

지금까지 설명했던 플러그인 정보를 추가한 pom.xml의 완성판는 아래와 같다.

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.devkuma</groupId>
  <artifactId>SampleMavenApp</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>SampleMavenApp</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.6.0</version>
        <configuration>
          <mainClass>com.devkuma.App</mainClass>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.0.2</version>
        <configuration>
          <archive>
            <manifest>
                <mainClass>com.devkuma.App</mainClass>
                <addClasspath>true</addClasspath>
                <addExtensions>true</addExtensions>
                <packageName>com.devkuma</packageName>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

이는 Java 응용 프로그램을 작성하여 바로 실행해 보거나, 실행 가능한 Jar 파일을 만드는 경우에 기본적인 코드이다.

플러그인이 불필요하게 되면 삭제해도 상관 없다. 예를 들어, 실행 가능한 Jar를 만들 경우, exec:java으로 실행을 못해도 상관 없다면, exec-maven-plugin의 <plugin> 부분은 삭제해도 된다. 필요에 따라 수정하면서 이용하면 된다.