การควบคุม maven นามสกุลของ jar jar


174

ฉันกำลังพยายามกำหนดคุณสมบัติใน super pom ของเราซึ่งจะใช้โดยโครงการลูกทั้งหมดเป็นปลายทางของสิ่งประดิษฐ์ที่สร้างขึ้น

สำหรับเรื่องนี้ฉันกำลังคิดเกี่ยวกับการใช้งานproject/build/finalNameแต่นี่ดูเหมือนจะไม่ทำงานแม้แต่สำหรับปอมธรรมดา:

คำสั่ง

 mvn archetype:create \ 
   -DarchetypeGroupId=org.apache.maven.archetypes \
   -DgroupId=com.mycompany.app \
   -DartifactId=my-app

POM

<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>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>my-app</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <build>
        <finalName>${project.name}-testing</finalName>
  </build>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

และเมื่อฉันดำเนินการ:

$ mvn install

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building my-app
[INFO]    task-segment: [install]
[INFO] ------------------------------------------------------------------------
[INFO] [resources:resources {execution: default-resources}]
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /tmp/mvn_test/my-app/src/main/resources
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Nothing to compile - all classes are up to date
[INFO] [resources:testResources {execution: default-testResources}]
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /tmp/mvn_test/my-app/src/test/resources
[INFO] [compiler:testCompile {execution: default-testCompile}]
[INFO] Nothing to compile - all classes are up to date
[INFO] [surefire:test {execution: default-test}]
[INFO] Surefire report directory: /tmp/mvn_test/my-app/target/surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.mycompany.app.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.024 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] [jar:jar {execution: default-jar}]
[INFO] [install:install {execution: default-install}]
[INFO] Installing /tmp/mvn_test/my-app/target/my-app-testing.jar to /home/maxim/.m2/repository/com/mycompany/app/my-app/1.0-SNAPSHOT/my-app-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2 seconds
[INFO] Finished at: Sun Nov 21 18:37:02 IST 2010
[INFO] Final Memory: 17M/162M
[INFO] ------------------------------------------------------------------------

ฉันคาดว่าสตริง "ทดสอบ" จะปรากฏที่ใดที่หนึ่งในชื่อสิ่งประดิษฐ์ที่สร้างขึ้น

ฉันเข้าใจผิดวัตถุประสงค์ของ "finalName" หรือไม่


ดีใจที่ได้ทราบ - ค่าเริ่มต้นทั้งหมด (รวมถึงชื่อสุดท้าย) ได้รับการถ่ายทอดมาจาก Super Pom (และเป็นแหล่งอ้างอิงที่ดี) - books.sonatype.com/mvnref-book/reference/ …
Andrejs

คำตอบ:


291

คุณตั้งค่าfinalNameคุณสมบัติในส่วนการกำหนดค่าปลั๊กอิน:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
        <finalName>myJar</finalName>                   
    </configuration>
</plugin>       

ตามที่ระบุไว้ในเอกสารที่เป็นทางการ

ปรับปรุง:

สำหรับ Maven> = 3

จากความคิดเห็นของ Matthewคุณสามารถทำสิ่งนี้ได้:

 <packaging>jar</packaging>
 <build>
   <finalName>WhatEverYouLikey</finalName>
 </build>

ดูรายงานข้อผิดพลาด / เอกสาร


2
คุณสามารถระบุ "finalName" ที่บรรทัดคำสั่งได้หรือไม่ (-Djar.finalName = x) ไม่ทำงาน
jayunit100

ฉันไม่ได้ลองใช้บรรทัดคำสั่ง คุณได้ลองวิธีแก้ปัญหา Maven แล้วหรือยัง?
Christian Vielma

1
การอัปเดตเล็กน้อย 2.4 เป็นรุ่นล่าสุด ยังคงทำงานได้ดีแม้ว่า
PaulBGD

1
ด้วยปลั๊กอิน Maven หนึ่งไม่จำเป็นต้องรวมรุ่น ฉันคิดว่ามันจะเลือกล่าสุด และหากมีคนสงสัยชื่อ jar จะไม่มีคำต่อท้ายไฟล์ดังนั้นจึงไม่มี "myJar.jar" แต่ "myJar" ตามที่แสดงในตัวอย่างได้อย่างถูกต้อง
Espinosa

13
ตั้งแต่เวอร์ชัน 3.0.0 การfinalNameกำหนดค่าได้ถูกลบออกไปแล้ว อย่างไรก็ตามวิธีการ OP ควรใช้งานได้ ดูproblems.apache.org/jira/browse/MJAR-233
แมทธิว

42

คำตอบที่ให้ทั้งหมดมีความซับซ้อนเกินความจำเป็น สมมติว่าคุณกำลังสร้างไฟล์ jar ทั้งหมดที่คุณต้องทำคือเพิ่ม<jar.finalName>แท็กใน<properties>ส่วนของคุณ:

<properties>
    <jar.finalName>${project.name}</jar.finalName>
</properties>

สิ่งนี้จะสร้างขวด:

project/target/${project.name}.jar

