Kontrolle des endgültigen Namens des Glasartefakts


174

Ich versuche, eine Eigenschaft in unserem Super-POM zu definieren, die von allen untergeordneten Projekten als Ziel des generierten Artefakts verwendet wird.

Dafür habe ich darüber nachgedacht, dies zu verwenden, project/build/finalNameaber dies scheint selbst für einfache Poms nicht zu funktionieren:

Befehl

 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>

Und als ich hingerichtet habe:

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

Ich würde erwarten, dass die Zeichenfolge "Testen" irgendwo im generierten Artefaktnamen erscheint.

Verstehe ich den Zweck von "finalName" falsch?


Gut zu wissen - alle Standardeinstellungen (einschließlich des endgültigen Namens) wurden vom Super Pom geerbt (und sind eine gute Referenzquelle) - books.sonatype.com/mvnref-book/reference/…
Andrejs

Antworten:


291

Sie legen die finalNameEigenschaft im Abschnitt zur Plugin-Konfiguration fest:

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

Wie in der offiziellen Dokumentation angegeben .

Aktualisieren:

Für Maven> = 3

Basierend auf Matthews Kommentar können Sie es jetzt so machen:

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

Siehe Fehlerbericht / Dokumentation .


2
Können Sie den "finalName" in der Befehlszeile angeben? (-Djar.finalName = x) scheint nicht zu funktionieren.
Jayunit100

Ich habe nicht versucht, die Befehlszeile zu verwenden. Haben Sie die Maven-Lösung ausprobiert?
Christian Vielma

1
Ein kleines Update, 2.4 ist die neueste Version. Funktioniert trotzdem gut.
PaulBGD

1
Bei Maven-Plugins muss keine Version enthalten sein. Ich gehe davon aus, dass es das Neueste auswählt. Und wenn sich jemand gefragt hat, ist der JAR-Name ohne Dateisuffix, also kein "myJar.jar", sondern "myJar", wie es im Beispiel korrekt gezeigt wird.
Espinosa

13
Ab Version 3.0.0 wurde die finalNameKonfiguration entfernt. Die Methode des OP sollte jedoch funktionieren. Siehe Issues.apache.org/jira/browse/MJAR-233
Matthew

42

Alle Antworten sind komplizierter als nötig. Angenommen, Sie erstellen eine JAR-Datei, müssen Sie <jar.finalName>Ihrem <properties>Abschnitt lediglich ein Tag hinzufügen :

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

Dies erzeugt ein Glas:

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

Dies ist in der Dokumentation - beachten Sie User Property:

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

Befehlszeilenverwendung

Sie sollten diese Option auch in der Befehlszeile verwenden können mit:

mvn -Djar.finalName=myCustomName ...

Sie sollten myCustomName.jar erhalten, obwohl ich dies nicht getestet habe.


6
Mit Spring Boot funktioniert dies nicht als stackoverflow.com/a/14490656/2294031 . Während <jar.finalName>foo</jar.finalName>zwei Jars erstellt werden: ein ausführbares JAR mit den genannten Abhängigkeiten foo-${project.version}.jarund ein zweites JAR, das nur das genannte Projekt enthält ${project.name}-${project.version}.jar, <build><finalName>foo</finalName></build>wird nur das ausführbare JAR mit den genannten Abhängigkeiten erstelltfoo.jar
Snozzlebert

Funktioniert und ich stimme zu, dass dies die einfache Antwort ist und Sie sogar <jar.finalName> $ {groupId} - $ {artefaktId} - $ {version} </ jar.finalName>
MG Developer

37

@ Maxim
versuchen Sie dies ...

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

Ausgabe

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


Referenz


5
In meinem Fall musste <Datei> <Datei> $ {build.directory} / $ {project.build.finalName} sein. $ {project.packaging} </ file>
Cpt. Senkfuss

2
Was ist der Unterschied zwischen dem direkten Einfügen des finalName-Tags in das Maven-Install-Plugin und dem Maven-Jar-Plugin?
Pocketkid2

Das ist großartig, ich konnte diesen Trick verwenden, um eine XML-Datei direkt als Artefakt zu veröffentlichen.
Benjamin Damm

1
Es wird zuerst base-1.0.0.SNAPSHOT.jar und dann base-4.0.8.8.jar erstellt?
Mark W

1
Warum wird das Artefakt zweimal mit zwei verschiedenen Namen installiert? Bitte zeigen Sie eine Konfiguration, um sie nur einmal zu installieren.
Chrisinmtown

18

In der Paketphase ermöglicht das Plugin die Konfiguration der importierten Dateinamen über die Dateizuordnung:

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

Wenn Sie Ihre Version so konfiguriert haben, dass sie über ein Profil oder etwas anderes getestet wird, funktioniert dies für ein Kriegspaket:

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
Und für ein Glasarchiv?
Stephane


3

Der Ansatz, den Sie verwendet haben, führt tatsächlich eine JAR-Datei mit einer Zeichenfolge 'testing' im Namen aus, wie Sie angegeben haben, aber der Standardinstallationsbefehl sendet sie an Ihr Verzeichnis ~ / .m2 / repository, wie in dieser Ausgabezeile dargestellt:

/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

Mir scheint, Sie versuchen, ein Glas mit einem solchen Namen zu generieren und es dann in ein Verzeichnis Ihrer Wahl zu kopieren.

Versuchen Sie, die Eigenschaft outputDirectory wie hier beschrieben zu verwenden: http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html


Eigentlich ist mein komplettes Setup das Folgende: Ich habe Superpom, in dem ich die aktuelle Version definieren möchte, für die ich baue. Dann habe ich mehrere Projekte, die diesen Pom als ihren Elternteil definieren. Ich benutze Hudson-CI, um all diese Projekte zu erstellen. Dann schob Hudson die Projekte in künstliche. Ich suche etwas, mit dem ich die Version ändern kann, die gerade erstellt wird. Ich werde einen Blick darauf werfen, wie ich Ihre neuen Eingaben verwenden kann. Danke dir.
Maxim Veksler

Also ... um die zu installierende Version zu steuern, muss ich einen anderen Maven-Parameter überschreiben?
Maxim Veksler

7
Das stimmt nicht Der Name im lokalen Repo ist normalisiert : groupId/artifactId/version/artifactId-version-classifier.packaging. finalName gilt nur für den lokalen Dateinamen im Ausgabeverzeichnis.
Sean Patrick Floyd

Danke fürs bemerken. Tatsächlich zeigt genau die Zeile, die ich zitiert habe, meinen Fehler. Ich hatte jedoch den Eindruck, dass Maxim das Glas im lokalen Verzeichnis (seiner Wahl) brauchte.
Goran Jovic

@SeanPatrickFloyd Gibt es also eine Möglichkeit, arteifactId-version-classifier.packaging in cutom name zu ändern?
Khalid Abu El-Soud

2

Ich benutze folgendes

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

Auf diese Weise können Sie jeden Wert einzeln oder pragmatisch aus Jenkins eines anderen Systems definieren.

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

Dadurch wird ein Ordner abgelegt target\{group.id}\projectName-1.2.3.jar

Ein besserer Weg, um Zeit zu sparen, könnte sein

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

Wie das gleiche, außer ich benutze auf Variable.

  mvn package -DbaseVersion=0.3.4

Dadurch wird ein Ordner abgelegt target\{group.id}\projectName-1.2.3.jar

Sie können auch outputDirectoryinside von verwenden configuration, um einen Speicherort anzugeben, an dem sich das Paket befinden soll.


1

In meinem Maven EE-Projekt verwende ich:

<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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.