445 Stimmen

Einbindung von Abhängigkeiten in ein jar mit Maven

Gibt es eine Möglichkeit, Maven (2.0.9) dazu zu zwingen, alle Abhängigkeiten in eine einzige Jar-Datei aufzunehmen?

Ich habe ein Projekt, das in einer einzigen Jar-Datei erstellt wird. Ich möchte, dass die Klassen aus Abhängigkeiten auch in die Jar-Datei kopiert werden.

Aktualisierung: Ich weiß, dass ich nicht einfach eine jar-Datei in eine jar-Datei einfügen kann. Ich bin auf der Suche nach einer Möglichkeit, die Jar-Dateien, die als Abhängigkeiten angegeben sind, zu entpacken und die Klassendateien in meine Jar-Datei zu packen.

1voto

jwpol Punkte 921

Ich habe versucht, etwas Ähnliches zu machen, aber ich wollte nicht, dass alle Gläser einbezogen werden. Ich wollte einige bestimmte Verzeichnisse aus der gegebenen Abhängigkeit einschließen. Außerdem war der Klassifizierer-Tag bereits belegt, so dass ich nicht tun konnte:

<dependencies>
    <dependency>
        <groupId>your.group.id</groupId>
        <artifactId>your.artifact.id</artifactId>
        <version>1.0</version>
        <type>jar</type>
        <classifier>jar-with-dependencies</classifier>
    </dependency>
</dependencies>
  1. Ich habe maven-dependency-plugin und unpack goal verwendet
  2. Und packte aus, was ich wollte, um die ${project.build.directory}/classes , andernfalls wird sie weggelassen
  3. Da es sich im Verzeichnis classes befand, hat Maven es schließlich in das jar

    <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>unpack</id> <phase>prepare-package</phase> <goals> <goal>unpack</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>my.group</groupId> <artifactId>my.artifact</artifactId> <classifier>occupied</classifier> <version>1.0</version> <type>jar</type> </artifactItem> </artifactItems> <outputDirectory>${project.build.directory}/classes</outputDirectory> <includes>aaa/, bbb/, ccc/**</includes> </configuration> </execution> </executions> </plugin>

0voto

Francois Gergaud Punkte 376

Dieser Beitrag ist vielleicht schon etwas älter, aber ich hatte vor kurzem das gleiche Problem. Die erste Lösung von John Stauffer vorgeschlagen ist eine gute, aber ich hatte einige Probleme, wie ich dieses Frühjahr arbeiten. Die spring's dependency-jars, die ich verwende, haben einige Property-Dateien und xml-schemas Deklaration, die die gleichen Pfade und Namen teilen. Obwohl diese Jars aus denselben Versionen stammen, ist die jar-with-dependencies maven-goal hat diese Datei mit der zuletzt gefundenen Datei überschrieben.

Am Ende konnte die Anwendung nicht gestartet werden, da die Spring Jars die richtigen Properties-Dateien nicht finden konnten. In diesem Fall hat die von Rop vorgeschlagene Lösung mein Problem gelöst.

Seitdem gibt es auch das spring-boot Projekt. Es hat einen sehr coolen Weg, dieses Problem zu lösen, indem es ein Maven-Ziel bereitstellt, das das Paket-Ziel überlädt und einen eigenen Klassenlader bereitstellt. Siehe spring-boots Referenzhandbuch

0voto

millebi Punkte 131

Sehen Sie sich diese Antwort an:

Ich erstelle ein Installationsprogramm, das als Java JAR-Datei ausgeführt wird und WAR- und JAR-Dateien an die entsprechenden Stellen im Installationsverzeichnis entpacken muss. Das Abhängigkeits-Plugin kann in der Paketierungsphase mit dem Kopierziel verwendet werden und lädt jede Datei im Maven-Repository (einschließlich WAR-Dateien) herunter und schreibt sie dorthin, wo man sie braucht. Ich habe das Ausgabeverzeichnis in ${project.build.directory}/classes geändert und das Endergebnis ist, dass die normale JAR-Aufgabe meine Dateien problemlos enthält. Ich kann sie dann extrahieren und in das Installationsverzeichnis schreiben.

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
    <execution>
        <id>getWar</id>
        <phase>package</phase>
        <goals>
            <goal>copy</goal>
        </goals>
        <configuration>
            <artifactItems>
                <artifactItem>
                    <groupId>the.group.I.use</groupId>
                    <artifactId>MyServerServer</artifactId>
                    <version>${env.JAVA_SERVER_REL_VER}</version>
                    <type>war</type>
                    <destFileName>myWar.war</destFileName>
                </artifactItem>
            </artifactItems>
            <outputDirectory>${project.build.directory}/classes</outputDirectory>
        </configuration>
    </execution>
</executions>

0voto

Rajeev Rathor Punkte 1572

Danke Ich habe unten Schnipsel in POM.xml-Datei und Mp Problem behoben und hinzugefügt erstellen Fett jar-Datei, die alle abhängigen jars enthalten.

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <descriptorRefs>
                <descriptorRef>dependencies</descriptorRef>
            </descriptorRefs>
        </configuration>
    </plugin>
</plugins>

-2voto

NIrav Modi Punkte 4626

Um es einfacher zu machen, können Sie das folgende Plugin verwenden.

             <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <classifier>spring-boot</classifier>
                            <mainClass>
                                com.nirav.certificate.CertificateUtility
                            </mainClass>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

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