ใช้ “maven-shade-plugin” เพื่อสร้าง jar ที่ปฏิบัติการได้เพียง 1 รายการพร้อมการอ้างอิงที่จำเป็นทั้งหมดในนั้นสำหรับ Java หรือ Spring Project ของคุณหรือไม่
เผยแพร่แล้ว: 2016-11-16เพียงสร้างไฟล์
Crunchify.jar
หนึ่งไฟล์ที่มีการขึ้นต่อกันทั้งหมดอยู่ภายใน
สัปดาห์ที่แล้วฉันเขียนบทช่วยสอนเกี่ยวกับวิธีใช้ maven-resources-plugin
, maven-dependency-plugin
& maven-jar-plugin
เพื่อสร้าง Jar Project ที่ปฏิบัติการได้ทั้งหมดของคุณหรือไม่ เป็นผลให้มันสร้าง / คัดลอกไฟล์ที่จำเป็นทั้งหมดไปยังโฟลเดอร์ /target/Crunchify
Before:
การใช้ maven-resource, maven-dependency, ปลั๊กอิน maven-jar:
After:
การใช้ปลั๊กอิน maven-shade:
มาเริ่มกันเลยดีกว่าเพื่อให้ได้ผลลัพธ์ข้างต้น:
อย่างที่คุณเห็น เราได้รวมทุกอย่างจาก Java Project ไว้ใน just one file
และเราได้ตั้งชื่อ Crunchify.jar
(พร้อมไฟล์ทั้งหมดอยู่ภายใน)
เมื่อไม่กี่วันก่อน ฉันไม่รู้ว่าจะทำอย่างไรให้สำเร็จ เนื่องจากฉันต้องการสร้างการ runnable binary distribution of a standalone Java application
โดยใช้ Maven กล่าวอีกนัยหนึ่ง:
- จะสร้าง jar ที่ปฏิบัติการได้แบบสปริงด้วย maven ได้อย่างไร?
- การสร้าง Runnable Binary Distribution ด้วย Maven สำหรับ Java + Spring + การพึ่งพาอื่น ๆ
- จะสร้างโปรเจ็กต์ Java + Spring ด้วย Maven ได้อย่างไร
โดยปกติใน 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 > |
อย่างที่คุณเห็นที่นี่ฉันกำลังใช้ Resource Transformers
ในไฟล์ pom.xml การรวม classes/resources
จากอาร์ติแฟกต์ต่างๆ ให้เป็นหนึ่ง Crunchify JAR
นั้นตรงไปตรงมา ตราบใดที่ไม่มีการทับซ้อนกัน ไม่เช่นนั้น จำเป็นต้องมีตรรกะบางอย่างในการผสานทรัพยากรจาก JAR หลายรายการ นี่คือจุดที่หม้อแปลงทรัพยากรเข้ามา

ขั้นตอนที่ 2
เมื่อคุณเพิ่ม maven-shade-plugin
ลงในไฟล์ pom.xml
แล้ว เพียงใช้คำสั่งด้านล่างเพื่อสร้างโครงการของคุณ
1 |
mvn clean install |
และคุณควรเห็น Crunchify.jar
(uber-jar) หนึ่งไฟล์ที่สร้างขึ้นพร้อม all dependencies mentioned in pom.xml file
ภายใน
ขั้นตอนที่ 3
ไปที่โฟลเดอร์เป้าหมายของโครงการแล้วคุณจะเห็นไฟล์ Crunchify.jar ถูกสร้างขึ้น เพียงใช้คำสั่ง
$bash> java -jar Crunchify.jar
เพื่อดำเนินการโครงการของคุณ
คุณมีอะไรจะเพิ่มไหม เพิ่มในส่วนความคิดเห็นด้านล่าง เพลิดเพลิน มีวันที่ดีข้างหน้าและ Happy Coding