Apakah mungkin untuk mengganti nama jar-dengan-ketergantungan maven?

141

Saat ini saya menggunakan perakitan jar-with-dependencies untuk membuat toples seperti itu. Namun, nama toples saya agak panjang.

Karena toples ini digunakan oleh program RPG di AS400, saya ingin mempersingkatnya agar hidup sedikit lebih mudah bagi para pengembang tersebut. Tapi, selain dengan tangan, saya belum menemukan cara untuk mengganti nama toples dari biasanya project-name-version-classifier-jar-with-dependencies.jar. Saya mau yang seperti ituproject-name-version-classifier-full.jar

Apakah ada cara untuk melakukan ini tanpa pada dasarnya menyalin deskriptor perakitan jar-with-dependencies dan menyebutnya penuh?

Selain itu, saya ingin terus memiliki jar tanpa classpath yang dirakit disimpan di repositori.

Saya butuh dua artefak. Stoples dengan pengklasifikasi saya memegang wilayah tempat build tersebut. Guci dengan semua dependensi yang juga mencakup wilayah tersebut.

project-name-version-region-full.jardan project-name-version-region.jarharus disimpan di repositori. Dalam contoh pertama, pengklasifikasi adalah wilayah penuh, di contoh kedua adalah wilayahnya. Yang terakhir berfungsi.

Mike Cornell
sumber

Jawaban:

235

Anda dapat menetapkan properti finalName untuk memberi jar nama yang Anda inginkan, dan menetapkan bahwa appendAssemblyId harus salah untuk menghindari sufiks "jar-with-dependencies".

Konfigurasi di bawah ini akan menampilkan jar yang disebut "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>

Pembaruan: berdasarkan komentar Anda, menggunakan deskriptor internal tidak akan berfungsi. Saya yakin ini disebabkan oleh bug dalam versi terbaru dari plugin-assembly - mereka telah menghapus dukungan untuk pengklasifikasi, tetapi id diperbaiki jika Anda menggunakan deskriptor bawaan, jadi Anda akan mendapatkan nama yang besar.

Sebagai solusinya, Anda dapat menyalin deskriptor assembly yang digunakan oleh deskriptor jar-with-dependencies dan mengubah id.

Contoh ini akan menghasilkan id assembly yang ditambahkan ke finalName, jadi jika Anda perlu memiliki nama region-full.jar , Anda dapat menentukan finalName sebagai region dan id assembly sebagai full . Ini akan menghasilkan file dalam target yang disebut region-full.jar, tetapi perhatikan bahwa file itu masih akan diinstal ke repositori Maven sebagai artefak terlampir dengan full digunakan sebagai pengklasifikasi. Selama id ini berbeda dengan yang untuk perakitan Anda yang lain, seharusnya tidak ada tabrakan.

Konfigurasi pom akan terlihat seperti ini.

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

dan jar-assembly.xml di src / main / assembly seperti ini:

<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>
Penjual Kaya
sumber
Bekerja pada elaborasi itu Kaya. Pada dasarnya, saya memerlukan dua artefak pengklasifikasi untuk disimpan. Dengan appendAssemblyId aktif, saya memiliki 3 artifiact, satu tanpa classifier, versi classifier, dan versi jar-with-dependencies. dengan appendAssemblyID dimatikan, uber jar diinstal ke versi non-classifier. Saya perlu meminta orang-orang ini menggunakan pengklasifikasi berbasis wilayah + penuh yang mengatakan di mana mereka dibangun. Sayangnya menambahkan tag pengklasifikasi tidak berfungsi.
Mike Cornell
37

Saya rasa saya telah menemukan cara untuk mengkonfigurasi ini langsung di pom tanpa memerlukan jar-assembly.xml terpisah.

Ini pada dasarnya sama dengan jawaban Rich, kecuali finalName ditentukan dengan artifactId dan versinya.

<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>
vikingsteve.dll
sumber
8

Berkat posting di sini dan beberapa penggalian di dokumen maven, saya telah menemukan konfigurasi berikut untuk perakitan jar yang dapat dieksekusi satu kali yang dikemas ulang dengan nama khusus.

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

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

Ini akan menghasilkan MyJarName.jardengan semua dependensinya dikemas ulang ke dalam toples yang sama dan yang ditentukan Main-Class: karlthepagain.MyMain.

Karl the Pagan
sumber
3

Saya akan memberi penghargaan kepada Rich karena telah mengarahkan saya ke arah yang benar, tetapi ingin memposting solusi yang berhasil untuk saya karena milik Rich sedikit salah:

Jar-assembly.xml saya terlihat seperti ini yang memungkinkan id assembly berubah untuk wilayah yang disimpan sebagai properti di profil saya:

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

Saya tidak menggunakan parameter finalName dalam pengaturan maven-assembly-plugin karena ini membangun proyek saya dengan nama proyek-name-version-env-full.jar saya di mana env-full adalah pengklasifikasi.

Bayangkan betapa terkejutnya saya ketika saya mengetahui bahwa assembly xml dapat dijadikan parameter oleh item dalam build. Inilah yang saya cari.

Mike Cornell
sumber
2

Ini berhasil untuk saya

<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>
umesh9883
sumber
2

Dimungkinkan juga untuk menimpa file jar asli dengan menggunakan ${project.build.finalName}nama akhir:

<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>
Mark Schäfer
sumber