Контролюючи остаточну назву артефакту банку


174

Я намагаюся визначити властивість у нашому суперпомі, який буде використовуватися всіма дочірніми проектами як призначення створеного артефакту.

Для цього я думав про використання, project/build/finalNameале це, здається, не працює, навіть для простих пім:

Командування

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

ПОМ

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

Я б очікував, що рядок "тестування" з'явиться десь у створеній назві артефакту.

Я не розумію мету "finalName"?


Приємно знати - усі параметри за замовчуванням (включаючи остаточне ім’я) успадковуються від Super Pom (і є хорошим довідковим джерелом) - 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>       

Як зазначено в офіційній документації .

Оновлення:

Для Мейвена> = 3

Виходячи з коментаря Метью, ви можете робити це так:

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

Дивіться звіт про помилку / документацію .


2
Чи можете ви вказати "finalName" в командному рядку? (-Djar.finalName = x) не працює.
jayunit100

Я не намагався використовувати командний рядок. Ви пробували рішення Maven?
Крістіан Вільма

1
Трохи оновлення, 2.4 - це остання версія. Досі добре працює, хоча.
PaulBGD

1
Для плагінів Maven не потрібно включати версію. Я припускаю, що він підбирає останнє. І якщо хтось задумався, ім'я банку не має суфікса файлу, тож не "myJar.jar", а "myJar", як це правильно показано в прикладі.
Еспіноса

13
З версії 3.0.0 finalNameконфігурацію було видалено. Однак метод ОП повинен працювати. Див. Issues.apache.org/jira/browse/MJAR-233
Матвій

42

Усі подані відповіді складніші, ніж необхідно. Якщо припустити, що ви створюєте файл jar, все, що вам потрібно зробити, - це додати <jar.finalName>тег до вашого <properties>розділу:

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

Це створить банку:

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>створюється дві банки: виконувана jar із включеними іменами залежностей foo-${project.version}.jarта другий jar, що містить лише названий проект ${project.name}-${project.version}.jar, <build><finalName>foo</finalName></build>створює лише виконуваний jar, включаючи імена залежностейfoo.jar
Snozzlebert

Працює, і я погоджуюся, що це проста відповідь, і ви навіть можете зробити <jar.finalName> $ {groupId} - $ {artifactId} - $ {версія} </ jar.finalName>
MG Developer

37

@Maxim
спробуйте це ...

пом.хмл

 <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

Це чудово, мені вдалося використати цей трюк, щоб опублікувати .xml файл безпосередньо як артефакт.
Бенджамін Дамм

1
Спочатку це база-1.0.0.SNAPSHOT.jar, а потім база-4.0.8.8.jar?
Марк Ш

1
Чому артефакт встановлюється двічі з двома різними назвами? Покажіть конфігурацію, щоб встановити її лише один раз.
chrisinmtown

18

На етапі пакета плагін дозволяє конфігурувати імпортовані імена файлів за допомогою відображення файлів:

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

Якщо ви налаштували свою версію на тестування через профіль або щось подібне, це допоможе пакету війни:

maven-war-плагін

<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
А для архіву банку?
Стефан


3

Підхід, який ви використовуєте, дійсно робить jar-файл із рядком "тестування" на його ім'я, як ви вказали, але команда встановлення за замовчуванням надсилає його до каталогу ~ / .m2 / сховища, як це видно у цьому вихідному рядку:

/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

Мені здається, ви намагаєтесь створити банку з таким ім'ям, а потім скопіюйте її у вибраний каталог.

Спробуйте використовувати властивість outputDirectory, як описано тут: http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html


Насправді моє повне налаштування таке: у мене є суперпом, в якому я б хотів визначити поточну версію, для якої будую. Тоді у мене є кілька проектів, які визначають цю пам’ять як свого батьків. Я використовую hudson-ci для створення всіх цих проектів. Тоді Хадсон підштовхнув проекти до артефактури. Я шукаю щось, що дозволило б мені змінити версію, яка наразі будується. Я перегляну, як я можу використовувати ваш новий вклад. Дякую.
Максим Векслер

Отже ... для управління версією, яка буде встановлена, мені потрібно змінити інший параметр maven?
Максим Векслер

7
Це не правильно. Ім'я в місцевому репо нормалізуються: groupId/artifactId/version/artifactId-version-classifier.packaging. finalName застосовується лише до локального імені файлу у вихідному каталозі.
Шон Патрік Флойд

Дякуємо, що помітили. Власне, сама лінія, яку я цитував, показує мою помилку. Однак у мене склалося враження, що Максиму потрібно було баночку в локальному довіднику (на його вибір).
Горан Йович

@SeanPatrickFloyd, то чи є спосіб змінити artfactId-version-classifier.packaging на ім'я cutom?
Халид Абу-Ель-Суд

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

Таким чином ви можете визначити кожне значення окремо або прагматично від Дженкінса якоїсь іншої системи.

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

ви також можете використовувати outputDirectoryвсередині, 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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.