maven jar-de-dependencies의 이름을 바꿀 수 있습니까?


138

현재 jar-with-dependencies 어셈블리를 사용하여 이러한 jar을 만들고 있습니다. 그러나 내 항아리의 이름은 약간 길다.

이 jar은 AS400의 RPG 프로그램에서 사용되기 때문에 개발자가 인생을 조금 더 쉽게 만들 수 있도록 단축하고 싶습니다. 그러나 손으로 이외는 일반적인 항아리 이름을 바꾸는 방법을 찾지 못했습니다 project-name-version-classifier-jar-with-dependencies.jar. 나는 같은 것을 원한다project-name-version-classifier-full.jar

기본적으로 jar-with-dependencies 어셈블리 디스크립터를 복사하고 전체를 호출하지 않고이 작업을 수행 할 수 있습니까?

또한 클래스 경로가없는 항아리를 저장소에 계속 저장하고 싶습니다.

두 가지 유물이 필요합니다. 빌드 할 영역을 보유하고있는 분류 기가있는 항아리. 영역을 포함하는 모든 종속성이있는 jar

project-name-version-region-full.jarproject-name-version-region.jar저장소에 저장해야합니다. 첫 번째 예에서 분류기는 영역이 가득 차고 두 번째는 영역입니다. 후자는 효과가 있습니다.

답변:


227

jar에 원하는 이름을 지정하기 위해 finalName 속성을 지정 하고 "jar-with-dependencies"접미사를 피하기 위해 appendAssemblyId 를 false로 지정할 수 있습니다.

아래 구성은 "test.jar"라는 jar을 출력합니다.

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.2-beta-4</version>
  <executions>
    <execution>
      <id>jar-with-dependencies</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <finalName>test</finalName>
        <appendAssemblyId>false</appendAssemblyId>
      </configuration>
    </execution>
  </executions>
</plugin>

업데이트 : 귀하의 의견에 따라 내장 디스크립터를 사용하면 작동하지 않습니다. 나는 이것이 최신 버전의 어셈블리 플러그인의 버그로 인한 것이라고 생각합니다. 분류 자에 대한 지원을 제거했지만 내장 디스크립터를 사용하면 ID가 수정되므로 큰 이름이 붙습니다.

이 문제를 해결하려면 jar-with-dependencies 설명 자가 사용하는 어셈블리 설명자를 복사 하고 ID를 수정할 수 있습니다.

이 예제는 어셈블리 ID가 finalName에 추가되도록하므로 region-full.jar 의 이름이 필요한 경우 finalName을 region으로 지정 하고 어셈블리 ID를 full 로 지정할 수 있습니다 . 결과적으로 region-full.jar라는 대상에 파일이 생성되지만 full 로 첨부 된 아티팩트로 Maven 저장소에 여전히 설치됩니다. 분류 자로 사용 . 이 ID가 다른 어셈블리의 ID와 다른 한 충돌이 없어야합니다.

pom 구성은 다음과 같습니다.

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.2-beta-4</version>
  <executions>
    <execution>
      <id>jar-with-dependencies</id>
      <phase>prepare-package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <descriptors>
          <descriptor>src/main/assembly/jar-assembly.xml</descriptor>
        </descriptors>
        <finalName>region</finalName>
      </configuration>
    </execution>
  </executions>
</plugin>

src / main / assembly의 jar-assembly.xml은 다음과 같습니다.

<assembly>
  <id>full</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <unpack>true</unpack>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
  <fileSets>
    <fileSet>
      <directory>${project.build.outputDirectory}</directory>
    </fileSet>
  </fileSets>
</assembly>

그 정교한 작업 Rich. 기본적으로 두 개의 분류 자 ​​아티팩트를 저장해야합니다. appendAssemblyId를 설정 한 상태에서 분류 자없는 분류기, 분류기 버전 및 독립형 jar 버전의 3 개의 artifiact가있었습니다. appendAssemblyID를 끈 상태에서 uber jar이 비 분류 버전으로 설치됩니다. 이 사람들에게 그들이 만들어진 곳을 나타내는 region + full based classifier를 사용해야합니다. 불행히도 분류 자 ​​태그를 추가해도 작동하지 않습니다.
Mike Cornell

