Mengontrol nama belakang artefak jar


174

Saya mencoba mendefinisikan properti di super pom kami yang akan digunakan oleh semua proyek anak sebagai tujuan artefak yang dihasilkan.

Untuk ini saya berpikir tentang menggunakan project/build/finalNamenamun ini sepertinya tidak berhasil, bahkan untuk pom sederhana:

Perintah

 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>

Dan ketika saya mengeksekusi:

$ 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] ------------------------------------------------------------------------

Saya berharap string "pengujian" akan muncul di suatu tempat di nama artefak yang dihasilkan.

Apakah saya salah memahami tujuan "nama akhir"?


Senang mengetahui - semua default (termasuk nama akhir) diwarisi dari Super Pom (dan merupakan sumber referensi yang baik) - books.sonatype.com/mvnref-book/reference/…
Andrejs

Jawaban:


291

Anda mengatur finalNameproperti di bagian konfigurasi plugin:

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

Seperti yang ditunjukkan dalam dokumentasi resmi .

Memperbarui:

Untuk Maven> = 3

Berdasarkan komentar Matthew Anda sekarang dapat melakukannya seperti ini:

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

Lihat laporan bug / dokumentasi .


2
Bisakah Anda menentukan "finalName" di baris perintah? (-Djar.finalName = x) tampaknya tidak berfungsi.
jayunit100

Saya belum mencoba menggunakan baris perintah. Sudahkah Anda mencoba solusi Maven?
Christian Vielma

1
Sedikit pembaruan, 2.4 adalah versi terbaru. Masih bekerja dengan baik.
PaulBGD

1
Dengan plugin Maven kita tidak harus menyertakan versi. Saya menganggap itu mengambil yang terbaru. Dan jika seseorang bertanya-tanya, nama toples tanpa akhiran file, jadi tidak ada "myJar.jar" tetapi "myJar" seperti yang ditunjukkan dengan benar dalam contoh.
Espinosa

13
Pada versi 3.0.0 finalNamekonfigurasi telah dihapus. Namun metode OP harus bekerja. Lihat issues.apache.org/jira/browse/MJAR-233
Matius

42

Semua jawaban yang diberikan lebih rumit daripada yang diperlukan. Dengan asumsi Anda sedang membangun file jar, yang perlu Anda lakukan adalah menambahkan <jar.finalName>tag ke <properties>bagian Anda :

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

Ini akan menghasilkan toples:

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

Ini ada dalam dokumentasi - perhatikan User Property:

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

Penggunaan Baris Perintah

Anda juga harus dapat menggunakan opsi ini di baris perintah dengan:

mvn -Djar.finalName=myCustomName ...

Anda harus mendapatkan myCustomName.jar, meskipun saya belum menguji ini.


6
Dengan Spring Boot ini tidak berfungsi sebagai stackoverflow.com/a/14490656/2294031 . Sedangkan <jar.finalName>foo</jar.finalName>membuat dua toples: toples yang dapat dieksekusi termasuk dependensi yang dinamai foo-${project.version}.jardan toples kedua yang hanya berisi nama proyek ${project.name}-${project.version}.jar, <build><finalName>foo</finalName></build>hanya membuat toples yang dapat dieksekusi termasuk dependensi yang bernamafoo.jar
Snozzlebert

Berfungsi dan saya setuju ini adalah jawaban sederhana dan Anda bahkan dapat melakukan <jar.finalName> $ {groupId} - $ {artifactId} - $ {version} </ jar.finalName>
Pengembang MG

37

@ Maxim
coba ini ...

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

Keluaran

[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] ------------------------------------------------------------------------


Referensi


5
dalam kasus saya, <file> harus <file> $ {build.directory} / $ {project.build.finalName}. $ {project.packaging} </file>
Cpt. Senkfuss

2
Apa perbedaan antara menempatkan tag finalName langsung di maven-install-plugin VS maven-jar-plugin?
Pocketkid2

Ini hebat, saya bisa menggunakan trik ini untuk mempublikasikan file .xml secara langsung sebagai artefak.
Benjamin Damm

1
Ini pertama kali membangun base-1.0.0.SNAPSHOT.jar dan kemudian base-4.0.8.8.jar?
Mark W

1
Mengapa artefak dipasang dua kali dengan dua nama berbeda? Tolong tunjukkan konfigurasi untuk menginstalnya sekali saja.
chrisinmtown

18

Pada tahap paket, plugin memungkinkan konfigurasi nama file yang diimpor melalui pemetaan file:

maven-ear-plugin

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

Jika Anda telah mengonfigurasi versi Anda untuk menjadi 'pengujian' melalui profil atau sesuatu, ini akan bekerja untuk paket perang:

pakar perang-plugin

<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
Dan untuk arsip jar?
Stephane


3

Pendekatan yang Anda gunakan memang melakukan jar file dengan string 'pengujian' dalam namanya, seperti yang Anda tentukan, tetapi perintah instalasi default mengirimkannya ke direktori ~ / .m2 / repositori Anda, seperti yang terlihat di baris output ini:

/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

Menurut saya Anda mencoba membuat toples dengan nama seperti itu dan kemudian menyalinnya ke direktori pilihan Anda.

Coba gunakan properti outputDirectory seperti yang dijelaskan di sini: http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html


Sebenarnya, pengaturan lengkap saya adalah sebagai berikut: Saya memiliki superpom di mana saya ingin mendefinisikan versi saat ini saya sedang membangun. Lalu saya punya beberapa proyek yang mendefinisikan pom ini sebagai orang tua mereka. Saya menggunakan hudson-ci untuk membangun semua proyek ini. Kemudian hudson mendorong proyek menjadi artifactory. Saya mencari sesuatu yang memungkinkan saya untuk mengubah versi yang saat ini sedang dibangun. Saya akan melihat bagaimana saya dapat menggunakan input baru Anda. Terima kasih.
Maxim Veksler

Jadi ... untuk mengontrol versi yang akan diinstal, saya perlu mengganti parameter maven yang berbeda?
Maxim Veksler

7
Itu tidak benar. Nama di repo lokal dinormalisasi: groupId/artifactId/version/artifactId-version-classifier.packaging. finalName hanya berlaku untuk nama file lokal di direktori output.
Sean Patrick Floyd

Terima kasih telah memperhatikan. Sebenarnya, baris yang saya kutip menunjukkan kesalahan saya. Namun, saya mendapat kesan bahwa yang dibutuhkan Maxim adalah toples di direktori lokal (pilihannya).
Goran Jovic

@SeanPatrickFloyd jadi apakah ada cara untuk mengubah artifactId-version-classifier.packaging ke nama cutom?
Khalid Abu El-Soud

2

Saya menggunakan yang berikut ini

        ....
        <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>
        ....

Dengan cara ini Anda dapat mendefinisikan setiap nilai secara individual atau pragmatis dari Jenkins dari beberapa sistem lain.

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

Ini akan menempatkan folder target\{group.id}\projectName-1.2.3.jar

Cara yang lebih baik untuk menghemat waktu mungkin

        ....
        <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>
        ....

Suka sama kecuali saya gunakan pada variabel.

  mvn package -DbaseVersion=0.3.4

Ini akan menempatkan folder target\{group.id}\projectName-1.2.3.jar

Anda juga dapat menggunakan outputDirectorydi dalam configurationuntuk menentukan lokasi Anda mungkin ingin paket itu berada.


1

Dalam proyek pakar saya, saya menggunakan:

<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>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.