Kiểm soát maven tên cuối cùng của tạo tác jar


174

Tôi đang cố gắng xác định một tài sản trong siêu pom của chúng tôi sẽ được sử dụng bởi tất cả các dự án con làm đích đến của tạo phẩm được tạo.

Đối với điều này, tôi đã suy nghĩ về việc sử dụng project/build/finalNamenhưng điều này dường như không hiệu quả, ngay cả đối với các poms đơn giản:

Chỉ huy

 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>

Và khi tôi thực hiện:

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

Tôi hy vọng chuỗi "thử nghiệm" sẽ xuất hiện ở đâu đó trong tên tạo tác được tạo.

Tôi có hiểu nhầm mục đích của "FinalName" không?


Rất vui được biết - tất cả các mặc định (bao gồm cả tên cuối cùng) được kế thừa từ Super Pom (và là một nguồn tham khảo tốt) - Books.sonatype.com/mvnref-book/reference/ trộm
Andrejs

Câu trả lời:


291

Bạn đặt thuộc finalNametính trong phần cấu hình plugin:

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

Như đã nêu trong tài liệu chính thức .

Cập nhật:

Đối với Maven> = 3

Dựa trên nhận xét của Matthew, bây giờ bạn có thể làm như thế này:

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

Xem báo cáo lỗi / tài liệu .


2
Bạn có thể chỉ định "FinalName" tại dòng lệnh không? (-Djar.finalName = x) dường như không hoạt động.
jayunit100

Tôi đã không thử sử dụng dòng lệnh. Bạn đã thử giải pháp Maven chưa?
Christian Vielma

1
Một chút cập nhật, 2.4 là phiên bản mới nhất. Vẫn hoạt động tốt mặc dù.
PaulBGD

1
Với các plugin Maven, người ta không phải đưa vào phiên bản. Tôi giả sử nó chọn mới nhất. Và nếu ai đó đã tự hỏi, tên jar không có hậu tố tập tin, vì vậy không có "myJar.jar" mà là "myJar" vì nó được hiển thị chính xác trong ví dụ.
Espinosa

13
Kể từ phiên bản 3.0.0, finalNamecấu hình đã bị xóa. Tuy nhiên, phương pháp của OP sẽ hoạt động. Xem các vấn đề.apache.org/jira/browse/MJAR
Matthew

42

Tất cả các câu trả lời được cung cấp phức tạp hơn mức cần thiết. Giả sử bạn đang xây dựng một tệp jar, tất cả những gì bạn cần làm là thêm một <jar.finalName>thẻ vào <properties>phần của bạn :

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

Điều này sẽ tạo ra một jar:

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

Đây là trong tài liệu - lưu ý User Property:

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

Sử dụng dòng lệnh

Bạn cũng có thể sử dụng tùy chọn này trên dòng lệnh với:

mvn -Djar.finalName=myCustomName ...

Bạn sẽ nhận được myCustomName.jar, mặc dù tôi chưa thử nghiệm điều này.


6
Với Spring Boot, nó không hoạt động như stackoverflow.com/a/14490656/2294031 . Trong khi đó <jar.finalName>foo</jar.finalName>tạo ra hai bình: một bình thực thi bao gồm các phụ thuộc được đặt tên foo-${project.version}.jarvà một bình thứ hai chỉ chứa dự án được đặt tên ${project.name}-${project.version}.jar, <build><finalName>foo</finalName></build>chỉ tạo ra các tệp thực thi bao gồm các phụ thuộc có tênfoo.jar
Sno Muffbert

Hoạt động và tôi đồng ý đây là câu trả lời đơn giản và thậm chí bạn có thể thực hiện <jar.finalName> $ {groupId} - $ {artifactId} - $ {phiên bản} </ jar.finalName>
Nhà phát triển MG

37

@Châm ngôn
thử cái này ...

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>

Cộng đồng mvn clean install

Đầu ra

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


Tài liệu tham khảo


5
trong trường hợp của tôi, <file> phải là <file> $ {build.directory} / $ {project.build.finalName}. $ {project.packaging} </ file>
Cpt. Senkfuss

