Controllo del nome finale del manufatto in vaso


174

Sto cercando di definire una proprietà nel nostro super pom che verrà utilizzata da tutti i progetti figlio come destinazione del manufatto generato.

Per questo stavo pensando di usare, project/build/finalNamema questo non sembra funzionare, anche per i semplici poms:

Comando

 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>

E quando ho eseguito:

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

Mi aspetto che la stringa "testing" appaia da qualche parte nel nome del manufatto generato.

Sto fraintendendo lo scopo di "finalName"?


Buono a sapersi - tutte le impostazioni predefinite (incluso il nome finale) sono ereditate dal Super Pom (ed è una buona fonte di riferimento) - books.sonatype.com/mvnref-book/reference/…
Andrejs

Risposte:


291

Hai impostato la finalNameproprietà nella sezione di configurazione del plugin:

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

Come indicato nella documentazione ufficiale .

Aggiornare:

Per Maven> = 3

Sulla base del commento di Matthew ora puoi farlo in questo modo:

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

Vedi report bug / documentazione .


2
Puoi specificare "finalName" nella riga di comando? (-Djar.finalName = x) non sembra funzionare.
jayunit100,

Non ho provato a usare la riga di comando. Hai provato la soluzione Maven?
Christian Vielma,

1
Un po 'di un aggiornamento, 2.4 è l'ultima versione. Comunque funziona ancora bene.
PaulBGD,

1
Con i plugin Maven non è necessario includere la versione. Presumo che scelga l'ultima. E se qualcuno si è chiesto, il nome del barattolo è senza suffisso, quindi non "myJar.jar" ma "myJar" come mostrato correttamente nell'esempio.
Espinosa,

13
A partire dalla versione 3.0.0 la finalNameconfigurazione è stata rimossa. Tuttavia, il metodo del PO dovrebbe funzionare. Vedi issues.apache.org/jira/browse/MJAR-233
Matteo

42

Tutte le risposte fornite sono più complicate del necessario. Supponendo che tu stia creando un file jar, tutto ciò che devi fare è aggiungere un <jar.finalName>tag alla tua <properties>sezione:

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

Questo genererà un barattolo:

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

Questo è nella documentazione . Nota User Property:

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

Utilizzo della riga di comando

Dovresti anche essere in grado di utilizzare questa opzione sulla riga di comando con:

mvn -Djar.finalName=myCustomName ...

Dovresti ottenere myCustomName.jar, anche se non l'ho provato.


6
Con Spring Boot questo non funziona come stackoverflow.com/a/14490656/2294031 . Considerando che <jar.finalName>foo</jar.finalName>crea due vasetti: un vaso eseguibile che include le dipendenze nominate foo-${project.version}.jare un secondo vaso contenente solo il progetto denominato ${project.name}-${project.version}.jar, <build><finalName>foo</finalName></build>crea solo il vaso eseguibile comprese le dipendenze denominatefoo.jar
Snozzlebert

Funziona e sono d'accordo che questa è la risposta semplice e puoi persino fare <jar.finalName> $ {groupId} - $ {artifactId} - $ {version} </ jar.finalName>
MG Developer

37

@Maxim
prova questo ...

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

Produzione

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


Riferimento


5
nel mio caso, <file> doveva essere <file> $ {build.directory} / $ {project.build.finalName}. $ {project.packaging} </file>
Cpt. Senkfuss,

2
Qual è la differenza tra l'inserimento del tag finalName direttamente nel plug-in maven-install VS maven-jar-plugin?
Pocketkid2,

Questo è fantastico, sono stato in grado di usare questo trucco per pubblicare un file .xml direttamente come artefatto.
Benjamin Damm,

1
Sta costruendo prima base-1.0.0.SNAPSHOT.jar e poi base-4.0.8.8.jar?
Mark W

1
Perché l'artefatto è installato due volte con due nomi diversi? Mostra una configurazione per installarla una sola volta.
chrisinmtown,

18

Nella fase del pacchetto, il plug-in consente la configurazione dei nomi dei file importati tramite la mappatura dei 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

Se hai configurato la tua versione per "testare" tramite un profilo o qualcosa del genere, questo funzionerebbe per un pacchetto di guerra:

Maven-guerra-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
E per un archivio jar?
Stephane,


3

L'approccio che stai usando in effetti fa il file jar con una stringa 'testing' nel suo nome, come hai specificato, ma il comando di installazione predefinito lo invia alla tua directory ~ / .m2 / repository, come visto in questa linea di output:

/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

Mi sembra che tu stia provando a generare un jar con tale nome e quindi copiarlo in una directory di tua scelta.

Prova a utilizzare la proprietà outputDirectory come descritto qui: http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html


In realtà, la mia installazione completa è la seguente: ho superpom in cui vorrei definire la versione corrente per cui sto costruendo. Poi ho diversi progetti che definiscono questo pom come il loro genitore. Uso hudson-ci per costruire tutti questi progetti. Quindi hudson ha spinto i progetti in artefattiva. Sto cercando qualcosa che mi consenta di cambiare la versione attualmente in costruzione. Vedrò come posso usare il tuo nuovo input. Grazie.
Maxim Veksler,

Quindi ... per controllare la versione che verrà installata devo sovrascrivere un diverso parametro maven?
Maxim Veksler,

7
Non è corretto Il nome nel repository locale è normalizzata: groupId/artifactId/version/artifactId-version-classifier.packaging. finalName si applica solo al nome del file locale nella directory di output.
Sean Patrick Floyd,

Grazie per averlo notato. In realtà, la stessa riga che ho citato mostra il mio errore. Tuttavia, ho avuto l'impressione che ciò di cui Maxim aveva bisogno fosse il vaso nella directory locale (di sua scelta).
Goran Jovic,

@SeanPatrickFloyd quindi c'è un modo per cambiare artefactId-version-classifier.packaging con il nome carino?
Khalid Abu El-Soud,

2

Sto usando il seguente

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

In questo modo è possibile definire ciascun valore individualmente o pragmaticamente da Jenkins di un altro sistema.

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

Questo posizionerà una cartella target\{group.id}\projectName-1.2.3.jar

Potrebbe essere un modo migliore per risparmiare tempo

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

Come lo stesso, tranne che io uso su variabile.

  mvn package -DbaseVersion=0.3.4

Questo posizionerà una cartella target\{group.id}\projectName-1.2.3.jar

è inoltre possibile utilizzare outputDirectoryall'interno di configurationper specificare una posizione in cui si desidera posizionare il pacchetto.


1

Nel mio progetto maven ee sto usando:

<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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.