สร้างโถไขมันโดยใช้มาเวน


118

ฉันมีฐานรหัสที่ต้องการแจกจ่ายเป็นขวดโหล นอกจากนี้ยังมีการพึ่งพาขวดภายนอกซึ่งฉันต้องการรวมไว้ในโถสุดท้าย

ฉันได้ยินมาว่าสามารถทำได้โดยใช้maven-assembly-plug-inแต่ฉันไม่เข้าใจวิธีการ ใครช่วยชี้ตัวอย่างให้ฉันดู

ตอนนี้ผมใช้กระปุกไขมันมัดโถสุดท้าย ฉันต้องการบรรลุสิ่งเดียวกันโดยใช้ maven

คำตอบ:


144

หมายเหตุ: หากคุณเป็นแอปพลิเคชันสปริงบูตอ่านส่วนท้ายของคำตอบ

เพิ่มปลั๊กอินต่อไปนี้ลงpom.xml ในเวอร์ชันล่าสุดของคุณได้ที่

...
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>CHOOSE LATEST VERSION HERE</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>assemble-all</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
...

หลังจากกำหนดค่าปลั๊กอินนี้แล้วการรันmvn packageจะสร้างขวดสองอัน: หนึ่งกระปุกมีเฉพาะคลาสโปรเจ็กต์และโถไขมันที่สองที่มีการอ้างอิงทั้งหมดโดยมีคำต่อท้าย "-jar-with-dependencies"

หากคุณต้องการclasspathตั้งค่าที่ถูกต้องในรันไทม์ให้เพิ่มปลั๊กอินต่อไปนี้

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>fully.qualified.MainClass</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

สำหรับแอปพลิเคชัน spring boot ให้ใช้ปลั๊กอินต่อไปนี้ (เลือกเวอร์ชันที่เหมาะสม)

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <fork>true</fork>
        <mainClass>${start-class}</mainClass>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

1
เวอร์ชันปัจจุบันของปลั๊กอินนี้คือ 2.4
guerda

13
ตอนนี้เลิกใช้แล้วและควรใช้ maven-shade-plugin แทน ดู @phlogratos คำตอบ: stackoverflow.com/a/16222965/274350
Richard Neish

2
maven-assembly-plugin สามารถลดขนาดโถไขมันได้หรือไม่?
12

1
@ ริชาร์ดคุณเห็นที่ไหนเลิกใช้แล้ว? ฉันไม่พบอะไรเลยmaven.apache.org/plugins/maven-assembly-plugin
user3833308

3
@ user3833308 "เลิกใช้แล้ว" อาจเป็นคำที่ไม่ถูกต้อง แต่เอกสารประกอบที่maven.apache.org/plugins/maven-assembly-pluginระบุว่า "หากโครงการของคุณต้องการรวมสิ่งประดิษฐ์ของคุณไว้ในโถ uber ปลั๊กอินแอสเซมบลีจะให้เพียงพื้นฐาน สนับสนุนสำหรับการควบคุมเพิ่มเติมให้ใช้ Maven Shade Plugin "
Richard Neish

55

คุณสามารถใช้Maven สีปลั๊กอิน

หลังจากกำหนดค่าปลั๊กอินเฉดสีในบิลด์ของคุณแล้วคำสั่งmvn packageจะสร้าง jar เดียวพร้อมการอ้างอิงทั้งหมดที่รวมเข้าด้วยกัน


9
นี่เป็นวิธีที่ถูกต้องในการทำ เอกสารประกอบ maven-assembly-plugin ระบุว่า: "หากโปรเจ็กต์ของคุณต้องการแพ็กเกจอาร์ติแฟกต์ของคุณใน uber-jar ปลั๊กอินแอสเซมบลีจะให้การสนับสนุนพื้นฐานเท่านั้นสำหรับการควบคุมเพิ่มเติมให้ใช้ปลั๊กอิน Maven Shade"
Richard Neish

แต่จะเอา. jar เดียวนั้นไปใช้เผยแพร่ได้อย่างไร?
DanGordon

42

บางทีคุณอาจต้องการmaven-shade-pluginรวมการอ้างอิงลดรหัสที่ไม่ได้ใช้และซ่อนการอ้างอิงภายนอกเพื่อหลีกเลี่ยงความขัดแย้ง

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <minimizeJar>true</minimizeJar>
                        <createDependencyReducedPom>true</createDependencyReducedPom>
                        <dependencyReducedPomLocation>
                            ${java.io.tmpdir}/dependency-reduced-pom.xml
                        </dependencyReducedPomLocation>
                        <relocations>
                            <relocation>
                                <pattern>com.acme.coyote</pattern>
                                <shadedPattern>hidden.coyote</shadedPattern>
                            </relocation>
                        </relocations>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