2
Sự khác biệt giữa việc đặt thẻ FinalName trực tiếp trong maven-install-plugin VS maven-jar-plugin là gì?
Pocketkid2

Điều này thật tuyệt, tôi đã có thể sử dụng thủ thuật này để xuất bản tệp .xml trực tiếp dưới dạng một tạo phẩm.
Benjamin Damm

1
Đây là lần đầu tiên xây dựng cơ sở-1.0.0.SNAPSHOT.jar và sau đó là cơ sở-4.0.8.8.jar?
Đánh dấu

1
Tại sao cổ vật được cài đặt hai lần với hai tên khác nhau? Vui lòng hiển thị một cấu hình để cài đặt nó chỉ một lần.
chrisinmtown

18

Ở giai đoạn gói, plugin cho phép cấu hình tên tệp đã nhập thông qua ánh xạ tệp:

maven-tai-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

Nếu bạn đã định cấu hình phiên bản của mình để 'thử nghiệm' thông qua cấu hình hoặc thứ gì đó, thì phiên bản này sẽ hoạt động cho gói chiến tranh:

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
Và cho một kho lưu trữ jar?
Stephane


3

Cách tiếp cận bạn đang sử dụng thực sự là tệp jar có chuỗi 'thử nghiệm' trong tên của nó, như bạn đã chỉ định, nhưng lệnh cài đặt mặc định sẽ gửi nó đến thư mục ~ / .m2 / kho lưu trữ của bạn, như đã thấy trong dòng đầu ra này:

/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

Dường như với tôi rằng bạn đang cố gắng tạo một cái bình có tên như vậy và sau đó sao chép nó vào một thư mục bạn chọn.

Hãy thử sử dụng thuộc tính outputDirectory như được mô tả ở đây: http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html


Trên thực tế, thiết lập hoàn chỉnh của tôi là như sau: Tôi có superpom trong đó tôi muốn xác định phiên bản hiện tại tôi đang xây dựng. Sau đó, tôi có một số dự án xác định pom này là cha mẹ của họ. Tôi sử dụng hudson-ci để xây dựng tất cả các dự án này. Sau đó hudson đẩy các dự án vào nhân tạo. Tôi đang tìm kiếm thứ gì đó cho phép tôi thay đổi phiên bản hiện đang được xây dựng. Tôi sẽ xem xét làm thế nào tôi có thể sử dụng đầu vào mới của bạn. Cảm ơn bạn.
Maxim Veksler

Vậy ... để kiểm soát phiên bản sẽ được cài đặt, tôi cần ghi đè một tham số maven khác?
Maxim Veksler

7
Điều đó không đúng. Tên trong repo địa phương được chuẩn hóa : groupId/artifactId/version/artifactId-version-classifier.packaging. FinalName chỉ áp dụng cho tên tệp cục bộ trong thư mục đầu ra.
Sean Patrick Floyd

Cảm ơn đã chú ý. Trên thực tế, chính dòng tôi trích dẫn cho thấy lỗi của tôi. Tuy nhiên, tôi có ấn tượng rằng thứ Maxim cần là cái hũ trong thư mục địa phương (theo lựa chọn của anh ta).
Goran Jovic

@SeanPatrickFloyd vậy có cách nào để thay đổi artifactId-version-classifier.packaging thành tên cutom không?
Khalid Abu El-Soud

2

Tôi đang sử dụng như sau

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

Bằng cách này, bạn có thể xác định từng giá trị riêng lẻ hoặc thực tế từ Jenkins của một số hệ thống khác.

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

Điều này sẽ đặt một thư mục target\{group.id}\projectName-1.2.3.jar

Một cách tốt hơn để tiết kiệm thời gian có thể là

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

Giống như ngoại trừ tôi sử dụng trên biến.

  mvn package -DbaseVersion=0.3.4

Điều này sẽ đặt một thư mục target\{group.id}\projectName-1.2.3.jar

bạn cũng có thể sử dụng outputDirectorybên trong configurationđể chỉ định vị trí bạn có thể muốn gói được định vị.


1

Trong dự án maven ee của tôi, tôi đang sử dụng:

<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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.