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"?


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 .


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


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


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>

1
Et pour une archive jar?
Stephane


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


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


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>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.