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


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 .


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.


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


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>

1
¿Y para un archivo jar?
Stephane


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


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.


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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.