티스토리 뷰
내가 Spring boot가 아닌 일반 Maven Project를 실행가능한 Jar 파일로 만들기 위해 겪었던 고생을 작성해본다.
나의 Maven 프로젝트의 상황
- java8
- 외부 라이브러리가 포함되어 있음(kafka-client, jsch 등)
- 웹이 아닌 java 프로젝트
첫번째 시행착오
Java 프로젝트 구현 끝내고, 그냥 maven install 하여, jar 파일 실행
결과
Main 클래스를 찾을 수 없다고 나옴
* 아래 캡쳐화면은 maven project에서 mvn install 실행 후, 생성된 jar 파일을 실행했을 때 나온 에러 메시지로 Manifest 속성이 없다고 나온다.

두번째 시행착오
Main클래스를 찾으려면, Manifest가 있어야 한다고 해서, Maven에 Manifest를 plugin으로 추가하였다.
[ Manifest 추가 ]
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>Main</mainClass>
<addClasspath>true</addClasspath>
<addExtensions>true</addExtensions>
</manifest>
</archive>
</configuration>
</plugin>
결과
dependency 한 외부 라이브러리를 찾지 못함
* 아래 캡쳐 화면은 java.lang.NoClassDefFoundError 에러 메시지로, jsch 라이브러리를 프로젝트에서 사용하고 있는데, 찾지 못한다는 얘기다.

최종
Manifest만 plugin 한 경우에는 프로젝트에서 사용하는 외부 라이브러리가 자동적으로 추가되지 않는다고 한다.
그래서 dependency한 외부 라이브러리를 자동으로 추가해주기 위해 plugin을 추가하였다.
[ 외부 라이브러리 자동으로 추가할 수 있도록 plugin 설정 ]
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
결과
잘된다!!
pom.xml 파일에 작성한 plugins

참고 사이트
Maven 입문 | Java 응용 프로그램 개발 | maven-jar-plugin 실행 가능한 Jar 생성
앞장에서 프로그램의 실행은 간단히 했지만 아직 완전하지 않다. target 폴더에 패키지된 Jar 파일이 생성되었지만, 이를 그대로 실행하려고 하면 동작하지 않는다. 예를 들어, 아래와 같이 명령을
www.devkuma.com
https://huskdoll.tistory.com/561
Maven Build java.lang.NoClassDefFoundError 처리
Maven으로 build할때 별다른 설정없이 build하면 내가 개발한 프로그램에서 사용하는 jar파일이 같이 묶이지 않습니다. (한마디로 내가 mysql DB에 접속하는 프로그램을 짜서 빌드하면 mysql-connector-java-
huskdoll.tistory.com
항상 springboot만 쓰다가 이렇게 springboot 가 아닌 프로젝트를 단순하게라도 진행하면, 모르는게 더 많고, 해결하는데 더 오래걸리는 것 같다 ...
이제라도 springboot 가 아닌 mven project의 실행가능 jar 파일 생성을 알아서 다행이다! 라고 나를 위로해야징..
'etc' 카테고리의 다른 글
[JAVA] JAVA 로 SCP 실행하는 방법 (jSch 라이브러리) (0) | 2022.07.05 |
---|---|
[ Docker ] Docker 외부 포트 설정 (직접 명령어 & REST API 적용) (0) | 2022.07.05 |
[ wireshark ] 와이어샤크(wireshark) 사용법 (0) | 2022.06.10 |
[ java ]날짜 String -> ZonedDateTime 변환 (0) | 2022.05.30 |
[Docker] 원격으로 Docker Container 조작하기 (REST API 방식 통신 방법) (0) | 2022.04.27 |