jarアーティファクトのmaven最終名の制御


174

生成されたアーティファクトの宛先としてすべての子プロジェクトで使用されるスーパーpomでプロパティを定義しようとしています。

これについて私は使用を考えてproject/build/finalNameいましたが、これは単純なポンであってもうまくいかないようです:

コマンド

 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>

そして私が実行したとき:

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

生成されたアーティファクト名のどこかに「testing」という文字列が現れると思います。

「finalName」の目的を誤解していますか?


(最終名を含む)すべてのデフォルトのスーパーポンポンから継承された(及び良好な参照元である)されている- -知るニースbooks.sonatype.com/mvnref-book/reference/...
Andrejs

回答:


291

あなたは、設定されfinalNameたプラグインの構成セクションでプロパティを:

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

公式ドキュメントに記載されています

更新:

Mavenの場合> = 3

マシューのコメントに基づいて、次のようにすることができます。

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

バグレポート/ドキュメントを参照してください。


2
コマンドラインで「finalName」を指定できますか?(-Djar.finalName = x)が機能していないようです。
jayunit100 2013

コマンドラインを使ったことがありません。Mavenソリューションを試しましたか?
Christian Vielma 2013

1
2.4が最新バージョンです。それでも問題なく動作します。
PaulBGD 2014

1
Mavenプラグインでは、バージョンを含める必要はありません。最新のものを選ぶと思います。誰かが疑問に思っている場合、jar名にはファイルサフィックスがないため「myJar.jar」ではなく「myJar」が例に正しく表示されています。
Espinosa

13
バージョン3.0.0以降、finalName設定は削除されました。ただし、OPの方法は機能するはずです。issue.apache.org/jira/browse/MJAR-233
Matthew

42

提供された回答はすべて、必要以上に複雑です。jarファイルを構築していると仮定すると<jar.finalName><properties>セクションにタグを追加するだけで済みます。

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

これはjarを生成します:

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

これはドキュメントにあります -に注意してくださいUser Property

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

コマンドラインの使用法

コマンドラインでこのオプションを使用することもできるはずです:

mvn -Djar.finalName=myCustomName ...

私はこれをテストしていませんが、myCustomName.jarを取得する必要があります。


6
Spring Bootでは、これはstackoverflow.com/a/14490656/2294031としては機能しません。一方、<jar.finalName>foo</jar.finalName>2瓶作成:名前の依存関係を含む実行可能ジャーfoo-${project.version}.jarのみというプロジェクトを含む第二のジャーを${project.name}-${project.version}.jar<build><finalName>foo</finalName></build>名前の依存関係を含むのみ実行ジャー作成foo.jar
Snozzlebert

動作します。これが簡単な答えであり、<jar.finalName> $ {groupId}-$ {artifactId}-$ {version} </ jar.finalName>を実行することもできることに同意します
MGデベロッパー

37

@Maxim
これを試してください...

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

出力

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


参照


5
私の場合、<file>は<file> $ {build.directory} / $ {project.build.finalName}。$ {project.packaging} </ file>でなければなりませんでした
Cpt。Senkfuss

2
finalNameタグをmaven-install-plugin VS maven-jar-pluginに直接配置することの違いは何ですか?
Pocketkid2 2015

これはすばらしいことです。このトリックを使用して、.xmlファイルを直接アーティファクトとして公開できました。
ベンジャミンダム2016年

1
それは最初にbase-1.0.0.SNAPSHOT.jarを構築し、次にbase-4.0.8.8.jarを構築していますか?
マークW

1
アーティファクトが2つの異なる名前で2回インストールされるのはなぜですか?一度だけインストールする設定を表示してください。
chrisinmtown 2017

18

パッケージ段階で、プラグインはファイルマッピングを介してインポートされたファイル名の構成を許可します。

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

プロファイルなどで「テスト」するようにバージョンを設定している場合、これは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
そして、jarアーカイブのために?
ステファン


3

あなたが実際に使用しているアプローチは、指定したとおり、名前に「testing」という文字列を含むjarファイルを実行しますが、デフォルトのインストールコマンドは、次の出力行にあるように、それを〜/ .m2 / repositoryディレクトリに送信します。

/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

あなたはそのような名前のjarを生成して、それをあなたが選んだディレクトリにコピーしようとしているようです。

ここで説明されているようにoutputDirectoryプロパティを使用してみてください:http ://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html


実際、私の完全なセットアップは次のとおりです。私が作成している現在のバージョンを定義したいスーパーポムがあります。次に、このpomを親として定義するプロジェクトがいくつかあります。私はhudson-ciを使用して、これらすべてのプロジェクトを構築しています。その後、ハドソンはプロジェクトを成果物に押し上げました。現在ビルド中のバージョンを変更できるものを探しています。新しい入力をどのように使用できるかを見ていきます。ありがとうございました。
Maxim Veksler、2010年

インストールされるバージョンを制御するには、別のmavenパラメータをオーバーライドする必要がありますか?
Maxim Veksler、2010年

7
不正解です。ローカルリポジトリの名前は正規化されています:groupId/artifactId/version/artifactId-version-classifier.packaging。finalNameは、出力ディレクトリのローカルファイル名にのみ適用されます。
ショーンパトリックフロイド

お知らせいただきありがとうございます。実際、私が引用したまさにその行は私のエラーを示しています。しかし、マキシムが必要とするのは、ローカルディレクトリ(選択した)のjarであるという印象を受けました。
Goran Jovic、2010年

@SeanPatrickFloydしたがって、artifactId-version-classifier.packagingをカスタム名に変更する方法はありますか?
Khalid Abu El-Soud 2014

2

私は以下を使用しています

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

このようにして、他のシステムのJenkinsから各値を個別にまたは実用的に定義できます。

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

これはフォルダを配置します target\{group.id}\projectName-1.2.3.jar

時間を節約するより良い方法は

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

変数に使用する以外は同じです。

  mvn package -DbaseVersion=0.3.4

これはフォルダを配置します target\{group.id}\projectName-1.2.3.jar

また、outputDirectoryinsideを使用してconfiguration、パッケージを配置する場所を指定することもできます。


1

私のmaven eeプロジェクトで私が使用しています:

<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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.