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> 옵션 설정)
끝.
'공부 > 프로그래밍' 카테고리의 다른 글
[aws, lambda@edge] cloundfront 이미지 리사이즈 기능 사용중 오류(503 에러) (1) | 2022.05.06 |
---|---|
[react, nextjs] _app.js 에 useEffect 에서 2번씩 호출될때 (0) | 2022.04.22 |
[jpa] 테이블에 입력, 수정일시 컬럼 공통으로 하기 (0) | 2022.02.23 |
swagger-ui 사용 시 spring security에 경로 등록 (0) | 2022.02.21 |
[react] window is not defined 에러 (apexchart) (0) | 2022.01.12 |
댓글