Budowanie pliku wykonywalnego jar z maven?

Próbuję wygenerować wykonywalny jar dla małego projektu domowego o nazwie "logmanager" używając Mavena, tak jak to:

Jak mogę utworzyć plik wykonywalny jar z zależnościami przy użyciu Maven?

Dodałem pokazany tam fragment do pom.xml i uruchomił mvn assembly: assembly. Generuje dwa pliki jar w logmanager/target: logmanager-0.1.0.jar, oraz logmanager-0.1.0-jar-with-dependencies.słoik. Pojawia się błąd po dwukrotnym kliknięciu pierwszego jar:

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

Nieco inny błąd po dwukrotnym kliknięciu jar-with-dependencies.jar:

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

Skopiowałem i wkleiłem ścieżkę i nazwę klasy i sprawdziłem pisownię w POM. Moja główna klasa startuje dobrze z konfiguracji startowej eclipse. Czy ktoś może mi pomóc dowiedzieć się, dlaczego mój plik jar nie działa? Poza tym, dlaczego są dwa słoiki na początek? Daj znać, jeśli potrzebujesz więcej informacji.

Oto pełna pom.xml, dla odniesienia:

<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>
Author: Joshua Taylor, 2009-11-29

4 answers

Właściwie, myślę, że Odpowiedź udzielona w pytaniu , o którym wspomniałeś, jest po prostu błędna (UPDATE-20101106: ktoś to naprawił, ta odpowiedź odnosi się do wersji poprzedzającej edycję) i to wyjaśnia, przynajmniej częściowo, dlaczego wpadasz w kłopoty.


Generuje dwa pliki jar w logmanager/target: logmanager-0.1.0.jar, oraz logmanager-0.1.0-jar-with-dependencies.słoik.

Pierwszy to słoik modułu logmanager wygenerowanego w fazie package przez jar:jar (ponieważ moduł posiada opakowanie typu jar). Drugi to zgromadzenie generowane przez assembly:assembly i powinno zawierać klasy z bieżącego modułu oraz jego zależności (jeśli użyłeś deskryptora jar-with-dependencies).

Pojawia się błąd po dwukrotnym kliknięciu pierwszego słoika:

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

Jeśli zastosowałeś sugerowaną konfigurację linku zamieszczonego jako odniesienie, skonfigurowałeś wtyczkę jar tak, aby produkowała jest to jeden z najbardziej rozpoznawalnych artefaktów na świecie.]}

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

Więc logmanager-0.1.0.jar jest rzeczywiście wykonywalny, ale 1. to nie jest to ,czego chcesz (bo nie ma WSZYSTKICH zależności) i 2. nie zawiera com.gorkwobble.logmanager.LogManager (tak mówi błąd, sprawdź zawartość jar).

Nieco inny błąd, gdy dwukrotnie klikam jar-with-dependencies.jar:

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

Ponownie, jeśli skonfigurowałeś wtyczkę assembly zgodnie z sugestią, masz coś w rodzaju to:

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

Z tą konfiguracją, logmanager-0.1.0-jar-with-dependencies.jar zawiera klasy z bieżącego modułu i jego zależności, ale zgodnie z błędem, jego META-INF/MANIFEST.MF nie zawiera wpisu Main-Class (prawdopodobnie nie jest to ten sam MANIFEST.MF jak w logmanager-0.1.0.jar). Jar jest w rzeczywistości nie wykonywalny, co znowu nie jest tym, czego chcesz.


Więc moja propozycja to usunięcie elementu configuration z maven-jar-plugin i skonfigurowanie maven-assembly-plugin jak ten:

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

Oczywiście zastąp org.sample.App klasą, którą chcesz wykonać. Mały bonus, przywiązałem assembly:single do fazy package, więc nie musisz już biegać assembly:assembly. Po prostu uruchom mvn install, A montaż zostanie wyprodukowany podczas standardowej kompilacji.

Więc, proszę zaktualizować pom.xml z konfiguracją podaną powyżej i uruchom mvn clean install. Następnie przejdź do katalogu target i spróbuj ponownie:

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

Jeśli pojawi się błąd, zaktualizuj swoje pytanie z nim i opublikować zawartość pliku META-INF/MANIFEST.MF i odpowiedniej części pom.xml (części konfiguracji wtyczek). Prosimy również o zamieszczenie wyniku:

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

Aby zademonstrować, że działa poprawnie w wierszu poleceń (niezależnie od tego, co mówi eclipse).

EDIT: w Javie 6 musisz skonfigurować wtyczkę Maven-compiler. Dodaj to do swojego pom.xml:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>1.6</source>
      <target>1.6</target>
    </configuration>
  </plugin>
 246
Author: Pascal Thivent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Mi też pomogła odpowiedź Pascala Thiventa. Ale jeśli zarządzasz wtyczkami w elemencie <pluginManagement>, musisz ponownie zdefiniować zespół poza zarządzaniem wtyczkami, w przeciwnym razie zależności nie zostaną spakowane w jar, jeśli uruchomisz 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>
 16
Author: mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-01 11:08:49

Jeśli nie chcesz wykonać celu assembly na pakiecie, możesz użyć następnego polecenia:

mvn package assembly:single

TUTAJ pakiet jest słowem kluczowym.

 5
Author: leonidv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-05 07:43:28

Kliknij prawym przyciskiem myszy projekt i daj Maven build, Maven clean,Maven generate resource i Maven install.Plik jar zostanie wygenerowany automatycznie.

 -1
Author: dolly doll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-22 11:16:12