เป็นไปได้ไหมที่จะเปลี่ยนชื่อ maven jar-with-dependencies?


141

ฉันกำลังใช้แอสเซมบลี jar-with-dependencies เพื่อสร้าง jar อย่างไรก็ตามชื่อโถของฉันยาวไปหน่อย

เนื่องจาก jar นี้ถูกใช้โดยโปรแกรม RPG บน AS400 ฉันจึงต้องการย่อให้สั้นลงเพื่อให้ชีวิตง่ายขึ้นสำหรับนักพัฒนาเหล่านั้น แต่อื่น ๆ project-name-version-classifier-jar-with-dependencies.jarกว่าด้วยมือฉันไม่ได้พบวิธีที่จะเปลี่ยนชื่อไหจากปกติ ฉันต้องการบางสิ่งบางอย่างเช่นproject-name-version-classifier-full.jar

มีอยู่แล้วที่จะทำสิ่งนี้โดยไม่ต้องคัดลอกตัวอธิบายแอสเซมบลี jar-with-dependencies และเรียกมันว่าเต็มหรือไม่?

นอกจากนี้ฉันต้องการที่จะมี jar ต่อไปโดยที่ classpath ไม่ประกอบเก็บไว้ในที่เก็บ

ฉันต้องการสิ่งประดิษฐ์สองชิ้น โถที่มีลักษณนามของฉันถือภูมิภาคที่สร้างไว้ โถที่มีการอ้างอิงทั้งหมดซึ่งรวมถึงภูมิภาคด้วย

project-name-version-region-full.jarและproject-name-version-region.jarควรเก็บไว้ในที่เก็บ ในตัวอย่างแรกลักษณนามเป็นภูมิภาคเต็มในภูมิภาคที่ 2 ตอนหลังกำลังทำงาน

คำตอบ:


235

คุณสามารถระบุคุณสมบัติfinalNameเพื่อตั้งชื่อ jar ที่คุณต้องการและระบุว่าappendAssemblyIdควรเป็นเท็จเพื่อหลีกเลี่ยงคำต่อท้าย "jar-with-dependencies"

การกำหนดค่าด้านล่างจะแสดง jar ที่เรียกว่า "test.jar"

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.2-beta-4</version>
  <executions>
    <execution>
      <id>jar-with-dependencies</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <finalName>test</finalName>
        <appendAssemblyId>false</appendAssemblyId>
      </configuration>
    </execution>
  </executions>
</plugin>

อัปเดต: ตามความคิดเห็นของคุณการใช้ตัวอธิบายในตัวจะไม่ทำงาน ฉันเชื่อว่านี่เป็นข้อผิดพลาดในแอสเซมบลีปลั๊กอินเวอร์ชันล่าสุด - พวกเขาได้ลบการรองรับตัวแยกประเภทออกไปแล้ว แต่ id จะได้รับการแก้ไขหากคุณใช้ตัวบอกในตัวดังนั้นคุณจึงมีชื่อที่ไม่ดี

ในการแก้ปัญหาชั่วคราวคุณสามารถคัดลอกตัวอธิบายแอสเซมบลีที่ใช้โดยตัวอธิบายjar-with-dependenciesและแก้ไข id

ตัวอย่างนี้จะส่งผลให้ id แอสเซมบลีต่อท้าย finalName ดังนั้นหากคุณต้องการชื่อของregion-full.jarคุณสามารถระบุ finalName เป็นภูมิภาคและ id แอสเซมบลีเป็นแบบเต็มได้ สิ่งนี้จะส่งผลให้ไฟล์อยู่ในเป้าหมายที่เรียกว่า region-full.jar แต่โปรดทราบว่าไฟล์นั้นจะยังคงถูกติดตั้งลงในที่เก็บ Maven เป็นอาร์ติแฟกต์ที่แนบมาโดยใช้แบบเต็มเป็นตัวจำแนก ตราบใดที่รหัสนี้แตกต่างจากที่ใช้กับชุดประกอบอื่น ๆ ของคุณก็ไม่ควรมีการชนกัน

การกำหนดค่า pom จะมีลักษณะเช่นนี้

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.2-beta-4</version>
  <executions>
    <execution>
      <id>jar-with-dependencies</id>
      <phase>prepare-package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <descriptors>
          <descriptor>src/main/assembly/jar-assembly.xml</descriptor>
        </descriptors>
        <finalName>region</finalName>
      </configuration>
    </execution>
  </executions>
</plugin>

และ jar-assembly.xml ใน src / main / assembly เช่นนี้:

<assembly>
  <id>full</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <unpack>true</unpack>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
  <fileSets>
    <fileSet>
      <directory>${project.build.outputDirectory}</directory>
    </fileSet>
  </fileSets>
</assembly>

