"maven-shade-plugin"을 사용하여 Java 또는 Spring 프로젝트에 필요한 모든 종속성을 포함하는 단 1개의 실행 가능한 jar를 생성하시겠습니까?
게시 됨: 2016-11-16모든 종속성이 포함된
Crunchify.jar
파일 하나를 생성하기만 하면 됩니다.
지난 주에 maven-resources-plugin
, maven-dependency-plugin
& maven-jar-plugin
을 사용하여 완전한 실행 가능한 Jar 프로젝트를 생성하는 방법에 대한 튜토리얼을 작성했습니다. 결과적으로 /target/Crunchify
폴더에 필요한 모든 파일을 생성/복사합니다.
Before:
maven-resource, maven-dependency, maven-jar 플러그인 사용:
After:
maven-shade 플러그인 사용:
위의 결과를 얻는 방법을 시작해 보겠습니다.
보시다시피 Java 프로젝트의 모든 것을 just one file
로 묶었고 이름을 Crunchify.jar
(모든 파일 포함)로 지정했습니다.
며칠 전에는 Maven을 사용하여 runnable binary distribution of a standalone Java application
를 만들고 싶었기 때문에 이를 달성하는 방법에 대해 전혀 몰랐습니다. 다시 말해:
- maven으로 스프링 기반 실행 가능한 jar를 만드는 방법은 무엇입니까?
- Maven for Java + Spring + 기타 종속성을 사용하여 실행 가능한 바이너리 배포 만들기
- Maven으로 Java + Spring 프로젝트를 빌드하는 방법은 무엇입니까?
일반적으로 Maven에서는 종속성 관리에 의존합니다. 아티팩트에는 자체 클래스/리소스만 포함됩니다. Maven은 컴파일 및 실행할 때 프로젝트가 종속된 모든 아티팩트(JAR 등)를 찾을 책임이 있습니다.
maven -shade- plugin
의 도움으로 이 목표를 달성할 수 있었습니다 . 종속성을 포함하여 uber-jar (One major file jar)
에 아티팩트를 패키징하고 일부 종속성의 패키지를 음영 처리(즉, 이름 바꾸기)하는 기능을 제공합니다.
내 프로젝트에는 Spring Framework, JSON, 타사 도구 등과 같은 다른 종속성이 너무 많습니다. 아래는 샘플 프로젝트이지만 프로덕션 .jar 파일은 ~5.2MB big
로 나왔습니다.
uber-jar
는 모든 종속성을 취하고 종속성의 내용을 추출하여 프로젝트 자체의 클래스/리소스와 함께 하나의 JAR에 넣는 것입니다. 이러한 uber-jar가 있으면easy for execution
. 앱을 실행하는 데 수많은 작은 JAR 대신 하나의 큰 JAR만 필요하기 때문입니다. 또한 경우에 따라 배포를 용이하게 합니다.
이를 위해서는 pom.xml 파일을 업데이트해야 합니다.
1 단계
완전한 pom.xml
파일을 살펴보십시오. 주로 <build>
태그에 관심이 있을 것입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
< project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns : xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi : schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > < modelVersion > 4.0.0 < / modelVersion > < groupId > CrunchifyMavenBuildPlugins < / groupId > < artifactId > CrunchifyMavenBuildPlugins < / artifactId > < version > 0.0.1 - SNAPSHOT < / version > < name > CrunchifyMavenBuildPlugins < / name > < properties > < project . build . sourceEncoding > UTF - 8 < / project . build . sourceEncoding > < / properties > < dependencies > < dependency > < groupId > log4j < / groupId > < artifactId > log4j < / artifactId > < version > 1.2.17 < / version > < / dependency > < dependency > < groupId > com . googlecode . json - simple < / groupId > < artifactId > json - simple < / artifactId > < version > 1.1 < / version > < / dependency > < dependency > < groupId > axis < / groupId > < artifactId > axis < / artifactId > < version > 1.4 < / version > < / dependency > < dependency > < groupId > commons - beanutils < / groupId > < artifactId > commons - beanutils < / artifactId > < version > 1.8.3 < / version > < / dependency > < dependency > < groupId > commons - collections < / groupId > < artifactId > commons - collections < / artifactId > < version > 3.2.1 < / version > < / dependency > < dependency > < groupId > commons - configuration < / groupId > < artifactId > commons - configuration < / artifactId > < version > 1.10 < / version > < / dependency > < dependency > < groupId > commons - io < / groupId > < artifactId > commons - io < / artifactId > < version > 2.4 < / version > < / dependency > < dependency > < groupId > javax . mail < / groupId > < artifactId > mail < / artifactId > < version > 1.4.7 < / version > < / dependency > < dependency > < groupId > javax . servlet < / groupId > < artifactId > servlet - api < / artifactId > < version > 2.5 < / version > < / dependency > < dependency > < groupId > org . json < / groupId > < artifactId > json < / artifactId > < version > 20140107 < / version > < / dependency > < dependency > < groupId > axis < / groupId > < artifactId > axis - saaj < / artifactId > < version > 1.4 < / version > < / dependency > < dependency > < groupId > wsdl4j < / groupId > < artifactId > wsdl4j < / artifactId > < version > 1.6.3 < / version > < / dependency > < dependency > < groupId > com . google . zxing < / groupId > < artifactId > core < / artifactId > < version > 2.0 < / version > < / dependency > < / dependencies > < build > < pluginManagement > < plugins > < plugin > < groupId > org . apache . maven . plugins < / groupId > < artifactId > maven - compiler - plugin < / artifactId > < version > 2.3.1 < / version > < configuration > < source > 1.7 < / source > < target > 1.7 < / target > < / configuration > < / plugin > < / plugins > < / pluginManagement > < plugins > < plugin > < groupId > org . apache . maven . plugins < / groupId > < artifactId > maven - shade - plugin < / artifactId > < version > 1.7 < / version > < executions > < execution > < phase > package < / phase > < goals > < goal > shade < / goal > < / goals > < configuration > < ! -- Optional Start -- > < finalName > Crunchify < / finalName > < shadedArtifactAttached > true < / shadedArtifactAttached > < shadedClassifierName > jar - with - dependencies < / shadedClassifierName > < ! -- Optional End -- > < transformers > < transformer implementation = "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer" > < mainClass > com . crunchify . tutorial . CrunchifyMain < / mainClass > < / transformer > < transformer implementation = "org.apache.maven.plugins.shade.resource.AppendingTransformer" > < resource > META - INF / spring . handlers < / resource > < / transformer > < transformer implementation = "org.apache.maven.plugins.shade.resource.AppendingTransformer" > < resource > META - INF / spring . schemas < / resource > < / transformer > < transformer implementation = "org.apache.maven.plugins.shade.resource.AppendingTransformer" > < resource > META - INF / spring . tooling < / resource > < / transformer > < / transformers > < / configuration > < / execution > < / executions > < / plugin > < / plugins > < / build > < / project > |
여기에서 볼 수 있듯이 pom.xml 파일에서 Resource Transformers
를 사용하고 있습니다. 여러 아티팩트의 classes/resources
를 하나 Crunchify JAR
로 집계하는 것은 겹치지 않는 한 간단합니다. 그렇지 않으면 여러 JAR의 리소스를 병합하는 일종의 논리가 필요합니다. 여기에서 리소스 변환기가 시작됩니다.

2 단계
pom.xml
파일에 maven-shade-plugin
을 추가한 다음 아래 명령을 사용하여 프로젝트를 빌드하십시오.
1 |
mvn clean install |
그리고 내부 all dependencies mentioned in pom.xml file
으로 생성된 하나 Crunchify.jar
(uber-jar) 파일이 표시되어야 합니다.
3단계
프로젝트의 대상 폴더로 이동하면 Crunchify.jar 파일이 생성된 것을 볼 수 있습니다. 그냥 명령을 사용
$bash> java -jar Crunchify.jar
을 사용하여 프로젝트를 실행합니다.
추가할 사항이 있습니까? 아래 댓글 섹션에 추가하세요. 즐감하시고 즐거운 하루 되시고 해피코딩 하세요.