È possibile rinominare un vaso con dipendenze?


138

Attualmente sto usando l'assembly jar-with-dependencies per creare un tale jar. Tuttavia, il nome del mio barattolo è un po 'lungo.

Dal momento che questo vaso viene utilizzato dai programmi RPG su un AS400, mi piacerebbe accorciarlo per rendere la vita un po 'più facile per quegli sviluppatori. Ma, a parte quello manuale, non ho trovato il modo di rinominare il barattolo dal solito project-name-version-classifier-jar-with-dependencies.jar. Vorrei qualcosa di simileproject-name-version-classifier-full.jar

Esiste un modo per farlo senza sostanzialmente copiare il descrittore dell'assembly jar-with-dependments e chiamarlo pieno?

Inoltre, voglio continuare ad avere il vaso senza il percorso di classe assemblato archiviato nel repository.

Ho bisogno di due artefatti. Il barattolo con il mio classificatore contiene la regione a cui è destinata la build. Il barattolo con tutte le dipendenze che include anche la regione.

project-name-version-region-full.jare project-name-version-region.jardovrebbe essere archiviato nel repository. Nel primo esempio il classificatore è pieno di regione, nel secondo è regione. Quest'ultimo funziona.

Risposte:


227

È possibile specificare la proprietà finalName per assegnare al jar il nome desiderato e specificare che appendAssemblyId deve essere falso per evitare il suffisso "jar-with-dependencies".

La configurazione seguente produrrà un vaso chiamato "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>

Aggiornamento: in base ai tuoi commenti, l'utilizzo del descrittore integrato non funzionerà. Credo che questo sia dovuto a un bug nelle recenti versioni del plug-in assembly: hanno rimosso il supporto per i classificatori, ma l'id è stato risolto se si utilizza un descrittore incorporato, quindi si finisce con un grande nome daft.

Per ovviare al problema, è possibile copiare il descrittore di assembly utilizzato dal descrittore jar-with-dependencies e modificare l'id.

In questo esempio, l'id dell'assembly verrà aggiunto a finalName, quindi se è necessario avere un nome di region-full.jar , è possibile specificare finalName come area e l'id assembly come pieno . Ciò comporterà un file nella destinazione chiamato region-full.jar, ma nota che verrà comunque installato nel repository Maven come artefatto allegato con pieno usato come classificatore. Fintanto che questo ID è diverso da quello per l'altro assemblaggio, non ci dovrebbero essere collisioni.

La configurazione pom sarebbe simile a questo.

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

e il jar-assembly.xml in src / main / assembly in questo modo:

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

Lavorando su quell'elaborazione Rich. In sostanza, ho bisogno di due artefatti classificatore per essere memorizzati. Con appendAssemblyId attivato, avevo 3 artefatti, uno senza classificatore, la versione classificatore e la versione jar-with-dependencies. con appendAssemblyID disattivato, il vaso UBER è installato nella versione non classificatore. Ho bisogno che questi ragazzi usino una regione + un classificatore completo che dice dove sono stati costruiti. Purtroppo l'aggiunta del tag classificatore non funziona.
Mike Cornell,

36

Penso di aver trovato un modo per configurarlo direttamente nel pom senza bisogno di un jar-assembly.xml separato.

È praticamente la stessa della risposta di Rich, tranne che finalName è specificato con artefattoId e versione.

<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

Grazie ai post qui e ad alcuni approfondimenti nei documenti di Maven, ho creato la seguente configurazione per un assembly jar eseguibile riconfezionato una tantum generale con un nome personalizzato.

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

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

Questo produrrà MyJarName.jarcon tutte le sue dipendenze reimballate nello stesso barattolo e nello specifico Main-Class: karlthepagain.MyMain.


3

Darò il merito a Rich per avermi indicato nella giusta direzione, ma volevo pubblicare la soluzione che ha funzionato per me dato che Rich era leggermente fuori:

Il mio jar-assembly.xml assomigliava a questo che consentiva la modifica dell'ID assembly per l'area memorizzata come proprietà nel mio profilo:

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

Non ho usato il parametro finalName nelle impostazioni di maven-assembly-plugin in quanto questo ha creato il mio progetto con il mio nome progetto-versione-env-full.jar dove env-full era il classificatore.

Immagina la mia sorpresa quando ho appreso che l'xml di assembly poteva essere parametrizzato dagli elementi nella build. Questo era esattamente quello che stavo cercando.


2

Questo ha funzionato per me

<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

È anche possibile sovrascrivere il file jar originale usando ${project.build.finalName}come nome finale:

<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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.