Kaven yapısının nihai adını kontrol etme


174

Süper pom'umuzda, üretilen projenin hedefi olarak tüm çocuk projeleri tarafından kullanılacak bir mülkü tanımlamaya çalışıyorum.

Bunun için kullanmayı düşünüyordum, project/build/finalNameancak bu basit poms için bile işe yaramıyor:

komuta

 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>

Ve idam ettiğimde:

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

Dize "test" oluşturulan eser adında bir yerde görüneceğini beklenir.

"FinalName" nin amacını yanlış anlıyor muyum?


Bilmek güzel - tüm varsayılanlar (nihai ad dahil) Super Pom'dan
Andrejs

Yanıtlar:


291

finalNameÖzelliği eklenti yapılandırma bölümünde ayarlarsınız :

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

Resmi belgelerde belirtildiği gibi .

Güncelleme:

Maven için> = 3

Dayanarak Matthew comment şimdi böyle yapabilirsiniz:

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

Hata raporuna / belgelerine bakın .


2
Komut satırında "finalName" i belirtebilir misiniz? (-Djar.finalName = x) çalışmıyor.
jayunit100

Komut satırını kullanmayı denemedim. Maven çözümünü denediniz mi?
Christian Vielma

1
Bir güncelleme biraz, 2.4 en son sürümüdür. Yine de iyi çalışıyor.
PaulBGD

1
Maven eklentileri ile sürüm eklemek gerekmez. En son seçtiklerini düşünüyorum. Birisi merak etti eğer, kavanoz adıdır olmadan , dosya soneki öylesine hayır doğru örnekte görüldüğü gibi "myJar.jar" ama "myJar".
Espinosa

13
3.0.0 sürümünden itibaren finalNameyapılandırma kaldırılmıştır. Ancak OP'nin yöntemi çalışmalıdır. Bkz issues.apache.org/jira/browse/MJAR-233
Matta

42

Verilen tüm cevaplar gerekenden daha karmaşıktır. Bir jar dosyası oluşturduğunuzu varsayarsak, tek yapmanız gereken bölümünüze bir <jar.finalName>etiket eklemektir <properties>:

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

Bu bir kavanoz oluşturur:

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

Bu belgelerde yer almaktadır User Property:

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

Komut Satırı Kullanımı

Bu seçeneği komut satırında aşağıdakilerle de kullanabilmeniz gerekir:

mvn -Djar.finalName=myCustomName ...

Bunu test etmeme rağmen myCustomName.jar dosyasını almalısınız.


6
Spring Boot ile bu stackoverflow.com/a/14490656/2294031 olarak çalışmaz . Oysa <jar.finalName>foo</jar.finalName>iki kavanoz oluşturur: adlandırılmış bağımlılıkları dahil yürütülebilir bir kavanoz foo-${project.version}.jarve tek proje adında içeren ikinci bir kavanoz ${project.name}-${project.version}.jar, <build><finalName>foo</finalName></build>adlandırılmış bağımlılıkları dahil olmak üzere yalnızca yürütülebilir kavanoz yaratırfoo.jar
Snozzlebert

Çalışıyor ve bunun basit bir cevap olduğunu kabul ediyorum ve hatta <jar.finalName> $ {groupId} - $ {artifactId} - $ {version} </ jar.finalName>
MG Developer

37

@Maxim bunu
deneyin ...

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

Çıktı

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


Referans


5
benim durumumda, <dosya> <dosya> $ {build.directory} / $ {project.build.finalName}. $ {project.packaging} </file>
Cpt. Senkfuss

2
FinalName etiketini doğrudan maven-install-plugin VS maven-jar-plugin'e yerleştirme arasındaki fark nedir?
Pocketkid2

Bu harika, bu hileyi doğrudan bir eser olarak bir .xml dosyası yayınlamak için kullanabildim.
Benjamin Damm

1
İlk bina base-1.0.0.SNAPSHOT.jar ve sonra base-4.0.8.8.jar?
Mark

1
Eser neden iki farklı adla iki kez kurulur? Lütfen yalnızca bir kez kurmak için bir yapılandırma gösterin.
chrisinmtown

18

Paket aşamasında, eklenti, içe aktarılan dosya adlarının dosya eşleme yoluyla yapılandırılmasına izin verir:

maven-kulak-eklenti

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

Sürümünüzü bir profil veya başka bir şeyle 'test edecek' şekilde yapılandırdıysanız, bu bir savaş paketi için işe yarar:

maven-savaş eklentisi

<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
Kavanoz arşivi için mi?
Stephane


3

Gerçekten kullandığınız yaklaşım, belirttiğiniz gibi adında bir 'test' dizesi içeren jar dosyası yapar, ancak varsayılan install komutu bu çıkış satırında görüldüğü gibi ~ / .m2 / havuz dizininize gönderir:

/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

Bana öyle geliyor ki böyle bir adla bir kavanoz oluşturmaya ve daha sonra seçtiğiniz bir dizine kopyalamaya çalışıyorsunuz.

OutputDirectory özelliğini burada açıklandığı şekilde kullanmayı deneyin: http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html


Aslında, tam kurulumum şu şekildedir: İçinde oluşturduğum mevcut sürümü tanımlamak istediğim süperpom var. Sonra bu pom'u ebeveynleri olarak tanımlayan birkaç projem var. Hudson projelerini tüm bu projeleri inşa etmek için kullanıyorum. Daha sonra hudson projeleri yapay hale getirdi. Şu anda inşa edilen sürümü değiştirmeme izin verecek bir şey arıyorum. Yeni girdinizi nasıl kullanabileceğime bir göz atacağım. Teşekkür ederim.
Maxim Veksler

Yani ... kurulacak sürümü kontrol etmek için farklı bir maven parametresini geçersiz kılmalıyım?
Maxim Veksler

7
Bu doğru değil. Yerel repo adı normalize edilir: groupId/artifactId/version/artifactId-version-classifier.packaging. finalName yalnızca çıktı dizinindeki yerel dosya adı için geçerlidir.
Sean Patrick Floyd

Fark ettiğiniz için teşekkürler. Aslında alıntıladığım satır hatamı gösteriyor. Ancak, Maxim'in ihtiyaç duyduğu şeyin yerel dizindeki kavanoz (kendi seçtiği) olduğu izlenimini edindim.
Goran Jovic

@SeanPatrickFloyd bu yüzden artifactId-version-classifier.packaging 'i cutom name olarak değiştirmenin bir yolu var mı?
Halid Abu El-Soud

2

Aşağıdakileri kullanıyorum

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

Bu şekilde, her bir değeri başka bir sistemin Jenkins'ten bireysel veya pragmatik olarak tanımlayabilirsiniz.

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

Bu bir klasör yerleştirir target\{group.id}\projectName-1.2.3.jar

Zaman kazanmanın daha iyi bir yolu

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

Değişken üzerinde kullandığım gibi aynı.

  mvn package -DbaseVersion=0.3.4

Bu bir klasör yerleştirir target\{group.id}\projectName-1.2.3.jar

paketin içinde bulunmasını isteyebileceğiniz bir konum belirtmek için outputDirectoryiçinde de kullanabilirsiniz configuration.


1

Benim maven ee projesinde kullanıyorum:

<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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.