การทำงานอย่างละเอียดนั้นรวย โดยพื้นฐานแล้วฉันต้องการสิ่งประดิษฐ์ลักษณนามสองชิ้นเพื่อจัดเก็บ เมื่อเปิด appendAssemblyId ฉันมี 3 artifiact หนึ่งอันไม่มีตัวแยกประเภทเวอร์ชันลักษณนามและเวอร์ชัน jar-with-dependencies ด้วย appendAssemblyID ปิดโถ uber ถูกติดตั้งเป็นเวอร์ชันที่ไม่ใช่ตัวจำแนก ฉันต้องให้เจ้าพวกนี้ใช้ภูมิภาค + ลักษณนามแบบเต็มที่บอกว่าสร้างมาเพื่อที่ไหน ขออภัยไม่สามารถเพิ่มแท็กลักษณนาม
Mike Cornell

37

ฉันคิดว่าฉันพบวิธีกำหนดค่าสิ่งนี้โดยตรงใน pom โดยไม่ต้องใช้ jar-assembly.xml แยกต่างหาก

โดยพื้นฐานแล้วจะเหมือนกับคำตอบของ Rich ยกเว้น finalName ถูกระบุด้วย artifactId และเวอร์ชัน

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <finalName>${project.artifactId}-${project.version}-full</finalName>
        <appendAssemblyId>false</appendAssemblyId>
        <archive>
            <manifest>
                <mainClass>com.mycompany.MyMainClass</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-my-jar-with-dependenciess</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

8

ขอบคุณโพสต์ที่นี่และการขุดในเอกสาร mavenฉันได้สร้างการกำหนดค่าต่อไปนี้สำหรับแอสเซมบลี jar ปฏิบัติการที่บรรจุใหม่ได้แบบครั้งเดียวโดยใช้ชื่อที่กำหนดเอง

ใน pom.xml:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2</version>
    <executions>
        <execution>
            <id>exe</id>
            <phase>package</phase>
            <goals><goal>single</goal></goals>
            <configuration>
                <finalName>MyJarName</finalName>
                <attach>false</attach>
                <appendAssemblyId>false</appendAssemblyId>
                <descriptors>
                    <descriptor>assembly.xml</descriptor>
                </descriptors>
                <archive>
                    <manifest>
                        <mainClass>karlthepagain.MyMain</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </execution>
    </executions>
</plugin>

ใน assembly.xml:

<assembly>
    <id>exe</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <unpack>true</unpack>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
</assembly>

นี้จะผลิตที่มีทั้งหมดของพึ่งพากำลังบรรจุลงในขวดเดียวกันกับที่และที่ระบุไว้MyJarName.jarMain-Class: karlthepagain.MyMain


3

ฉันจะให้เครดิตแก่ Rich ในการชี้ทิศทางที่ถูกต้อง แต่ต้องการโพสต์วิธีแก้ปัญหาที่เหมาะกับฉันเนื่องจาก Rich รู้สึกไม่พอใจเล็กน้อย:

jar-assembly.xml ของฉันมีลักษณะเช่นนี้ซึ่งอนุญาตให้ id แอสเซมบลีเปลี่ยนสำหรับภูมิภาคที่เก็บไว้เป็นคุณสมบัติในโปรไฟล์ของฉัน:

<assembly>
  <id>${env}-full</id>
    <formats>
      <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
      <dependencySet>
        <unpack>true</unpack>
        <scope>runtime</scope>
      </dependencySet>
    </dependencySets>
    <fileSets>
      <fileSet>
        <directory>${project.build.outputDirectory}</directory>
      </fileSet>
    </fileSets>
</assembly>

ฉันไม่ได้ใช้พารามิเตอร์ finalName ในการตั้งค่า maven-assembly-plugin เนื่องจากสร้างโปรเจ็กต์ของฉันด้วยชื่อ project-name-version-env-full.jar โดยที่ env-full เป็นตัวจำแนก

ลองนึกภาพความประหลาดใจของฉันเมื่อฉันเรียนรู้ว่า xml แอสเซมบลีสามารถกำหนดพารามิเตอร์ตามรายการในบิลด์ นี่คือสิ่งที่ฉันกำลังมองหา


2

สิ่งนี้ได้ผลสำหรับฉัน

<build>
    <finalName>anynameyoulike</finalName>
    <plugins>           
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>                   
                <appendAssemblyId>false</appendAssemblyId>
                <archive>
                    <manifest>
                        <mainClass>com.mycompany.MyMainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id> <!-- this is used for inheritance merges -->
                    <phase>package</phase> <!-- bind to the packaging phase -->
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

2

นอกจากนี้ยังสามารถเขียนทับไฟล์ jar ดั้งเดิมได้โดยใช้${project.build.finalName}เป็นนามสกุล:

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
   <executions>
      <execution>
          <phase>package</phase>
          <goals>
             <goal>single</goal>
          </goals>
      </execution>
   </executions>
   <configuration>
     <descriptorRefs>
       <descriptorRef>jar-with-dependencies</descriptorRef>
     </descriptorRefs>
     <finalName>${project.build.finalName}</finalName>
     <appendAssemblyId>false</appendAssemblyId>
   </configuration>
 </plugin>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.