web-dev-qa-db-fra.com

Contrôler le nom final maven de l'artefact de bocal

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/finalName, mais cela ne semble pas fonctionner, même pour de simples poms:

Commande

 mvn archetype:create \ 
   -DarchetypeGroupId=org.Apache.maven.archetypes \
   -DgroupId=com.mycompany.app \
   -DartifactId=my-app

POM

maxim@maxim-desktop:/tmp/mvn_test$ cat my-app/pom.xml 
<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>

maxim@maxim-desktop:/tmp/mvn_test/my-app$ 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é.

Est-ce que je comprends mal le but de "finalName"?

Merci Maxim.

145
Maxim Veksler

Vous définissez la propriété finalName 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 le documentation officielle .

Mise à jour:

Pour Maven> = 3

Basé sur le commentaire de Matthew's , vous pouvez maintenant le faire comme ceci:

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

Voir rapport de bogue/documentation .

244
Christian Vielma

Toutes les réponses fournies sont plus compliquées que nécessaire. En supposant que vous construisiez un fichier jar, il vous suffit d'ajouter une balise <jar.finalName> à votre section <properties>:

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

Cela va générer un pot:

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

Ceci est dans le 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 en 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 n’aie pas testé cela.

40
JBCP

@Maxime
essaye ça...

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

Sortie

[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

36
Dipesh Rathod

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

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

Si vous avez configuré votre version pour qu'elle "teste" via un profil ou autre, cela fonctionnera pour un paquet 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>
18
Nichole

Ça marche pour moi

mvn jar:jar -Djar.finalName=custom-jar-name
7
Oleg Mikhailov

L'approche que vous avez utilisée fait en effet un fichier jar avec une chaîne "test" dans son nom, comme vous l'avez spécifié, mais la commande d'installation par défaut l'envoie dans 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 bocal 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

3
Goran Jovic

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

Un meilleur moyen 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 outputDirectory à l'intérieur de configuration pour spécifier un emplacement sur lequel vous souhaitez que le paquet soit localisé.

2
GetBackerZ

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>
0
Mircea Stanciu