36

별도의 jar-assembly.xml이 없어도 pom에서 직접 구성하는 방법을 찾았습니다.

finalName이 artifactId 및 version으로 지정된다는 점을 제외하고는 기본적으로 Rich의 답변과 동일합니다.

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <finalName>${project.artifactId}-${project.version}-full</finalName>
        <appendAssemblyId>false</appendAssemblyId>
        <archive>
            <manifest>
                <mainClass>com.mycompany.MyMainClass</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-my-jar-with-dependenciess</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

8

여기의 게시물과 maven 문서의 일부 파기 덕분에 사용자 정의 이름을 가진 일반적인 일회용 일회용 포장 항아리 어셈블리에 대한 다음 구성을 생각해 냈습니다.

pom.xml에서 :

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2</version>
    <executions>
        <execution>
            <id>exe</id>
            <phase>package</phase>
            <goals><goal>single</goal></goals>
            <configuration>
                <finalName>MyJarName</finalName>
                <attach>false</attach>
                <appendAssemblyId>false</appendAssemblyId>
                <descriptors>
                    <descriptor>assembly.xml</descriptor>
                </descriptors>
                <archive>
                    <manifest>
                        <mainClass>karlthepagain.MyMain</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </execution>
    </executions>
</plugin>

assembly.xml에서 :

<assembly>
    <id>exe</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <unpack>true</unpack>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
</assembly>

이렇게하면 MyJarName.jar모든 종속성이 동일한 jar 및 지정된에 다시 패키지됩니다 Main-Class: karlthepagain.MyMain.


3

리치에게 올바른 방향으로 나를 지적한 것에 대해 크레딧을 주려고하지만 리치가 약간 벗어 났기 때문에 저에게 도움이되는 솔루션을 게시하고 싶었습니다.

내 jar-assembly.xml은 다음과 같으며 내 프로필에 속성으로 저장된 영역의 어셈블리 ID를 변경할 수 있습니다.

<assembly>
  <id>${env}-full</id>
    <formats>
      <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
      <dependencySet>
        <unpack>true</unpack>
        <scope>runtime</scope>
      </dependencySet>
    </dependencySets>
    <fileSets>
      <fileSet>
        <directory>${project.build.outputDirectory}</directory>
      </fileSet>
    </fileSets>
</assembly>

enven-full이 분류 자 ​​인 project-name-version-env-full.jar 이름으로 프로젝트를 빌드했기 때문에 maven-assembly-plugin 설정에서 finalName 매개 변수를 사용하지 않았습니다.

어셈블리 xml이 빌드의 항목으로 매개 변수화 될 수 있다는 것을 알았을 때 놀랍습니다. 이것은 내가 찾던 것입니다.


2

이것은 나를 위해 일했다

<build>
    <finalName>anynameyoulike</finalName>
    <plugins>           
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>                   
                <appendAssemblyId>false</appendAssemblyId>
                <archive>
                    <manifest>
                        <mainClass>com.mycompany.MyMainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id> <!-- this is used for inheritance merges -->
                    <phase>package</phase> <!-- bind to the packaging phase -->
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

1

${project.build.finalName}최종 이름 으로 사용하여 원본 jar 파일을 덮어 쓸 수도 있습니다 .

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
   <executions>
      <execution>
          <phase>package</phase>
          <goals>
             <goal>single</goal>
          </goals>
      </execution>
   </executions>
   <configuration>
     <descriptorRefs>
       <descriptorRef>jar-with-dependencies</descriptorRef>
     </descriptorRefs>
     <finalName>${project.build.finalName}</finalName>
     <appendAssemblyId>false</appendAssemblyId>
   </configuration>
 </plugin>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.