jar 이슈의 maven 최종 이름 제어


174

모든 하위 프로젝트에서 생성 된 아티팩트의 대상으로 사용할 수퍼 속성을 속성을 정의하려고합니다.

이를 위해 나는 사용하려고 생각 project/build/finalName했지만 단순한 poms에서도 작동하지 않는 것 같습니다.

명령

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

문자열 "testing"이 생성 된 이슈 이름의 어딘가에 나타날 것으로 예상합니다.

"finalName"의 목적을 오해하고 있습니까?


알 니스 - (마지막 이름을 포함한) 모든 기본값은 (좋은 참조 소스입니다) 슈퍼 응원단에서 상속 - books.sonatype.com/mvnref-book/reference/...
안드레이

답변:


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

Matthew의 의견을 바탕으로 이제 다음과 같이 할 수 있습니다.

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

버그 리포트 / 문서를 참조하십시오 .


2
명령 행에서 "finalName"을 지정할 수 있습니까? (-Djar.finalName = x)가 작동하지 않는 것 같습니다.
jayunit100

커맨드 라인을 사용하지 않았습니다. Maven 솔루션을 사용해 보셨습니까?
Christian Vielma

1
약간의 업데이트 인 2.4가 최신 버전입니다. 그래도 여전히 잘 작동합니다.
PaulBGD

1
Maven 플러그인을 사용하면 버전을 포함하지 않아도됩니다. 나는 그것이 최신을 선택한다고 가정합니다. 누군가가 궁금 경우 그리고, 단지 이름이 없다 하지 않고 , 파일 확장자 그래서 올바르게 예에 도시 된 바와 같이 "myJar.jar"그러나 "가 myjar".
Espinosa

13
버전 3.0.0부터 finalName구성이 제거되었습니다. 그러나 OP의 방법은 효과가 있습니다. issues.apache.org/jira/browse/MJAR-233
Matthew

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
스프링 부트에서는 stackoverflow.com/a/14490656/2294031으로 작동하지 않습니다 . 반면 <jar.finalName>foo</jar.finalName>두 개의 jar 파일을 생성 하는 반면, 이름이 지정된 종속성을 포함하는 실행 파일 jar foo-${project.version}.jar와 이름이 지정된 프로젝트 만 포함하는 두 번째 jar 파일${project.name}-${project.version}.jar , <build><finalName>foo</finalName></build>라는 이름의 종속성을 포함에만 실행 항아리 생성foo.jar
Snozzlebert

작품과 나는이 간단한 대답에 동의하고 당신도 할 수있는 <jar.finalName> $ {의 groupId} - $ {artifactId를} - $ {버전} </ 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>

코나드 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>
이어야합니다.

2
maven-install-plugin VS maven-jar-plugin에 finalName 태그를 직접 넣는 것의 차이점은 무엇입니까?
Pocketkid2

이것은 훌륭합니다.이 트릭을 사용하여 .xml 파일을 이슈로 직접 게시 할 수있었습니다.
Benjamin Damm

1
먼저 base-1.0.0.SNAPSHOT.jar을 빌드 한 다음 base-4.0.8.8.jar입니까?
Mark W

1
이슈가 두 개의 다른 이름으로 두 번 설치되는 이유는 무엇입니까? 한 번만 설치하도록 구성을 표시하십시오.
chrisinmtown

18

패키지 단계에서 플러그인을 사용하면 파일 매핑을 통해 가져온 파일 이름을 구성 할 수 있습니다.

메이븐 이어 플러그인

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 패키지에서 작동합니다.

메이븐 전쟁 플러그인

<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
그리고 단지 기록 보관소를 위해?
Stephane


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

그런 이름의 항아리를 생성 한 다음 선택한 디렉토리에 복사하려고하는 것 같습니다.

여기에 설명 된대로 outputDirectory 특성을 사용하십시오. http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html


사실, 내 완전한 설정은 다음과 같습니다. 현재 빌드중인 버전을 정의하고 싶은 슈퍼 폼이 있습니다. 그런 다음이 pom을 부모로 정의하는 여러 프로젝트가 있습니다. hudson-ci를 사용하여 이러한 모든 프로젝트를 빌드합니다. 그리고 허드슨은 프로젝트를 인공물로 밀어 넣었다. 현재 구축중인 버전을 변경할 수있는 것을 찾고 있습니다. 새 입력을 어떻게 사용할 수 있는지 살펴 보겠습니다. 감사합니다.
Maxim Veksler

그래서 ... 설치할 버전을 제어하려면 다른 maven 매개 변수를 재정의해야합니까?
Maxim Veksler

7
맞지 않습니다. 로컬 리포지토리의 이름이 정규화되었습니다 groupId/artifactId/version/artifactId-version-classifier.packaging. finalName은 출력 디렉토리의 로컬 파일 이름에만 적용됩니다.
Sean Patrick Floyd

알아 주셔서 감사합니다. 실제로, 인용 한 바로 그 줄에 내 오류가 표시됩니다. 그러나 Maxim이 필요로하는 것은 로컬 디렉토리의 항아리 (자신의 선택)라는 인상을 받았습니다.
Goran Jovic

@SeanPatrickFloyd 그래서 artifactId-version-classifier.packaging을 cutom name으로 변경하는 방법이 있습니까?
Khalid Abu El-Soud

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

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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.