นี่คือในเอกสารประกอบ - โปรดสังเกตUser Property:

finalName:
Name of the generated JAR.
Type: java.lang.String
Required: No
User Property: jar.finalName
Default: ${project.build.finalName}

การใช้บรรทัดคำสั่ง

คุณควรใช้ตัวเลือกนี้ในบรรทัดคำสั่งด้วย:

mvn -Djar.finalName=myCustomName ...

คุณควรได้รับ myCustomName.jar แม้ว่าฉันจะยังไม่ได้ทดสอบก็ตาม


6
กับฤดูใบไม้ผลิ Boot นี้ไม่ได้ทำงานเป็นstackoverflow.com/a/14490656/2294031 ในขณะที่<jar.finalName>foo</jar.finalName>สร้างสองขวด: ขวดปฏิบัติการรวมทั้งการอ้างอิงชื่อfoo-${project.version}.jarและขวดที่สองเท่านั้นที่มีโครงการที่มีชื่อ${project.name}-${project.version}.jar, <build><finalName>foo</finalName></build>สร้างเพียงขวดปฏิบัติการรวมทั้งการอ้างอิงชื่อfoo.jar
Snozzlebert

ใช้งานได้และฉันยอมรับว่านี่เป็นคำตอบง่ายๆและคุณยังสามารถทำได้ <jar.finalName> $ {groupId} - $ {ifactId} - $ {version} </ jar.finalName>
นักพัฒนา MG

37

@Maxim
ลองนี้ ...

pom.xml

 <groupId>org.opensource</groupId>
 <artifactId>base</artifactId>
 <version>1.0.0.SNAPSHOT</version>

  ..............
<properties>
    <my.version>4.0.8.8</my.version>
</properties>

<build>
    <finalName>my-base-project</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.3.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <phase>install</phase>
                    <configuration>
                        <file>${project.build.finalName}.${project.packaging}</file>
                        <generatePom>false</generatePom>
                        <pomFile>pom.xml</pomFile>
                        <version>${my.version}</version>
                    </configuration>
                </execution>
            </executions>
        </plugin>
</plugins>
</build>

Commnad mvn clean install

เอาท์พุต

[INFO] --- maven-jar-plugin:2.3.1:jar (default-jar) @ base ---
[INFO] Building jar: D:\dev\project\base\target\my-base-project.jar
[INFO]
[INFO] --- maven-install-plugin:2.3.1:install (default-install) @ base ---
[INFO] Installing D:\dev\project\base\target\my-base-project.jar to H:\dev\.m2\repository\org\opensource\base\1.0.0.SNAPSHOT\base-1.0.0.SNAPSHOT.jar
[INFO] Installing D:\dev\project\base\pom.xml to H:\dev\.m2\repository\org\opensource\base\1.0.0.SNAPSHOT\base-1.0.0.SNAPSHOT.pom
[INFO]
[INFO] --- maven-install-plugin:2.3.1:install-file (default) @ base ---
[INFO] Installing D:\dev\project\base\my-base-project.jar to H:\dev\.m2\repository\org\opensource\base\4.0.8.8\base-4.0.8.8.jar
[INFO] Installing D:\dev\project\base\pom.xml to H:\dev\.m2\repository\org\opensource\base\4.0.8.8\base-4.0.8.8.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------


การอ้างอิง


5
ในกรณีของฉัน <file> ต้องเป็น <file> $ {build.directory} / $ {project.build.finalName}. $ {project.packaging} </file>
Cpt Senkfuss

2
ความแตกต่างระหว่างการใส่แท็ก finalName โดยตรงใน maven-install-plugin VS maven-jar-plugin คืออะไร
Pocketkid2

นี่เยี่ยมมากฉันสามารถใช้เคล็ดลับนี้เพื่อเผยแพร่ไฟล์. xml โดยตรงเป็นสิ่งประดิษฐ์
Benjamin Damm

1
มันเป็นสิ่งก่อสร้างพื้นฐาน-1.0.0.SNAPSHOT.jar แล้วตามด้วย -4.0.8.8.jar
ทำเครื่องหมาย W

1
ทำไมจึงติดตั้งสิ่งประดิษฐ์สองครั้งด้วยชื่อสองชื่อ โปรดแสดงการกำหนดค่าเพื่อติดตั้งเพียงครั้งเดียว
chrisinmtown

18

ที่ระยะแพคเกจปลั๊กอินอนุญาตการกำหนดค่าของชื่อไฟล์ที่นำเข้าผ่านการแมปไฟล์:

Maven หูปลั๊กอิน

http://maven.apache.org/plugins/maven-ear-plugin/examples/customize-file-name-mapping.html

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-ear-plugin</artifactId>
    <version>2.7</version>
    <configuration>
       [...]
        <fileNameMapping>full</fileNameMapping>
    </configuration>
</plugin>

http://maven.apache.org/plugins/maven-war-plugin/war-mojo.html#outputFileNameMapping

หากคุณได้กำหนดค่าเวอร์ชันของคุณให้เป็น "การทดสอบ" ผ่านโปรไฟล์หรือบางอย่างสิ่งนี้จะใช้ได้กับแพ็คเกจสงคราม:

