Maven kullanarak şişman bir kavanoz yapmak


118

Jar olarak dağıtmak istediğim bir kod tabanım var. Ayrıca, son kavanozda paketlemek istediğim harici kavanozlara da bağımlıdır.

Bunun kullanılarak yapılabileceğini duydum maven-assembly-plug-inama nasıl olduğunu anlamıyorum. Birisi bana bazı örnekler verebilir mi?

Şu anda, son kavanozu paketlemek için şişman kavanoz kullanıyorum. Aynı şeyi maven kullanarak elde etmek istiyorum.

Yanıtlar:


144

Not: Bir yaylı önyükleme uygulamasıysanız, cevabın sonunu okuyun

Aşağıdaki eklentiyi ekleyin pom.xml En son sürüme şu adresten ulaşabilirsiniz:

...
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>CHOOSE LATEST VERSION HERE</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>assemble-all</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
...

Bu eklentiyi yapılandırdıktan sonra, çalıştırma mvn packageiki kavanoz oluşturacaktır: biri yalnızca proje sınıflarını içeren ve tüm bağımlılıkları "-jar-ile-bağımlılıklar" sonekine sahip ikinci bir yağ kavanozu.

classpathçalışma zamanında doğru kurulumu istiyorsanız , aşağıdaki eklentiyi de ekleyin

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>fully.qualified.MainClass</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

İlkbahar önyükleme uygulaması için sadece aşağıdaki eklentiyi kullanın (uygun sürümünü seçin)

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <fork>true</fork>
        <mainClass>${start-class}</mainClass>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

1
Bu eklentinin şu anki sürümü artık 2.4
2013

13
Bu artık kullanımdan kaldırılmıştır ve bunun yerine maven-shade-eklentisi kullanılmalıdır. @Phlogratos answer: stackoverflow.com/a/16222965/274350 adresine bakın .
Richard Neish

2
Maven-assembly-eklentisi yağ kavanozunun boyutunu en aza indirebilir mi?
Mayıs

1
@Richard Kullanımdan kaldırıldığını nerede görüyorsunuz? Burada hiçbir şey bulamadım maven.apache.org/plugins/maven-assembly-plugin
user3833308

3
@ user3833308 "kullanımdan kaldırıldı" yanlış kelime olabilir, ancak maven.apache.org/plugins/maven-assembly-plugin adresindeki dokümantasyon "Projeniz yapınızı bir uber-jar içinde paketlemek istiyorsa, montaj eklentisi yalnızca temel Daha fazla kontrol için Maven Shade Plugin'i kullanın. "
Richard Neish

55

Sen kullanabilirsiniz maven-gölge-eklentisi .

Yapınızdaki gölge eklentisini yapılandırdıktan sonra, komut mvn package, tüm bağımlılıkları kendisine birleştirilen tek bir jar oluşturacaktır.


9
Şimdi bunu yapmanın doğru yolu budur. Maven-assembly-eklenti dokümantasyonu şunu belirtir: "Projeniz yapınızı bir uber-jar içinde paketlemek istiyorsa, montaj eklentisi yalnızca temel destek sağlar. Daha fazla kontrol için Maven Shade Eklentisini kullanın."
Richard Neish

Ama bu tek .jar'ı nasıl alıp yayınlamak için kullanırım?
DanGordon

42

Belki de maven-shade-plugin, çatışmaları önlemek için bağımlılıkları bir araya toplayın, kullanılmayan kodu en aza indirin ve harici bağımlılıkları gizleyin.

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <minimizeJar>true</minimizeJar>
                        <createDependencyReducedPom>true</createDependencyReducedPom>
                        <dependencyReducedPomLocation>
                            ${java.io.tmpdir}/dependency-reduced-pom.xml
                        </dependencyReducedPomLocation>
                        <relocations>
                            <relocation>
                                <pattern>com.acme.coyote</pattern>
                                <shadedPattern>hidden.coyote</shadedPattern>
                            </relocation>
                        </relocations>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Referanslar:


Biri karşılaşırsa Provider org.apache.xerces.jaxp.SAXParserFactoryImpl not found, kaldırmanız yeterlidir <minimizeJar>true</minimizeJar>.
koppor

Bir "java.lang.SecurityException: Manifest ana öznitelikleri için geçersiz imza dosyası özeti" istisnası
alırsanız

12

aslında ekleyerek

<archive>
   <manifest>
    <addClasspath>true</addClasspath>
    <packageName>com.some.pkg</packageName>                     
    <mainClass>com.MainClass</mainClass>
  </manifest>
</archive>

maven-jar-plugin bildirimi ana sınıf girdisini benim için manifest dosyasına eklemiyor. Bunu manifestte almak için maven-assembly-eklentisine eklemem gerekiyordu


5

Paketleme için onejar-maven-eklentisini kullanabilirsiniz . Temel olarak, projenizi ve bağımlılıklarını, yalnızca proje jar dosyanızı değil, aynı zamanda bir "kavanoz kavanozu" olarak tüm harici bağımlılıkları da içeren tek bir kavanozda bir araya getirir.

<build>
    <plugins>
        <plugin>
            <groupId>com.jolira</groupId>
            <artifactId>onejar-maven-plugin</artifactId>
                <version>1.4.4</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>one-jar</goal>
                        </goals>
                    </execution>
                </executions>
        </plugin>
    </plugins>
</build>

Not 1: Konfigürasyon seçenekleri proje ana sayfasında mevcuttur .

Not 2: Bir sebepten ötürü onejar-maven-eklenti projesi Maven Central'da yayınlanmamaktadır. ancak jolira.com orijinal projeyi takip eder ve bunu groupId ile yayınlar com.jolira.


Paketlemek istediğiniz bağımlılıkları seçmek mümkün mü? Örneğin, a.jar ve b.jar harici kavanozlarsa ve yalnızca a.jar'ı son kavanozda paketlemek istiyorsam, bu mümkün / yapılandırılabilir bir şey mi?
bianca

Ayrıca tek kavanozun son kavanozda paketlendiğini de görüyorum. Bu, son kavanozun boyutunu çok arttırdı. Nihai kavanoza dahil etmeyi düşündüğünüz harici kavanozları seçmek mümkün mü? İşte tek kavanoz günlükler: pastebin.com/UwniQJ2X
bianca

Nelerin dahil edilip edilmeyeceğini yapılandırabilir misiniz bilmiyorum. Temel olarak, tek kavanoz, geçişli bağımlılıklar da dahil olmak üzere projeniz tarafından belirtilen tüm bağımlılıkları içerir, bu nedenle evet, çok fazla bağımlılığınız varsa son kavanozun büyük olması muhtemeldir. Java'nın "kavanozlar kavanozu" yapısıyla çalışmasını sağlamak için bir kavanoz tarafından bazı ek yükler eklenecektir.
matsev

2

Bir alternatif, maven shade eklentisini kullanarak bir uber-jar.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version> Your Version Here </version>
    <configuration>
            <!-- put your configurations here -->
    </configuration>
    <executions>
            <execution>
                    <phase>package</phase>
                    <goals>
                            <goal>shade</goal>
                    </goals>
            </execution>
    </executions>
</plugin>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.