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/

17voto

Matthew McCullough Punkte 16494

Eine weitere Option, wenn Sie wirklich die Inhalte der anderen JARs in Ihr einzelnes resultierendes JAR umpacken wollen, ist das Maven Assembly-Plugin . Es entpackt und packt dann alles wieder in ein Verzeichnis über <unpack>true</unpack> . Dann gibt es einen zweiten Durchgang, bei dem das Ganze zu einem großen JAR zusammengefügt wird.

Eine weitere Option ist das OneJar-Plugin . Damit werden die oben genannten Umpackvorgänge in einem Schritt durchgeführt.

16voto

Oliver Punkte 490

Sie könnten die maven-shade-plugin y maven-jar-plugin .

  • El maven-shade-plugin packt Ihre Klassen und alle Abhängigkeiten in eine einzige Jar-Datei.
  • Konfigurieren Sie die maven-jar-plugin um die Hauptklasse Ihres ausführbaren jar anzugeben (siehe Den Klassenpfad einrichten , Kapitel "Das Jar ausführbar machen").

Beispiel einer POM-Konfiguration für maven-jar-plugin :

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>com.example.MyMainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

Erstellen Sie schließlich das ausführbare jar durch Aufrufen:

mvn clean package shade:shade

4 Stimmen

Das Shade-Plugin hat nun die Möglichkeit, den Main-Class-Eintrag im Manifest zu spezifizieren: maven.apache.org/plugins/maven-shade-plugin/examples/

13voto

kac-ani Punkte 121

Das funktioniert so:

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>unpack-dependencies</id>
            <phase>generate-resources</phase>
            <goals>
                <goal>unpack-dependencies</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Das Auspacken muss in der Phase "generate-resources" erfolgen, sonst wird es nicht als Ressource berücksichtigt.

0 Stimmen

Dieses Problem tritt auf: org.apache.maven.lifecycle.LifecycleExecutionException: Das Ziel org.apache.maven.plugins:maven-dependency-plugin:3.1.2:unpack-dependencies (unpack-dependencies) für Projektdienste konnte nicht ausgeführt werden: Unbekannter Archivierungstyp

0 Stimmen

Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-dependency-plugin:2.8:unpack-‌​dependencies (execution: unpack-dependencies, phase: generate-resources)

11voto

Matthew Franglen Punkte 4303

Ken Liu hat meiner Meinung nach Recht. Das Maven Dependency Plugin erlaubt es Ihnen, alle Abhängigkeiten zu erweitern, die Sie dann als Ressourcen behandeln können. Dies erlaubt es Ihnen, sie in die Haupt Artefakt. Die Verwendung des Assembly-Plugins erzeugt ein sekundäres Artefakt, das schwer zu ändern sein kann - in meinem Fall wollte ich benutzerdefinierte Manifest-Einträge hinzufügen. Mein pom endete als:

<project>
 ...
 <build>
  <plugins>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
     <execution>
      <id>unpack-dependencies</id>
      <phase>package</phase>
      <goals>
       <goal>unpack-dependencies</goal>
      </goals>
     </execution>
    </executions>
   </plugin>
  </plugins>
  ...
  <resources>
   <resource>
    <directory>${basedir}/target/dependency</directory>
    <targetPath>/</targetPath>
   </resource>
  </resources>
 </build>
 ...
</project>

1 Stimmen

Wer ist Ken Liu? Auf welchen Kommentar oder welche Antwort bezieht er sich?

10voto

Anoop Rai Punkte 389

Um dieses Problem zu lösen, werden wir das Maven Assembly Plugin verwenden, das die JAR-Datei zusammen mit den JAR-Dateien der Abhängigkeiten in eine einzige ausführbare JAR-Datei verwandelt. Fügen Sie einfach die folgende Plugin-Konfiguration in Ihre pom.xml-Datei ein.

<build>
   <pluginManagement>
      <plugins>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
               <archive>
                  <manifest>
                     <addClasspath>true</addClasspath>
                     <mainClass>com.your.package.MainClass</mainClass>
                  </manifest>
               </archive>
               <descriptorRefs>
                  <descriptorRef>jar-with-dependencies</descriptorRef>
               </descriptorRefs>
            </configuration>
            <executions>
               <execution>
                  <id>make-my-jar-with-dependencies</id>
                  <phase>package</phase>
                  <goals>
                     <goal>single</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>
      </plugins>
   </pluginManagement>
</build>

Vergessen Sie danach nicht, das MAVEN-Tool mit folgendem Befehl zu starten mvn clean compile assembly:single

http://jkoder.com/maven-creating-a-jar-together-with-its-dependency-jars-into-a-single-executable-jar-file/

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