Maven ile çalıştırılabilir kavanoz mu oluşturuyorsunuz?


122

Maven kullanarak "logmanager" adlı küçük bir ev projesi için çalıştırılabilir bir jar oluşturmaya çalışıyorum, aynen şöyle:

Maven'i kullanarak bağımlılıkları olan yürütülebilir bir JAR'ı nasıl oluşturabilirim?

Orada gösterilen pasajı pom.xml'ye ekledim ve mvn assembly: assembly'yi çalıştırdım. Logmanager / target'da iki jar dosyası oluşturur: logmanager-0.1.0.jar ve logmanager-0.1.0-jar-with-dependencies.jar. İlk kavanozu çift tıkladığımda bir hata alıyorum:

Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit.

Bağımlılıkları içeren jar dosyasını çift tıkladığımda biraz farklı bir hata:

Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar

Yolu ve sınıf adını kopyalayıp yapıştırdım ve POM'daki yazımı kontrol ettim. Ana sınıfım bir tutulma başlatma yapılandırmasından iyi bir şekilde başlatılıyor. Birisi jar dosyamın neden çalışmayacağını anlamama yardım edebilir mi? Ayrıca, başlamak için neden iki kavanoz var? Daha fazla bilgiye ihtiyacınız olursa bana bildirin.

İşte pom.xmlreferans için tam :

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.gorkwobble</groupId>
  <artifactId>logmanager</artifactId>
  <name>LogManager</name>
  <version>0.1.0</version>
  <description>Systematically renames specified log files on a scheduled basis. Designed to help manage MUSHClient logging and prevent long, continuous log files.</description>
  <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.2</version>
            <!-- nothing here -->
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2-beta-4</version>
            <configuration>
              <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
              </descriptorRefs>
              <archive>
                <manifest>
                  <mainClass>com.gorkwobble.logmanager.LogManager</mainClass>
                </manifest>
              </archive>
            </configuration>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>single</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
              <source>1.6</source>
              <target>1.6</target>
            </configuration>
          </plugin>
    </plugins>
  </build>
  <dependencies>
    <!-- commons-lang -->
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.4</version>
    </dependency> 

    <!-- Quartz scheduler -->
    <dependency>
        <groupId>opensymphony</groupId>
        <artifactId>quartz</artifactId>
        <version>1.6.3</version>
    </dependency>
    <!-- Quartz 1.6.0 depends on commons collections -->
    <dependency>
      <groupId>commons-collections</groupId>
      <artifactId>commons-collections</artifactId>
      <version>3.1</version>
    </dependency>
    <!-- Quartz 1.6.0 depends on commons logging -->
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1</version>
    </dependency>
    <!-- Quartz 1.6.0 requires JTA in non J2EE environments -->
    <dependency>
      <groupId>javax.transaction</groupId>
      <artifactId>jta</artifactId>
      <version>1.1</version>
      <scope>runtime</scope>
    </dependency>

    <!-- junitx test assertions -->
    <dependency>
        <groupId>junit-addons</groupId>
        <artifactId>junit-addons</artifactId>
        <version>1.4</version>
        <scope>test</scope>
    </dependency>

    <!-- junit dependency; FIXME: make this a separate POM -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.1</version>
    </dependency>

  </dependencies>
  <dependencyManagement>
  </dependencyManagement>
</project>

Yanıtlar:


244

Aslında, bahsettiğiniz soruda verilen cevabın sadece yanlış olduğunu düşünüyorum ( GÜNCELLEME - 20101106: birisi onu düzeltti, bu cevap düzenlemeden önceki versiyona atıfta bulunuyor ) ve bu, en azından kısmen, neden sorun yaşadığınızı açıklıyor.


Logmanager / target'da iki jar dosyası oluşturur: logmanager-0.1.0.jar ve logmanager-0.1.0-jar-with-dependencies.jar.

İlki, packageaşama sırasında oluşturulan logmanager modülünün JAR'ıdır jar:jar(çünkü modülün bir paket tipi vardır jar). İkincisi, tarafından üretilen derlemedir assembly:assemblyve geçerli modüldeki sınıfları ve bağımlılıklarını içermelidir (tanımlayıcıyı kullandıysanız jar-with-dependencies).

İlk kavanozu çift tıkladığımda bir hata alıyorum:

Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit.

Referans olarak gönderilen bağlantının önerilen yapılandırmasını uyguladıysanız, jar eklentisini çalıştırılabilir bir yapı oluşturacak şekilde yapılandırdınız, buna benzer bir şey:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.gorkwobble.logmanager.LogManager</mainClass>
        </manifest>
      </archive>
    </configuration>
  </plugin>

Yani logmanager-0.1.0.jargerçekten çalıştırılabilir ama 1. İstediğiniz bu değil (çünkü tüm bağımlılıkları yok) ve 2. içermiyor com.gorkwobble.logmanager.LogManager(hatanın söylediği bu, kavanozun içeriğini kontrol edin).

Bağımlılıkları içeren jar dosyasını çift tıkladığımda biraz farklı bir hata:

Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar

Yine, derleme eklentisini önerildiği gibi yapılandırdıysanız, şuna benzer bir şeye sahipsiniz:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
  </plugin>