Maven สงครามปลั๊กอิน

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.2</version>
    <configuration>
        <encoding>UTF-8</encoding>                        
        <outputFileNameMapping>@{groupId}@-@{artifactId}@-@{baseVersion}@@{dashClassifier?}@.@{extension}@</outputFileNameMapping>
    </configuration>
</plugin>

1
และสำหรับโถเก็บถาวร?
Stephane


3

วิธีการที่คุณใช้จริง ๆ แล้วไฟล์ jar มีสตริง 'การทดสอบ' ในชื่อตามที่คุณระบุ แต่คำสั่งติดตั้งเริ่มต้นจะส่งไปยังไดเร็กทอรี ~ / .m2 / repository ของคุณดังที่เห็นในบรรทัดเอาต์พุตนี้:

/tmp/mvn_test/my-app/target/my-app-testing.jar to /home/maxim/.m2/repository/com/mycompany/app/my-app/1.0-SNAPSHOT/my-app-1.0-SNAPSHOT.jar

ดูเหมือนว่าฉันกำลังพยายามสร้างขวดที่มีชื่อดังกล่าวแล้วคัดลอกไปยังไดเรกทอรีที่คุณเลือก

ลองใช้คุณสมบัติ outputDirectory ตามที่อธิบายไว้ที่นี่: http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html


ที่จริงแล้วการตั้งค่าที่สมบูรณ์ของฉันมีดังต่อไปนี้: ฉันมี superpom ที่ฉันต้องการกำหนดเวอร์ชันปัจจุบันที่ฉันกำลังสร้าง จากนั้นฉันก็มีหลายโครงการที่กำหนด pom นี้เป็นผู้ปกครอง ฉันใช้ฮัดสัน - ซีไอเพื่อสร้างโครงการเหล่านี้ทั้งหมด จากนั้นฮัดสันผลักโครงการเข้าไปในสิ่งประดิษฐ์ ฉันกำลังค้นหาสิ่งที่จะทำให้ฉันสามารถเปลี่ยนรุ่นที่กำลังสร้างอยู่ ฉันจะดูว่าฉันสามารถใช้อินพุตใหม่ของคุณได้อย่างไร ขอบคุณ.
Maxim Veksler

ดังนั้น ... เพื่อที่จะควบคุมเวอร์ชันที่จะติดตั้งฉันจำเป็นต้องแทนที่พารามิเตอร์ maven อื่นหรือไม่
Maxim Veksler

7
ไม่ถูกต้อง ชื่อในธุรกรรมซื้อคืนในท้องถิ่นได้รับการทำให้เป็นมาตรฐาน: groupId/artifactId/version/artifactId-version-classifier.packaging. finalName นำไปใช้กับชื่อไฟล์โลคัลในไดเร็กทอรีเอาต์พุตเท่านั้น
ฌอนแพทริคฟลอยด์

ขอบคุณที่สังเกต จริง ๆ แล้วบรรทัดที่ฉันยกมาแสดงข้อผิดพลาดของฉัน อย่างไรก็ตามฉันได้รับความประทับใจว่าสิ่งที่ Maxim ต้องการคือขวดในไดเรกทอรีท้องถิ่น
Goran Jovic

@SeanPatrickFloyd มีวิธีใดในการเปลี่ยน artifactId-version-classifier.packaging เป็นชื่อ cutom หรือไม่
Khalid Abu El-Soud

2

ฉันใช้สิ่งต่อไปนี้

        ....
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.0.2</version>
            <configuration>
                <finalName>${project.groupId}/${project.artifactId}-${baseVersion}.${monthlyVersion}.${instanceVersion}</finalName>
            </configuration>
        </plugin>
        ....

วิธีนี้คุณสามารถกำหนดค่าแต่ละค่าแยกกันหรือในทางปฏิบัติจากเจนกินส์ของระบบอื่น

mvn package -DbaseVersion=1 -monthlyVersion=2 -instanceVersion=3

จะเป็นการวางโฟลเดอร์ target\{group.id}\projectName-1.2.3.jar

วิธีที่ดีกว่าในการประหยัดเวลาอาจเป็น

        ....
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.0.2</version>
            <configuration>
                <finalName>${project.groupId}/${project.artifactId}-${baseVersion}</finalName>
            </configuration>
        </plugin>
        ....

เหมือนกันยกเว้นฉันใช้กับตัวแปร

  mvn package -DbaseVersion=0.3.4

จะเป็นการวางโฟลเดอร์ target\{group.id}\projectName-1.2.3.jar

คุณยังสามารถใช้ outputDirectoryด้านในของconfigurationเพื่อระบุตำแหน่งที่คุณอาจต้องการให้แพ็คเกจอยู่


1

ในโครงการ Maven ee ของฉันฉันใช้:

<build>
    <finalName>shop</finalName>

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>${maven.war.version}</version>
            <configuration><webappDirectory>${project.build.directory}/${project.build.finalName}     </webappDirectory>
            </configuration>
        </plugin>
    </plugins>
</build>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.