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?
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?
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.
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);
}
};
}
}
Ich werde die Frage nicht direkt beantworten, da andere das bereits getan haben, aber ich frage mich wirklich, ob es eine gute Idee ist, alle Abhängigkeiten in das Projekt jar selbst einzubetten.
Ich verstehe den Punkt (einfache Bereitstellung/Nutzung), aber es hängt vom Anwendungsfall Ihres Projekts ab (und es gibt möglicherweise Alternativen (siehe unten)).
Wenn Sie es völlig eigenständig verwenden, warum nicht.
Aber wenn Sie Ihr Projekt in anderen Kontexten verwenden (z. B. in einer Webapp oder in einem Ordner, in dem sich andere Jars befinden), haben Sie möglicherweise Jar-Duplikate in Ihrem Klassenpfad (die im Ordner, die in den Jars). Vielleicht nicht ein Gebot Deal, aber ich in der Regel vermeiden dies.
Eine gute Alternative:
Auf diese Weise, mit letztlich nur einem Manifest und einem "speziellen dynamischen Classloader main", können Sie Ihr Projekt mit :
java -jar ProjectMainJar.jar com.stackoverflow.projectName.MainDynamicClassLoaderClass
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>
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 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.
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/
1 Stimmen
2 Beispiele: tugay.biz/2015/12/a-standalone-java-web-anwendung-mit.html tugay.biz/2016/11/wie-erstelle-ich-ein-ausführbares-jar-mit.html
2 Stimmen
Siehe stackoverflow.com/questions/35217128/
0 Stimmen
Für Gradle siehe den Stackoverflow-Beitrag: Fat/Uber JAR in Gradle erstellen .