Controlar el nombre final de maven del artefacto jar

174

Estoy tratando de definir una propiedad en nuestro super pom que será utilizada por todos los proyectos secundarios como el destino del artefacto generado.

Para esto estaba pensando en usar, project/build/finalNamepero esto no parece funcionar, incluso para poms simples:

Mando

 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>

Y cuando ejecuté:

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

Esperaría que la cadena "prueba" apareciera en algún lugar del nombre del artefacto generado.

¿Estoy malinterpretando el propósito de "finalName"?

Maxim Veksler
fuente
Es bueno saberlo: todos los valores predeterminados (incluido el nombre final) se heredan del Super Pom (y es una buena fuente de referencia) - books.sonatype.com/mvnref-book/reference/…
Andrejs

Respuestas:

291

Establece la finalNamepropiedad en la sección de configuración del complemento:

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

Como se indica en la documentación oficial .

Actualizar:

Para Maven> = 3

Según el comentario de Matthew, ahora puede hacerlo así:

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

Ver informe de errores / documentación .

Christian Vielma
fuente
2
¿Puedes especificar el "finalName" en la línea de comando? (-Djar.finalName = x) no parece funcionar.
jayunit100
No he intentado usar la línea de comando. ¿Has probado la solución Maven?
Christian Vielma
1
Un poco de actualización, 2.4 es la última versión. Aún así funciona bien.
PaulBGD
1
Con los complementos de Maven, uno no tiene que incluir la versión. Supongo que elige lo último. Y si alguien se ha preguntado, el nombre del jar es sin sufijo de archivo, por lo que hay "myJar.jar" pero "miJar", como se muestra correctamente en el ejemplo.
Espinosa
13
A partir de la versión 3.0.0, la finalNameconfiguración se ha eliminado. Sin embargo, el método del OP debería funcionar. Ver issues.apache.org/jira/browse/MJAR-233
Matthew
42

Todas las respuestas proporcionadas son más complicadas de lo necesario. Suponiendo que está creando un archivo jar, todo lo que necesita hacer es agregar una <jar.finalName>etiqueta a su <properties>sección:

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

Esto generará un frasco:

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

Esto está en la documentación : tenga en cuenta lo siguiente User Property:

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

Uso de línea de comando

También debería poder usar esta opción en la línea de comando con:

mvn -Djar.finalName=myCustomName ...

Deberías obtener myCustomName.jar, aunque no he probado esto.

JBCP
fuente
66
Con Spring Boot esto no funciona como stackoverflow.com/a/14490656/2294031 . Mientras que <jar.finalName>foo</jar.finalName>crea dos jarras: un jar ejecutable que incluye dependencias nombradas foo-${project.version}.jary un segundo jar que solo contiene el proyecto nombrado ${project.name}-${project.version}.jar, <build><finalName>foo</finalName></build>crea solo el jar ejecutable que incluye dependencias nombradasfoo.jar
Snozzlebert
Funciona y acepto que esta es la respuesta simple e incluso puede hacer <jar.finalName> $ {groupId} - $ {artifactId} - $ {version} </ jar.finalName>
MG Developer
37

@Maxim
prueba esto ...

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

Salida

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


Referencia

dira
fuente
55
en mi caso, <file> tenía que ser <file> $ {build.directory} / $ {project.build.finalName}. $ {project.packaging} </file>
Cpt. Senkfuss
2
¿Cuál es la diferencia entre poner la etiqueta finalName directamente en el complemento maven-install-plugin VS maven-jar-plugin?
Pocketkid2
Esto es genial, pude usar este truco para publicar un archivo .xml directamente como un artefacto.
Benjamin Damm
1
Primero está construyendo base-1.0.0.SNAPSHOT.jar y luego base-4.0.8.8.jar?
Mark W
1
¿Por qué se instala el artefacto dos veces con dos nombres diferentes? Muestre una configuración para instalarla solo una vez.
chrisinmtown
18

En la etapa de paquete, el complemento permite la configuración de los nombres de archivos importados a través de la asignación de archivos:

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 ha configurado su versión para 'probar' a través de un perfil o algo, esto funcionaría para un paquete de guerra:

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
fuente
1
¿Y para un archivo jar?
Stephane
8

Esto funciona para mi

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

El enfoque que ha estado utilizando realmente hace que el archivo jar con una cadena 'prueba' en su nombre, como usted especificó, pero el comando de instalación predeterminado lo envía a su directorio ~ / .m2 / repository, como se ve en esta línea de salida:

/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

Me parece que estás tratando de generar un jar con ese nombre y luego copiarlo al directorio que elijas.

Intente usar la propiedad outputDirectory como se describe aquí: http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html

Goran Jovic
fuente
En realidad, mi configuración completa es la siguiente: tengo superpom en el que me gustaría definir la versión actual para la que estoy construyendo. Luego tengo varios proyectos que definen a este pom como su padre. Yo uso hudson-ci para construir todos estos proyectos. Entonces Hudson empujó los proyectos a artefactos. Estoy buscando algo que me permita cambiar la versión que se está construyendo actualmente. Echaré un vistazo a cómo puedo usar su nueva entrada. Gracias.
Maxim Veksler
Entonces ... para controlar la versión que se instalará, ¿tengo que anular un parámetro de Maven diferente?
Maxim Veksler
77
Eso no es correcto El nombre en el repositorio local, se normaliza: groupId/artifactId/version/artifactId-version-classifier.packaging. finalName solo se aplica al nombre del archivo local en el directorio de salida.
Sean Patrick Floyd el
Gracias por notarlo. En realidad, la línea que cité muestra mi error. Sin embargo, tuve la impresión de que lo que Maxim necesitaba era el jar en el directorio local (de su elección).
Goran Jovic
@SeanPatrickFloyd, ¿hay alguna forma de cambiar artifactId-version-classifier.packaging a cutom name?
Khalid Abu El-Soud
2

Estoy usando lo siguiente

        ....
        <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 esta manera, puede definir cada valor de forma individual o pragmática a partir de Jenkins de algún otro sistema.

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

Esto colocará una carpeta target\{group.id}\projectName-1.2.3.jar

Una mejor manera de ahorrar tiempo podría ser

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

Me gusta lo mismo excepto que uso en variable.

  mvn package -DbaseVersion=0.3.4

Esto colocará una carpeta target\{group.id}\projectName-1.2.3.jar

también puede usar outputDirectorydentro configurationpara especificar una ubicación en la que desee que se ubique el paquete.

GetBackerZ
fuente
1

En mi proyecto maven ee estoy 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>
Mircea Stanciu
fuente