Java veya Spring Projeniz için gerekli tüm Bağımlılıkları içeren yalnızca 1 Yürütülebilir kavanoz oluşturmak için "maven-shade-plugin" kullanın.
Yayınlanan: 2016-11-16Sadece içindeki tüm bağımlılıkları içeren bir
Crunchify.jar
dosyası oluşturun
Geçen hafta, yürütülebilir Jar Projenizin tamamını oluşturmak için maven-resources-plugin
, maven-dependency-plugin
& maven-jar-plugin
nasıl kullanılacağına dair bir eğitim yazdım. Sonuç olarak, gerekli tüm dosyaları /target/Crunchify
klasörüne oluşturur / kopyalar.
Before:
maven kaynağı, maven bağımlılığı, maven-jar eklentilerini kullanma:
After:
maven gölge eklentisini kullanma:
Yukarıdaki sonuca nasıl ulaşılacağına başlayalım:
Burada gördüğünüz gibi Java Project'teki her şeyi just one file
topladık ve Crunchify.jar
adını verdik (tüm dosyalar içinde).
Birkaç gün önce, Maven kullanarak runnable binary distribution of a standalone Java application
oluşturmak istediğim için bunu nasıl başaracağım hakkında hiçbir fikrim yoktu. Başka bir deyişle:
- Maven ile yay tabanlı yürütülebilir kavanoz nasıl oluşturulur?
- Java + Spring + Diğer bağımlılıklar için Maven ile Çalıştırılabilir İkili Dağıtım Oluşturma
- Maven ile Java + Bahar Projeleri Nasıl İnşa Edilir?
Normalde Maven'de bağımlılık yönetimine güveniriz. Bir yapı sadece kendi sınıflarını/kaynaklarını içerir. Maven, projenin bağımlı olduğu tüm yapıtları (JAR'lar vb.) Derlerken ve çalıştırırken vb. bulmaktan sorumlu olacaktır.
maven -shade- plugin
yardımıyla bu hedefi başarabildim . Yapıyı bağımlılıkları da dahil olmak üzere bir uber-jar (One major file jar)
içinde paketleme ve bazı bağımlılıkların paketlerini gölgeleme – yani yeniden adlandırma – yeteneği sağlar.
Projemde pek çok başka bağımlılığım var, örn. Spring Framework, JSON, 3. Parti araçlar, vb. Aşağıda sadece örnek bir proje var ama üretim .jar ~5.2MB big
büyüklüğünde çıktı.
Bir
uber-jar
, tüm bağımlılıkları alan ve bağımlılıkların içeriğini çıkaran ve onu projenin sınıfları/kaynaklarıyla birlikte tek bir JAR'a koyan bir şeydir. Böyle bir uber-jar'a sahip olarak,easy for execution
, çünkü uygulamanızı çalıştırmak için tonlarca küçük JAR yerine yalnızca bir büyük JAR'a ihtiyacınız olacaktır. Ayrıca bazı durumlarda dağıtımı kolaylaştırır.
Bunu başarmak için pom.xml dosyanızı güncellemeniz gerekiyor.
Aşama 1
Tam pom.xml
dosyasına bir göz atın. Temelde <build>
etiketi ile ilgileneceksiniz.
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 > |
Burada gördüğünüz gibi pom.xml dosyasında Resource Transformers
kullanıyorum. Birkaç yapıdan gelen classes/resources
tek bir Crunchify JAR
, çakışma olmadığı sürece basittir. Aksi takdirde, birkaç JAR'dan gelen kaynakları birleştirmek için bir tür mantık gereklidir. Kaynak transformatörlerinin devreye girdiği yer burasıdır.

Adım 2
pom.xml
dosyanıza maven-shade-plugin
ekledikten sonra projenizi oluşturmak için aşağıdaki komutu kullanın.
1 |
mvn clean install |
Ve all dependencies mentioned in pom.xml file
oluşturulmuş bir Crunchify.jar
(uber-jar) dosyası görmelisiniz.
Aşama 3
Projenizin hedef klasörüne gidin ve Crunchify.jar dosyasının oluşturulduğunu göreceksiniz. Sadece komutu kullanın
$bash> java -jar Crunchify.jar
projenizi yürütmek için.
Ekleyeceğiniz bir şey var mı? Aşağıdaki yorum bölümüne ekleyin. Keyfini çıkarın, İyi günler ve Mutlu Kodlamalar.