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

Lesezeit: 6 Minuten

Benutzeravatar von soemirno
soemirno

Ich möchte mein Projekt zur Verteilung in ein einziges ausführbares JAR packen.

Wie kann ich ein Maven-Projekt dazu bringen, alle Abhängigkeits-JARs in meine Ausgabe-JAR zu packen?

  • Bitte erläutern 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) durch Umpacken in das Autoren-Jar zu legen oder B) ein ausführbares JAR zu erstellen, das die anderen in einem Klassenpfad von MANIFEST.MF enthält

    – Matthew McCullough

    11. März 2009 um 15:11 Uhr

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

    – Dan

    2. Februar 2015 um 19:01 Uhr

  • Siehe stackoverflow.com/questions/35217128/…

    – Thanga

    11. September 2017 um 8:18 Uhr

Benutzeravatar von André Aronsen
Andre Aronsen

Sie können das Abhängigkeits-Plugin verwenden, um alle Abhängigkeiten vor der Paketphase in einem separaten Verzeichnis zu generieren und diese dann in den Klassenpfad des Manifests aufzunehmen:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                <overWriteReleases>false</overWriteReleases>
                <overWriteSnapshots>false</overWriteSnapshots>
                <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>theMainClass</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

Alternativ verwenden ${project.build.directory}/classes/lib als OutputDirectory verwenden, um alle JAR-Dateien in die Haupt-JAR-Datei zu integrieren, aber dann müssen Sie benutzerdefinierten Classloading-Code hinzufügen, um die JAR-Dateien zu laden.

  • Gibt es eine Möglichkeit, diese Methode zu verwenden, ohne benutzerdefinierte Klassenlader zu schreiben? Ich erhalte “ClassNotFoundException”. Als ich das Assembly-Plugin verglichen habe, dachte ich, dass ich die Abhängigkeiten mit maven-dependency-plugin entpacken könnte. Irgendwelche Empfehlungen?

    – gbaum

    13. Dezember 2021 um 14:53 Uhr

  • Dies ist immer noch äußerst hilfreich

    – Benutzer1238097

    24. August um 0:09 Uhr

  • Gibt es eine Möglichkeit, in der Paketphase Batch- und Bash-Skript zum endgültigen Zip hinzuzufügen, damit das Skript java -jar aufrufen kann und ich mich nur auf das Skript beziehe?

    – SinaMobasheri

    6. September um 21:35 Uhr

Benutzeravatar von Matthew McCullough
Matthew McCullough

Wenn wir die Antwort von IAdapter nehmen und neu formatieren, haben wir:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>fully.qualified.MainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </plugin>
    </plugins>
</build>

Als nächstes würde ich empfehlen, dies zu einem natürlichen Teil Ihres Builds zu machen, anstatt etwas explizit aufzurufen. Um dies zu einem integralen Bestandteil Ihres Builds zu machen, fügen Sie dieses Plugin zu Ihrer hinzu pom.xml und binde es an die package Lebenszyklus-Ereignis. Ein Problem ist jedoch, dass Sie anrufen müssen assembly:single Ziel, wenn Sie dies in Ihre pom.xml einfügen, während Sie “assembly:assembly” aufrufen würden, wenn Sie es manuell von der Befehlszeile aus ausführen würden.

<project>
  [...]
  <build>
      <plugins>
          <plugin>
              <artifactId>maven-assembly-plugin</artifactId>
              <configuration>
                  <archive>
                      <manifest>
                          <addClasspath>true</addClasspath>
                          <mainClass>fully.qualified.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>
    [...]
  </build>
</project>

  • In meinem Fall war maven-assembly-plugin ausreichend. Danke

    – Kampaii

    8. September um 6:31

Benutzeravatar von Peter Mortensen
Peter Mortensen

Verwenden Sie die maven-shade-plugin um alle Abhängigkeiten in eine Über-JAR-Datei zu packen. Es kann auch verwendet werden, um eine ausführbare JAR-Datei zu erstellen, indem die Hauptklasse angegeben wird. Nachdem ich versucht hatte, maven-assembly und maven-jar zu verwenden, stellte ich fest, dass dieses Plugin meinen Anforderungen am besten entsprach.

Ich fand dieses Plugin besonders nützlich, da es den Inhalt bestimmter Dateien zusammenführt, anstatt sie zu überschreiben. Dies ist erforderlich, wenn es Ressourcendateien gibt, die in allen JAR-Dateien denselben Namen haben, und das Plug-in versucht, alle Ressourcendateien zu packen.

Siehe das Beispiel unten:

<plugins>
    <!-- This plugin provides the capability to package
         the artifact in an über-JAR file, including
         its dependencies and to shade - i.e. rename -
         the packages of some of the dependencies. -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>1.4</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
                <configuration>
                    <artifactSet>
                        <!-- Signed JAR files-->
                        <excludes>
                            <exclude>bouncycastle:bcprov-jdk15</exclude>
                        </excludes>
                    </artifactSet>

                    <transformers>
                        <transformer
                            implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <!-- Main class -->
                            <mainClass>com.main.MyMainClass</mainClass>
                        </transformer>

                        <!-- Use resource transformers to prevent file overwrites -->
                        <transformer
                            implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                            <resource>properties.properties</resource>
                        </transformer>
                        <transformer
                            implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
                            <resource>applicationContext.xml</resource>
                        </transformer>
                        <transformer
                            implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                            <resource>META-INF/cxf/cxf.extension</resource>
                        </transformer>
                        <transformer
                            implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
                            <resource>META-INF/cxf/bus-extensions.xml</resource>
                        </transformer>
                    </transformers>
                </configuration>
            </execution>
        </executions>
    </plugin>
</plugins>

  • In meinem Fall war maven-assembly-plugin ausreichend. Danke

    – Kampaii

    8. September um 6:31

Benutzeravatar von Peter Mortensen
Peter Mortensen

Sie können das Maven-Shade-Plugin verwenden, um eine Über-JAR-Datei wie unten zu erstellen:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
        </execution>
    </executions>
</plugin>

1429900cookie-checkWie kann ich mit Maven ein ausführbares/ausführbares JAR mit Abhängigkeiten erstellen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy