2891 Stimmen

Wie kann ich mit Maven ein ausführbares JAR mit Abhängigkeiten erstellen?

Ich möchte mein Projekt in ein einziges ausführbares JAR-Paket verpacken, um es zu verteilen.

Wie kann ich ein Maven-Projekt dazu bringen, alle abhängigen JARs in mein Ausgabe-JAR zu packen?

15 Stimmen

Bitte erklären Sie, auf welches Ziel des Abhängigkeits-Plugins Sie sich beziehen. Ich kenne kein Ziel, das das tut, was die ursprüngliche Frage verlangt: alle Abhängigkeiten entweder A) in das Autoren-Jar durch Umpacken zu packen, oder B) ein ausführbares Jar zu erstellen, das die anderen in einem Klassenpfad von MANIFEST.MF hat

2 Stimmen

Dies könnte für Sie nützlich sein rationaljava.com/2015/02/

6voto

EliuX Punkte 9135

Dies ist der beste Weg, den ich gefunden habe:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
      <archive>
        <manifest>
        <addClasspath>true</addClasspath>
        <mainClass>com.myDomain.etc.MainClassName</mainClass>
        <classpathPrefix>dependency-jars/</classpathPrefix>
        </manifest>
      </archive>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.5.1</version>
    <executions>
      <execution>
        <id>copy-dependencies</id>
        <phase>package</phase>
        <goals>
            <goal>copy-dependencies</goal>
        </goals>
        <configuration>
            <outputDirectory>
               ${project.build.directory}/dependency-jars/
            </outputDirectory>
        </configuration>
      </execution>
    </executions>
  </plugin>

Mit dieser Konfiguration befinden sich alle Abhängigkeiten in /dependency-jars . Meine Bewerbung hat keine Main Klasse, sondern nur Kontextklassen, aber eine meiner Abhängigkeiten hat eine Main Klasse ( com.myDomain.etc.MainClassName ), der den JMX-Server startet, und erhält eine start oder eine stop Parameter. Damit konnte ich also meine Anwendung wie folgt starten:

java -jar ./lib/TestApp-1.0-SNAPSHOT.jar start

Ich hoffe, es ist für Sie alle nützlich.

6voto

uwevil Punkte 548

Ich hoffe, meine Erfahrung kann jemandem helfen. Ich wollte meine App Spring (mit CAS-Client) auf Spring Boot 1.5 migrieren. Ich lief in viele Probleme, wie:

kein Hauptmanifest-Attribut, in target/cas-client-web.jar

Ich habe versucht, eine einzige Jar-Datei mit allen Abhängigkeiten zu erstellen. Nach der Suche im Internet, konnte ich es mit diesen Zeilen zu tun:

         <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>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>${start-class}</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </plugin>

Startklasse ist meine Hauptklasse:

<properties>
    <java.version>1.8</java.version>
    <start-class>com.test.Application</start-class>
</properties>

Und mein Anmeldung ist:

package com.test;

import java.util.Arrays;

import com.test.TestProperties;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
@EnableAutoConfiguration
@EnableConfigurationProperties({TestProperties.class})
public class Application {

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}

@Bean
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
    return args -> {

        System.out.println("Let's inspect the beans provided by Spring Boot:");

        String[] beanNames = ctx.getBeanDefinitionNames();
        Arrays.sort(beanNames);
        for (String beanName : beanNames) {
            System.out.println(beanName);
        }

    };
}

}

0 Stimmen

0 Stimmen

0 Stimmen

6voto

fascynacja Punkte 1287

Etwas, das für mich funktioniert hat, war:

  <plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
      <execution>
        <id>unpack-dependencies</id>
        <phase>prepare-package</phase>
        <goals>
          <goal>unpack-dependencies</goal>
        </goals>
        <configuration>
          <outputDirectory>${project.build.directory}/classes</outputDirectory>
        </configuration>
      </execution>

    </executions>
  </plugin>

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <executions>
      <execution>
        <id>unpack-dependencies</id>
        <phase>package</phase>
      </execution>
    </executions>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <classpathPrefix>lib/</classpathPrefix>
          <mainClass>SimpleKeyLogger</mainClass>
        </manifest>
      </archive>
    </configuration>
  </plugin>

Ich hatte einen außergewöhnlichen Fall, weil meine Abhängigkeit vom System eins war:

<dependency>
  ..
  <scope>system</scope>
  <systemPath>${project.basedir}/lib/myjar.jar</systemPath>
</dependency>

Ich habe den von @user189057 bereitgestellten Code mit Änderungen versehen: 1) maven-dependency-plugin wird in der "prepare-package" Phase ausgeführt 2) Ich extrahiere die entpackten Klassen direkt in "target/classes".

5voto

salmanbw Punkte 1251

Dies könnte auch eine Option sein, Sie werden Ihre jar-Datei erstellen können

<build>
    <plugins>
        <plugin>
            <!-- Build an executable JAR -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>WordListDriver</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

5voto

Rocky Inde Punkte 1451

Ich habe es mit der am meisten geteilten Antwort hier versucht und konnte das Jar zum Laufen bringen. Aber das Programm wurde nicht korrekt ausgeführt. Ich weiß nicht, was der Grund dafür war. Wenn ich versuche, das Programm von Eclipse Ich erhalte ein anderes Ergebnis, aber wenn ich das Jar über die Befehlszeile ausführe, erhalte ich ein anderes Ergebnis (es stürzt mit einem programmspezifischen Laufzeitfehler ab).

Ich hatte eine ähnliche Anforderung wie der OP, nur dass ich zu viele (Maven-)Abhängigkeiten für mein Projekt hatte. Glücklicherweise war die einzige Lösung, die für mich funktionierte, die Verwendung von Eclipse . Sehr einfach und sehr unkompliziert. Dies ist keine Lösung für den OP, sondern eine Lösung für jemanden, der eine ähnliche Anforderung hat, aber mit vielen Maven-Abhängigkeiten,

1) Klicken Sie einfach mit der rechten Maustaste auf Ihren Projektordner (in Eclipse) und wählen Sie Export

2) Wählen Sie dann Java -> Runnable Jar

3) Sie werden aufgefordert, den Speicherort der jar-Datei zu wählen

4) Wählen Sie schließlich die Klasse mit der Main-Methode, die Sie ausführen möchten, und wählen Sie Package dependencies with the Jar file und klicken Sie Finish

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X