from
manifest
jar { manifest{...} }에 메인 클래스를 지정해준다. jar {
from {
configurations.compileClasspath.files.collect {
it.isDirectory() ? it : zipTree(it)
}
//configurations.runtimeClasspath.collect {
// it.isDirectory() ? it : zipTree(it)
// }
}
manifest {
attributes 'Main-Class': 'com.pacakage.Launcher'
}
}
manifest만 작성한 경우 라이브러리들이 묶여지지 않는다.

from을 함께 작성한 경우 jar에 라이브러리들이 묶여진다.

.java 파일 외 xml 등의 resource파일은 src/main/resources 내부에 두는 것이 권장 설정이다. .class 파일만 빌드 대상이므로 , src/main/java 내부에 *.mapper.xml 등의 파일이 있는 경우 빌드 대상에서 제외되어 추가적인 설정이 필요하다.
sourceSets {
main {
resources {
srcDirs 'src/main/java'
}
}
}
src/main/java에 포함된 *.xml 파일들이 jar에 묶여지지 않았다.

sourceSets 설정 후 *.xml 파일들이 jar에 묶여진 것을 볼 수 있다.


위 작업을 수행하면 build/libs 디렉토리에 jar 파일이 생성된 것을 볼 수 있다. 😉
그런데...
리눅스 환경에서 쉘 파일로 실행해도 로그에 아무 것도 뜨지 않아
명령어를 직접 실행해 보니 아래와 같은 오류가 발생했다.

MANIFEST.MF 파일을 확인해 보니 메인 클래스 설정은 잘 돼있고 ..
jar 파일 안에도 메인 클래스 파일이 정상적으로 있는데 뭘까.........
구글링 결과 .. 운영 환경에서 jar 파일 실행 시 ,
dependency에 걸려있는 라이브러리 파일을 모두 복사해야 하고, 그 라이브러리가 사용하고 있는 라이브러리 까지 복사해서 클래스패스에 넣어줘야 하는데 빌드 시 이런 과정을 거치지 않아 생긴 오류로 추정 중이다. 😢
(Maven을 사용하고 있다면 기본적으로 포함되어 있는 dependency:copy-dependencies 플러그인으로 쉽게 되지만, Gradle은 이러한 기능이 없다고 함. )
build/libs 경로에 jar 파일로 패키징된다.
plugins {
...
id 'com.github.johnrengelman.shadow' version '6.1.0'
...
}
jar task가 실행될 때 마다 shadowJar가 실행되게 하려면, 아래처럼 jar에 finalizedBy를 달아주면 된다.
jar {
finalizedBy shadowJar
from {
configurations.compileClasspath.files.collect {
it.isDirectory() ? it : zipTree(it)
}
//configurations.runtimeClasspath.collect {
// it.isDirectory() ? it : zipTree(it)
// }
}
manifest {
attributes 'Main-Class': 'com.pacakage.Launcher'
}
}
Gradle Tasks 탭에서 빌드를 하게 되면 build/libs 경로에 2개의 파일이 생성된다.

shadowJar로 생성한 jar로 실행하니 잘 동작했다. 🥰
jvm 동작 방식과 gradle 사용법에 대한 학습을 더 해야할듯....
출처
https://gyrfalcon.tistory.com/entry/Gradle-Executable-jar
http://daplus.net/gradle-gradle%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%A2%85%EC%86%8D%EC%84%B1%EC%9D%B4%EC%9E%88%EB%8A%94-jar-%EB%B9%8C%EB%93%9C/
https://tlo-developer.tistory.com/275
https://da-nyee.github.io/posts/java-gradle-dependency-configurations/
https://jjeong.tistory.com/1565
https://sup2is.tistory.com/73
https://kkang-joo.tistory.com/3
https://pasudo123.tistory.com/416
https://blog.leocat.kr/notes/2017/10/11/gradle-shadowjar-make-fat-jar
https://blog.leocat.kr/notes/2017/10/10/gradle-copy-dependencies