본문 바로가기
공부/프로그래밍

[maven] jar 파일 만들때 dependency 파일 첨부하기 (+파일명 고정하기)

by demonic_ 2022. 3. 21.
반응형

A 프로젝트를 모듈화(jar)하여 B 프로젝트에서 사용해야 할때 dependency 로 설정하면 별다른 문제없이 추가할 수 있다. 그런데 A프로젝트를 build하면 jar가 생성되지만 안에 dependency가 포함되어 있지 않기때문에 이전 프로젝트에서 사용했던 모듈들이 비어 에러를 발생하게 되었다.

 

그래서 A 프로젝트에서 jar를 만들때 dependency에 포함되어 있는 모듈들을 포함하는 동시에 파일을 덮어씌워 B 프로젝트에서 별도의 설정없이 가져다 쓸 수 있도록 하는 것이 목표다.

단계별로 설정을 어떻게 줘야하는지 살펴보자(결론만 필요하다면 3번을 보면된다)

 

 

1. dependency 포함하여 jar 파일 만들기

maven plugin 중에 assembly 가 있다. 풀 네임은 maven-assembly-plugin 인데 이것을 통해 dependency를 포함시킬 수 있다. 설정은 다음과 같다

pom.xml

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

위 내용을 추가하여 install 해보면 2개의 파일이 생성된다.

 

눈치빠른 사람도 있겠지만 파일명중에 jar-with-dependencies 라고 써잇는 것이 dependency가 포함된 파일이다. 둘을 오픈해보면 다음처럼 각각 내부 구성이 다르다.

dependency가 포함된 jar의 내부(xxxx-1.0.-jar-with-dependencies.jar)

 

dependency가 포함되지 않은 jar의 내부(xxxx-1.0.jar)

 

 

2. dependency 가 포함된 jar의 이름을 변경하는 방법

maven-assembly-plugin 의 옵션중에 finalName 이 있는데 설정하면 jar 파일명을 지정할 수 있다. 예를들어 다음과 같이 설정해보자

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <finalName>test.jar</finalName>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

 

실행해보면 test.jar 파일이 생긴것을 확인할 수 있다.

 

그렇다면 기본으로 생성되는 jar 파일과 이름을 같게하면 어떨까?

설정을 다음과 같이 수정한다

 

그렇다면 기본으로 생성되는 jar 파일과 이름을 같게하면 어떨까?

설정을 다음과 같이 수정한다

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <finalName>${project.name}-${project.version}</finalName>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

 

생성결과를 보면 jar 파일이 하나만 있다. 해당 파일의 압축을 풀어 열어보면 다음처럼 dependency 가 포함되어 있는 이전 jar파일과 같은 내용으로 구성되어 있음을 확인할 수 있다.

 

 

3. dependency 가 포함된 jar를 기본으로 변경하는 방법

옵션중에 <appendAssembleId> 라는 게 있다. 2번에 설명한 finalName과 이 옵션을 false로 주면 1개의 jar가 생성되며 dependency 를 포함한다.

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <appendAssemblyId>false</appendAssemblyId>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

 

 

정리하자면

1) 기본으로 생성되는 jar 파일이랑 이름을 똑같이 만들거라면 <finalName>을 빼고 <appendAssembleId> 추가하면 된다.

2) 기본 jar와 별도로 dependency가 포함된 것을 만들거라면 <finalName>만 쓰면 된다.(기본 jar와 dependency가 포함된 jar 각각 생성)

 

 

포스팅의 처음 조건(B 프로젝트에서 A프로젝트를 참고하게 하기 위해 dependency를 추가하는 것)을 하려면 기본으로 생성되는 jar 파일 설정으로 해야한다(정리1, <appendAssembleId> 옵션 설정)

 

 

끝.

 

 

 

 

 

반응형

댓글