Maven 2 ile koşabilir bir kavanoz inşa etmek


82

Maven mantrasında nispeten yeniyim, ancak Maven ile komut satırı çalıştırılabilir bir jar oluşturmaya çalışıyorum. Bağımlılıklarımı kurdum, ancak mvn installkavanozu çalıştırıp çalıştırmayı denediğimde iki şey oluyor. İlk olarak, düzeltilebilir bir ana sınıf bulunmaz. Bunu düzelttiğimde, çalışma sırasında sınıfların bulunamadığını belirten hatalar alıyorum.

Maven, bağımlılık kitaplıklarımı kavanozun içinde paketlemiyor, bu nedenle kavanozu bağımsız bir uygulama olarak çalıştıramıyorum. Bunu nasıl düzeltirim?


Netbenas
Sajad Bahmani

7
@SjB: ve bu sorunu sihirli bir şekilde çözer mi? Ben öyle düşünmüyorum.
Joachim Sauer

1
Tam olarak neyin aynısı mı?
Stefan Kendall

Belki bu bir stackoverflow.com/questions/1832853/… veya bu tek stackoverflow.com/questions/574594/… (ancak kabul edilen yanıt yanlıştır) veya bu bir stackoverflow.com/questions/1814526/… . Aslında, bu
maven'de

1
Diğer cevaplar o kadar temiz değil ve uber jar (ueber yanlış yazılmış) çalıştırılabilirlikten bahsetmiyor. Ayrıca, diğer konular kaynak seviyesi vb. Gibi ilgisiz materyallerle doludur
Stefan Kendall

Yanıtlar:


113

Bunu yapmanın en kolay yolu, maven-assembly-pluginve önceden tanımlanmış jar-with-dependenciestanımlayıcıyı kullanarak bir derleme oluşturmaktır . Ayrıca bu uber jar için ana sınıf bir giriş içeren bir bildirim oluşturmanız gerekecektir. Aşağıdaki kod parçası, montaj eklentisinin bunu yapmak için nasıl yapılandırılacağını gösterir:

<build>
  <plugins>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <configuration>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
          <manifest>
            <mainClass>fully.qualified.MainClass</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

Ardından, montajı oluşturmak için şunu çalıştırın:

mvn assembly:assembly

assembly:singleDerlemeyi yapınızın bir parçası olarak oluşturmak istiyorsanız, mojo'yu paket aşamasına bağlamanız yeterlidir :

<build>
  <plugins>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <configuration>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
          <manifest>
            <mainClass>fully.qualified.MainClass</mainClass>
          </manifest>
        </archive>
      </configuration>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Ve basitçe çalıştırın:

mvn package

1
Maven-shade-eklentisi de benzer şekilde çalışır ve bu amaca adanmıştır.
Dominic Mitchell

4
Bu, Spring ve sınıf yolunda aynı ada sahip birden çok kaynak bekleyen diğer kitaplıklar için çalışmaz. Yay durumunda, META-INF \ spring.schemas birkaç kavanozda (fasulye, jdbc, vb.) Bulunur ve XML ayrıştırıcı için XML ad alanı desteğini yapılandırmak için kullanılır. 'Bağımlılıkları içeren jar'i denerseniz, uygulama-context.xml'i pasing uygulama zamanında "org.xml.sax.SAXParseException: cvc-elt.1:" fasulye "öğesinin bildirimi bulunamıyor."
David Roussel

@David Maven bir Java "sınırlamasını" çözmeyecek. Bu durumda uygulamanızı temiz bir şekilde (yani bir uberjar içinde değil) paketleyin.
Pascal Thivent 04

Bu, Spring yapılandırmasıyla sorunsuz çalışır. Ana sınıfım diğer tüm sınıfları Classpath Application bağlamıyla yükler ve bu çözüm mükemmel çalışır.
vsingh

2
assembly:assemblyAmaç edilir kaldırılmış
Jared Beck

25

Maven, bağımlılıklarınızı jar dosyanızın içinde paketlemiyor çünkü bunu genellikle Java programları ile yapmıyorsunuz.

Onun yerine, sen kavanoz dosyası ile birlikte bağımlılıkları teslim ve onları söz Manifest başlığına .Class-Path

Bu rotaya gitmek için, için addClasspathözelliği ( burada belgelenmiştir ) etkinleştirmeniz gerekir maven-jar-plugin.

Tüm bağımlılıklarınızı jar dosyanıza gerçekten dahil etmek istiyorsanız, o zaman Maven Assembly eklentisini kullanarak bir jar-with-dependencies.


4
+1 Özellikle Maven ile java programlarının nasıl inşa edilip dağıtılmasının amaçlandığı konusunda bilgi bulmakta zorlandım .
Ed Brannin

8

Küçük projeler için yapacağım şey bu. Çoğu zaman kocaman bir kavanoz istemezsin.

derlemek için: mvn temiz bağımlılık: kopya bağımlılıkları paketi

çalıştırmak için ( hedef dizinde ): java -cp myjar.jar: ./ bağımlılık / * com.something.MyClass


Harika! Bunu Makefile dosyamda, pom.xml ile aynı dizine kaydettim. build: \ n mvn .... (ne söylediniz)
Roboprog

Teşekkürler. İnternette 2 saatten fazla arama yaptıktan sonra bu çok yararlı cevabı buldum ....
Shekhar

6

Joachim Sauer ile Katılıyorum,

Bağımlılık içeren jar kullanmak yerine jar eklentisini pom.xml'nizde olduğu gibi yapılandırmalısınız:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <archive>
            <index>true</index>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>[mainClassFullName]</mainClass>
            </manifest>
            <manifestEntries>
                <mode>development</mode>
                <url>${project.url}</url>
                <key>value</key>
            </manifestEntries>
        </archive>
    </configuration>
</plugin>

Ve derlemenize jar bağımlılıklarını eklemek için bu derleme yapılandırmasını kullanın:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
  <id>zip-with-jars</id>
  <formats>
    <format>zip</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySets>
    <dependencySet>
    <outputDirectory>/</outputDirectory>
    <useProjectArtifact>true</useProjectArtifact>
    <unpack>false</unpack>
    <scope>runtime</scope>
    </dependencySet>
</dependencySets>
  </dependencySets>
</assembly>

2

Aşağıdaki kodu pom.xml dosyasına ekleyin ve Farklı çalıştır: maven: install. Kavanoz tutulmanın hedef klasöründe oluşturulacak ve "java -jar Merhaba.jar" olarak kullanılabilecek. ancak ana sınıfın adının com.abc.HelloWorld.java olarak verildiğinden emin olun

<build>
<plugins>
<plugin>
<groupid>org.apache.maven.plugins</groupid>
<artifactid>maven-shade-plugin</artifactid>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<finalname>HelloW</finalname>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestentries>
<main-class>com.abc.HelloWorld.java</main-class>
<build-number>1</build-number>
</manifestentries>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>

</build>
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.