반응형

이번 포스팅에서는 일반 프로젝트의 Export > Runnable Jar 파일과 같이 실행 가능한 Jar 파일을 Maven을 통해서 생성하는 방법에 대해 알아보도록 하겠습니다.


※ 해당 포스팅은 이전 포스팅의 다중 모듈 프로젝트를 기반으로 진행됩니다!



 MANIFEST.MF (수동)

실행 가능한 Jar 파일을 생성하기 위해서 Main 클래스가 존재하는 Jar 파일을 열어 MANIFEST.MF를 수정해야 하는 아주 귀찮은 과정을 거쳐야 합니다.

저기 보이는 MANIFEST.MF 파일을 메모장으로 열어 class path를 설정하여 모듈과 라이브러리들을 등록하고 Main 클래스도 적어 주어야 합니다.


바로 이렇게 말이죠! 게다가 프로젝트에 사용되는 다른 모듈들의 build 된 Jar 파일들을 모두 lib경로로 옮겨야 합니다! 이 작업을 매번 빌드할 때마다 수행하게 되면 굉장히 시간 낭비가 될 것입니다.


하지만 저희에게는 Maven이 있습니다!



 Maven Plugin (자동!)

Maven에서는 build를 위한 편리한 plugin들을 제공하고 있습니다. 이 plugin을 이용하여 자동으로 MANIFEST를 설정할 수 있으며 빌드된 모듈들을 자동으로 이동시킬 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
<project ...>
 
<build>
        <plugins>
        <!-- 이곳에 사용할 plugin 삽입 -->
        </plugins>
</build>
 
...
 
</project>
cs

우선 위의 코드처럼 plugin을 넣을 수 있는 부분을 Main class가 있는 모듈의 pom.xml에 적습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>org.planb.dms.core.DmsMain</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>
cs

그다음 plugins 태그 안에 위의 maven-jar-plugin을 삽입해 주도록 합시다. 이 플러그인을 삽입함으로써 MANIFEST에 3가지 작업을 수행합니다.


1. addClasspath - true : maven-jar-plugin이 class-path 요소를 MANIFEST.MF 파일에 추가합니다.

2. classpathPrefix : 해당 module과 종속관계를 가지고 있는 항목들을 해당 모듈의 jar 경로의 lib 디렉토리로 설정합니다. 다시 말해서 사용되는 라이브러리나 모듈들의 경로를 lib 디렉토리로 설정합니다.

3. mainClass : MANIFEST에 Main class 이름을 설정합니다. 이로써 java -jar 모듈이름.jar 형식으로 jar 실행이 가능해집니다.



그다음으로 라이브러리들과 모듈들을 자동으로 lib 폴더를 복사하는 plugin을 사용해 보도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy</id>
            <phase>install</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>
                    ${project.build.directory}/lib
                </outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>
cs

위의 플러그인은 maven-dependency-plugin 입니다. 해당 모듈과 의존성 관계를 맺고 있는 모든 항목을 해당 모듈 디렉토리의 lib 폴더로 복사하게 됩니다. phase 태그에서 install로 지정되어 maven의 goal이 install 단계일 때 해당 플러그인의 기능이 수행됩니다.


저의 경우 dms-core 모듈에 Main 클래스가 존재하니 위의 과정을 dms-core 모듈의 pom.xml에 적용하였습니다.


다음으로 Maven Build Configuration에서 goals를 clean install로 설정하고 Run을 클릭! (자세한 내용은 이전 포스팅에서 확인해 주세요) 성공적으로 build가 되었다면 해당 모듈의 디렉토리를 열어보도록 합시다.


해당 모듈의 디렉토리에 가보면 target 폴더가 생성되어 있습니다. 들어가 보시면 위의 사진과 같이 해당 모듈의 jar 파일과 lib 폴더가 생성되어있을 것입니다. (아니라면 플러그인을 잘못 등록하셨거나 빌드가 잘못된 것일 수도)


그럼 이제 cmd 창을 열어 해당 디렉토리에 접근한 뒤 다음 명령어를 통해 jar 파일을 실행시킬 수 있습니다.

java -jar 모듈이름.jar 



 마무리

InteiliJ의 경우 Maven 프로젝트를 IDE 내에서 실행시키는 기능을 제공해주고 있는데 eclipse는 그게 되는지조차 모르겠습니다. 다음에 한 번 확인해 본 뒤에 포스팅해보도록 하겠습니다.



출처: http://boxfoxs.tistory.com/332 [박스여우 - BoxFox]

반응형

+ Recent posts