2009-08-26 17 views
95

Obecnie używam złożenia jar-with-dependencies, aby utworzyć taki słoik. Jednak nazwa mojego słoika jest trochę długa.Czy można zmienić nazwę maven-with-dependencies?

Ponieważ ten słoik jest używany w programach RPG na AS400, chciałbym go skrócić, aby ułatwić życie tym programistom. Ale, inaczej niż ręcznie, nie znalazłem sposobu na zmianę nazwy słoika ze zwykłego project-name-version-classifier-jar-with-dependencies.jar. Chciałbym coś takiego jak Czy jest to w ogóle zrobić bez zasadniczo skopiować deskryptor montażu słoik z zależnościami i wywoływanie go pełne?

Dodatkowo, chcę nadal mieć słoik bez zmontowanej ścieżki klas przechowywanej w repozytorium.

Potrzebuję dwóch artefaktów. Słoik z moim klasyfikatorem zawierającym region, dla którego przeznaczona jest kompilacja. Słoik ze wszystkimi zależnościami, który obejmuje również region.

project-name-version-region-full.jar i powinny być przechowywane w repozytorium. W pierwszym przykładzie klasyfikator jest regionem pełnym, w drugim jest regionem. Ta ostatnia działa.

Odpowiedz

168

można określić finalName własność dać słoika żądaną nazwę i określ, które appendAssemblyId powinny być fałszywe, aby uniknąć „Jar-z zależnościami” sufiks.

Konfiguracja poniżej wyjścia woli słoik nazwie „test.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> 

Aktualizacja: na podstawie swoich uwag, za pomocą wbudowanego w deskryptorze nie będzie działać. Wierzę, że jest to spowodowane błędem w najnowszych wersjach wtyczki zespołu - usunęli obsługę klasyfikatorów, ale identyfikator jest poprawiony, jeśli używasz wbudowanego deskryptora, więc kończysz na dużej, grubej nazwie.

Jako obejście można skopiować deskryptor zespołu używany w deskryptorze zestawu i zmodyfikować identyfikator.

Przykład ten spowodowałby id montażowej są dołączane do finalName, więc jeśli chcesz mieć nazwę Region-full.jar można określić finalName jak regionu i id montażowej jako pełna. Spowoduje to, że plik docelowy będzie nazywany region-full.jar, ale należy pamiętać, że będzie on nadal instalowany w repozytorium Maven jako dołączony artefakt o numerze pełnym używanym jako klasyfikator. Dopóki identyfikator ten różni się od tego dla twojego drugiego zespołu, nie powinno być żadnych kolizji.

Konfiguracja pom będzie wyglądać tak.

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

i słoik assembly.xml w src/main/montaż tak:

<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> 
+1

Ach, appendAssemblyId, jak ja za tobą tęsknię. Dzięki! –

+0

Praca nad tym opracowaniem Rich. Zasadniczo potrzebuję dwóch artefaktów klasyfikatora do przechowywania. Po włączeniu appendAssemblyId miałem 3 artefakty, jeden bez klasyfikatora, wersję klasyfikatora i wersję słoik-z-zależnościami. przy wyłączonym appendAssemblyID słoik uber jest instalowany w wersji nieklasyfikacyjnej. Potrzebuję tych użytkowników, którzy używają klasyfikatora opartego na regionie + pełny, który mówi, gdzie zostały zbudowane. Niestety dodanie tagu klasyfikatora nie działa. –

+0

Po prostu ustawienie * appendAssemblyId * na * false * wykonało zadanie. Pozwala zachować zwykłą nazwę końcową bez przepisywania jej. –

2

mam zamiar dać bogaty kredyt dla wskazujące mnie we właściwym kierunku, ale chciał opublikuj rozwiązanie, które zadziałało, ponieważ Rich's był nieznacznie wyłączony:

Moje słoiki.xml wyglądało to co pozwoliło id montażowej zmienić dla regionu, który został zapisany jako własność w moim profilu:

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

nie używać parametru finalName w ustawieniach Maven montażu plugin jak ten wbudowany mój projekt z moją nazwą-projektu-wersja-env-full.jar nazwa gdzie env-full był klasyfikatorem.

Wyobraźcie sobie moje zdziwienie, gdy dowiedziałem się, że xml zestawu można sparametryzować za pomocą elementów w kompilacji. Właśnie tego szukałem.

8

Dzięki postom tutaj i niektórym kopaniu w maven docs otrzymałem następującą konfigurację ogólnego, jednorazowego, spakowanego pliku wykonywalnego słoika z niestandardową nazwą.

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

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

To spowoduje MyJarName.jar ze wszystkimi jego zależności nowej postaci do tego samego naczynia i określony Main-Class: karlthepagain.MyMain.

+1

Naprawiono wszystkie moje problemy, głównie zmianę nazwy końcowego słoika z zależnościami. –

13

Myślę, że znalazłem sposób na skonfigurowanie tego bezpośrednio w pom bez potrzeby oddzielnego pliku jar-assembly.xml.

Jest to w zasadzie takie samo, jak odpowiedź Rich, z tym że ostateczna nazwa jest określona za pomocą artefaktId i wersji.

<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> 
+0

Masz długą drogę od pierwszej odpowiedzi, a ta odpowiedź nadal mi pomogła dzisiaj, więc thx! ; D – vakio

+1

Szukałem rozwiązania takiego jak twoje, bez oddzielnego pliku jar-assembly.xml. Dzięki ... To działa idealnie dla mnie ... –

+0

Świetnie! Nie ma za co :) – vikingsteve

2

Ten pracował dla mnie

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