Bu ayar ile, logmanager-0.1.0-jar-with-dependencies.jarcari modülünden sınıflarını içerir ve bağımlılıklarından ama, hataya göre, onun META-INF/MANIFEST.MF değil bir içerirler Main-Class(logmanager-0.1.0.jar olduğu gibi onun olası değil aynı MANIFEST.MF) girişi. Kavanoz aslında çalıştırılabilir değil , ki bu da istediğiniz şey değil.


Bu yüzden benim önerim, configurationöğeyi maven-jar-eklentisinden kaldırmak ve maven-assembly-eklentisini şu şekilde yapılandırmak olacaktır:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.2</version>
    <!-- nothing here -->
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-4</version>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <archive>
        <manifest>
          <mainClass>org.sample.App</mainClass>
        </manifest>
      </archive>
    </configuration>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Elbette yürütmek org.sample.Appistediğiniz sınıfla değiştirin . Küçük bonus, artık koşmana gerek kalmaması assembly:singleiçin packageaşamaya assembly:assemblybağlıyım. Sadece çalıştırın mvn installve montaj standart yapım sırasında üretilecektir.

Bu nedenle, lütfen pom.xml dosyanızı yukarıda verilen yapılandırmayla güncelleyin ve çalıştırın mvn clean install. Ardından targetdizine cd yapın ve tekrar deneyin:

java -jar logmanager-0.1.0-jar-with-dependencies.jar

Bir hata alırsanız, lütfen sorunuzu onunla güncelleyin ve META-INF/MANIFEST.MFdosyanın içeriğini ve ilgili bölümü pom.xml(eklenti yapılandırma bölümleri) gönderin . Ayrıca lütfen sonucunu da gönderin:

java -cp logmanager-0.1.0-jar-with-dependencies.jar com.gorkwobble.logmanager.LogManager

komut satırında iyi çalıştığını göstermek için (tutulmanın ne dediğine bakılmaksızın).

DÜZENLEME: Java 6 için maven-compiler-eklentisini yapılandırmanız gerekir. Bunu pom.xml dosyanıza ekleyin:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>1.6</source>
      <target>1.6</target>
    </configuration>
  </plugin>

4
Yorumlarınız için teşekkürler! Pom.xml'mi belirttiğiniz gibi değiştirdim. Mvn temiz yüklemeyi çalıştırdığımda, kodumdan ek açıklamaların ve benzerlerinin kaynak 1.3'te desteklenmediğini söyleyen bir dizi derleme hatası alıyorum. Jdk1.6 kullanıyorum ve tutulmada derleniyor; 1.3'ün nasıl tanıtıldığından emin değilim. Belki pom pasajındaki kitaplık sürümlerinden biri daha eski bir sürüm olabilir?
RMorrisey

Teşekkürler! 1.3 sayısını geçtim. Ayrıca junit4 bağımlılığını da POM'uma eklemek zorunda kaldım. Diğer konularda sorun gidermeye çalışıyorum; Eğer takılırsam tekrar göndereceğim! Kavanozu çalıştırırsam, bunu cevap olarak işaretlerim. Mevcut POM'um yukarıdaki soruda güncellenmiştir.
RMorrisey

Kaynakları oluşturulan jar dosyasından hariç tutmanın bir yolu var mı?

2
Bir kavanozun "normal" bir isme sahip olması mümkün müdür?
Daniil Shevelev

1
Bu Sonatype blog gönderisini de yararlı buldum

15

Pascal Thivent'in cevabı da bana yardımcı oldu. Ancak eklentilerinizi <pluginManagement>öğe içinde yönetirseniz , montajı eklenti yönetiminin dışında yeniden tanımlamanız gerekir, aksi takdirde çalıştırırsanız bağımlılıklar kavanozda paketlenmez mvn install.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>


    <build>
        <pluginManagement>
            <plugins>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>1.6</source>
                        <target>1.6</target>
                    </configuration>
                </plugin>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>2.4</version>
                    <configuration>
                        <archive>
                            <manifest>
                                <mainClass>main.App</mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                    <executions>
                        <execution>
                            <id>make-assembly</id>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>

            </plugins>

        </pluginManagement>

        <plugins> <!-- did NOT work without this  -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
            </plugin>
        </plugins>

    </build>


    <dependencies>
       <!--  dependencies commented out to shorten example -->
    </dependencies>

</project>

1
Teşekkürler Mike, Bana yardımcı oldu. Başlangıçta paketim <pluginManagement> kullanılmadan oluşturuluyordu. Ancak Eclipse, pom.xml "maven - yaşam döngüsü kapsamına girmeyen eklenti çalıştırması" nda bazı hatalar veriyordu. Beni rahatsız eden. Bunu çözmek için <pluginManagement> 'ı ekledim, şimdi tutulma hatası gitti ancak paketimin oluşturulması durdu. Yukarıdaki pom parçanız benim için çalıştı. :)
shashaDenovo

2
Bu yararlıydı .. <pluginManagement> kullanılırken, en üstteki yanıt çalışmayacaktır.
ininprsr

5

Paket üzerinde montaj hedefini yürütmek istemiyorsanız, sonraki komutu kullanabilirsiniz:

mvn package assembly:single

İşte paket anahtar kelimedir.


-1

Projeye sağ tıklayın ve maven build, maven clean, maven create resource ve maven install. Jar dosyası otomatik olarak oluşturulur.

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.