Contrôle du nom final maven de l'artefact de pot

174

J'essaie de définir une propriété dans notre super pom qui sera utilisée par tous les projets enfants comme destination de l'artefact généré.

Pour cela, je pensais utiliser project/build/finalNamemais cela ne semble pas fonctionner, même pour de simples poms:

Commander

 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>

Et quand j'ai exécuté:

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

Je m'attendrais à ce que la chaîne "testing" apparaisse quelque part dans le nom de l'artefact généré.

Suis-je mal compris le but de "finalName"?

Maxim Veksler
la source
Bon à savoir - toutes les valeurs par défaut (y compris le nom final) sont héritées du Super Pom (et est une bonne source de référence) - books.sonatype.com/mvnref-book/reference/…
Andrejs

Réponses:

291

Vous définissez la finalNamepropriété dans la section de configuration du plugin:

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

Comme indiqué dans la documentation officielle .

Mettre à jour:

Pour Maven> = 3

Sur la base du commentaire de Matthew, vous pouvez maintenant le faire comme ceci:

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

Voir rapport de bogue / documentation .

Christian Vielma
la source
2
Pouvez-vous spécifier le "finalName" sur la ligne de commande? (-Djar.finalName = x) ne semble pas fonctionner.
jayunit100
Je n'ai pas essayé d'utiliser la ligne de commande. Avez-vous essayé la solution Maven?
Christian Vielma
1
Un peu une mise à jour, la 2.4 est la dernière version. Fonctionne toujours bien cependant.
PaulBGD
1
Avec les plugins Maven, il n'est pas nécessaire d'inclure la version. Je suppose qu'il choisit le dernier. Et si quelqu'un s'est posé la question, le nom du jar est sans suffixe de fichier, donc pas de "myJar.jar" mais "myJar" comme il est correctement montré dans l'exemple.
Espinosa
13
Depuis la version 3.0.0, la finalNameconfiguration a été supprimée. Cependant, la méthode de l'OP devrait fonctionner. Voir issues.apache.org/jira/browse/MJAR-233
Matthieu
42

Toutes les réponses fournies sont plus compliquées que nécessaire. En supposant que vous construisez un fichier jar, tout ce que vous avez à faire est d'ajouter une <jar.finalName>balise à votre <properties>section:

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

Cela générera un pot:

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

Ceci est dans la documentation - notez le User Property:

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

Utilisation de la ligne de commande

Vous devriez également pouvoir utiliser cette option sur la ligne de commande avec:

mvn -Djar.finalName=myCustomName ...

Vous devriez obtenir myCustomName.jar, bien que je ne l'ai pas testé.

JBCP
la source
6
Avec Spring Boot, cela ne fonctionne pas comme stackoverflow.com/a/14490656/2294031 . Alors que <jar.finalName>foo</jar.finalName>crée deux jars: un jar exécutable comprenant les dépendances nommées foo-${project.version}.jaret un second jar contenant uniquement le projet nommé ${project.name}-${project.version}.jar, <build><finalName>foo</finalName></build>crée uniquement le jar exécutable, y compris les dépendances nomméesfoo.jar
Snozzlebert
Fonctionne et je suis d'accord que c'est la réponse simple et que vous pouvez même faire <jar.finalName> $ {groupId} - $ {artifactId} - $ {version} </ jar.finalName>
MG Developer
37

@Maxim
essayez ceci ...

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

Production

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


Référence

dira
la source
5
dans mon cas, <file> devait être <file> $ {build.directory} / $ {project.build.finalName}. $ {project.packaging} </file>
Cpt. Senkfuss
2
Quelle est la différence entre placer la balise finalName directement dans le maven-install-plugin VS maven-jar-plugin?
Pocketkid2
C'est génial, j'ai pu utiliser cette astuce pour publier un fichier .xml directement en tant qu'artefact.
Benjamin Damm
1
C'est d'abord la construction de base-1.0.0.SNAPSHOT.jar, puis de base-4.0.8.8.jar?
Mark W
1
Pourquoi l'artefact est-il installé deux fois avec deux noms différents? Veuillez montrer une configuration pour l'installer une seule fois.
chrisinmtown
18

Au stade du package, le plugin permet la configuration des noms de fichiers importés via le mappage de fichiers:

plugin maven-ear

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

Si vous avez configuré votre version pour être `` testée '' via un profil ou quelque chose, cela fonctionnerait pour un package war:

maven-war-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>
Nichole
la source
1
Et pour une archive jar?
Stephane
8

Cela fonctionne pour moi

mvn jar:jar -Djar.finalName=custom-jar-name
Oleg Mikhailov
la source
3

L'approche que vous avez utilisée fait en effet un fichier jar avec une chaîne 'testing' dans son nom, comme vous l'avez spécifié, mais la commande d'installation par défaut l'envoie à votre répertoire ~ / .m2 / repository, comme indiqué dans cette ligne de sortie:

/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

Il me semble que vous essayez de générer un fichier jar avec un tel nom, puis de le copier dans un répertoire de votre choix.

Essayez d'utiliser la propriété outputDirectory comme décrit ici: http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html

Goran Jovic
la source
En fait, ma configuration complète est la suivante: j'ai superpom dans lequel je voudrais définir la version actuelle pour laquelle je construis. Ensuite, j'ai plusieurs projets qui définissent ce pom comme leur parent. J'utilise hudson-ci pour construire tous ces projets. Ensuite, Hudson a poussé les projets dans un artificiel. Je cherche quelque chose qui me permettrait de changer la version en cours de construction. Je vais voir comment je peux utiliser votre nouvelle entrée. Je vous remercie.
Maxim Veksler
Donc ... afin de contrôler la version qui sera installée, je dois remplacer un paramètre maven différent?
Maxim Veksler
7
Ce n'est pas correct. Le nom dans le repo local est normalisé: groupId/artifactId/version/artifactId-version-classifier.packaging. finalName s'applique uniquement au nom de fichier local dans le répertoire de sortie.
Sean Patrick Floyd
Merci d'avoir remarqué. En fait, la ligne même que j'ai citée montre mon erreur. Cependant, j'ai eu l'impression que ce dont Maxim avait besoin était le jar dans le répertoire local (de son choix).
Goran Jovic
@SeanPatrickFloyd alors y a-t-il un moyen de changer artifactId-version-classifier.packaging en nom personnalisé?
Khalid Abu El-Soud
2

J'utilise ce qui suit

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

De cette façon, vous pouvez définir chaque valeur individuellement ou de manière pragmatique à partir de Jenkins d'un autre système.

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

Cela placera un dossier target\{group.id}\projectName-1.2.3.jar

Une meilleure façon de gagner du temps pourrait être

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

Comme le même sauf que j'utilise sur variable.

  mvn package -DbaseVersion=0.3.4

Cela placera un dossier target\{group.id}\projectName-1.2.3.jar

vous pouvez également utiliser outputDirectoryinside of configurationpour spécifier un emplacement où vous souhaitez que le package soit localisé.

GetBackerZ
la source
1

Dans mon projet maven ee, j'utilise:

<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>
Mircea Stanciu
la source