อ้างอิง:


หากหนึ่งในการเผชิญหน้าเพียงแค่ลบProvider org.apache.xerces.jaxp.SAXParserFactoryImpl not found <minimizeJar>true</minimizeJar>
koppor

หากคุณได้รับ "java.lang.SecurityException: ข้อยกเว้นของไฟล์ลายเซ็นที่ไม่ถูกต้องสำหรับแอตทริบิวต์หลักของ Manifest" การเพิ่มจากส่วนการกำหนดค่าด้านบนนี้จะช่วยได้: stackoverflow.com/a/6743609/38368
Danny Varod

12

จริงๆแล้วการเพิ่มไฟล์

<archive>
   <manifest>
    <addClasspath>true</addClasspath>
    <packageName>com.some.pkg</packageName>                     
    <mainClass>com.MainClass</mainClass>
  </manifest>
</archive>

การประกาศเป็น maven-jar-plugin ไม่ได้เพิ่มรายการคลาสหลักลงในไฟล์รายการให้ฉัน ฉันต้องเพิ่มลงใน maven-assembly-plugin เพื่อให้ได้สิ่งนั้นในรายการ


5

คุณสามารถใช้ปลั๊กอิน onejar-mavenสำหรับบรรจุภัณฑ์ โดยพื้นฐานแล้วมันจะรวมโปรเจ็กต์ของคุณและการอ้างอิงไว้ใน jar เดียวซึ่งรวมถึงไม่ใช่แค่ไฟล์ jar ของโปรเจ็กต์ของคุณเท่านั้น แต่ยังรวมถึงการอ้างอิงภายนอกทั้งหมดในรูปแบบ "jar of jar" เช่น

<build>
    <plugins>
        <plugin>
            <groupId>com.jolira</groupId>
            <artifactId>onejar-maven-plugin</artifactId>
                <version>1.4.4</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>one-jar</goal>
                        </goals>
                    </execution>
                </executions>
        </plugin>
    </plugins>
</build>

หมายเหตุ 1: ตั้งค่าตัวเลือกที่มีอยู่ในโครงการหน้าบ้าน

หมายเหตุ 2: ไม่ว่าด้วยเหตุผลใดก็ตามโครงการ onejar-maven-plugin ไม่ได้เผยแพร่ที่ Maven Central อย่างไรก็ตามjolira.comติดตามโครงการเดิมและสื่อนี้ไปกับ com.joliragroupID


เป็นไปได้ไหมที่จะเลือกการอ้างอิงที่คุณต้องการจัดแพ็คเกจด้วย? ตัวอย่างเช่นถ้า a.jar และ b.jar เป็น jar ภายนอกและฉันต้องการรวมเฉพาะ a.jar ลงใน jar สุดท้ายสิ่งที่เป็นไปได้ / กำหนดค่าได้หรือไม่?
bianca

ฉันยังเห็นของหนึ่งขวดที่รวมอยู่ในโถสุดท้ายด้วย นี้เพิ่มขนาดของโถสุดท้ายเป็นจำนวนมาก เป็นไปได้ไหมที่จะเลือกขวดภายนอกที่คุณต้องการรวมไว้ในโถสุดท้าย? นี่คือบันทึกหนึ่งโถ: pastebin.com/UwniQJ2X
bianca

ฉันไม่รู้ว่าคุณสามารถกำหนดค่าสิ่งที่รวมอยู่ได้หรือไม่ โดยพื้นฐานแล้ว one-jar จะมีการอ้างอิงทั้งหมดที่ระบุโดยโปรเจ็กต์ของคุณรวมถึงการอ้างอิงแบบสกรรมกริยาดังนั้นใช่ jar สุดท้ายมีแนวโน้มที่จะใหญ่ขึ้นหากคุณมีการอ้างอิงจำนวนมาก ค่าโสหุ้ยบางส่วนจะถูกเพิ่มเข้าไปในโถเดียวเพื่อให้ Java ทำงานกับโครงสร้าง "jar of jar"
matsev

2

อีกทางเลือกหนึ่งคือใช้ปลั๊กอินmaven shadeเพื่อสร้างuber-jarไฟล์.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version> Your Version Here </version>
    <configuration>
            <!-- put your configurations here -->
    </configuration>
    <executions>
            <execution>
                    <phase>package</phase>
                    <goals>
                            <goal>shade</goal>
                    </goals>
            </execution>
    </executions>
</plugin>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.