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.

582voto

John Stauffer Punkte 15508

Sie können dies mit dem maven-assembly-Plugin mit dem Deskriptor "jar-with-dependencies" tun. Hier ist der relevante Abschnitt aus einer unserer pom.xml's, die dies tut:

  <build>
    <plugins>
      <!-- any other plugins -->
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
    </plugins>
  </build>

178voto

Pascal Thivent Punkte 548176

Mit Maven 2 ist der richtige Weg, dies zu tun, die Verwendung der Maven2 Assembly Plugin die eine vordefinierte Deskriptor-Datei für diesen Zweck und die Sie einfach in der Befehlszeile verwenden können:

mvn assembly:assembly -DdescriptorId=jar-with-dependencies

Wenn Sie diese Jar-Datei ausführbar machen wollen, fügen Sie einfach die auszuführende Hauptklasse zur Plugin-Konfiguration hinzu:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <configuration>
    <archive>
      <manifest>
        <mainClass>my.package.to.my.MainClass</mainClass>
      </manifest>
    </archive>
  </configuration>
</plugin>

Wenn Sie diese Baugruppe als Teil des normalen Build-Prozesses erstellen möchten, sollten Sie die einzeln o verzeichnis-einzel Ziel (die assembly Ziel sollte NUR von der Kommandozeile aus ausgeführt werden) zu einer Lebenszyklusphase ( package Sinn macht), etwa so:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <executions>
    <execution>
      <id>create-my-bundle</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        ...
      </configuration>
    </execution>
  </executions>
</plugin>

Anpassen der configuration Element an Ihre Bedürfnisse anpassen (z. B. mit dem Manifest wie gesprochen).

57voto

abdiel Punkte 1963

Wenn Sie eine ausführbare Jar-Datei erstellen möchten, müssen Sie auch die Hauptklasse festlegen. Die vollständige Konfiguration sollte also sein.

    <plugins>
            <plugin>
                 <artifactId>maven-assembly-plugin</artifactId>
                 <executions>
                     <execution>
                          <phase>package</phase>
                          <goals>
                              <goal>single</goal>
                          </goals>
                      </execution>
                  </executions>
                  <configuration>
                       <!-- ... -->
                       <archive>
                           <manifest>
                                 <mainClass>fully.qualified.MainClass</mainClass>
                           </manifest>
                       </archive>
                       <descriptorRefs>
                           <descriptorRef>jar-with-dependencies</descriptorRef>
                      </descriptorRefs>
                 </configuration>
         </plugin>
   </plugins>

24voto

Leslie Li Punkte 171
        <!-- Method 1 -->
        <!-- Copy dependency libraries jar files to a separated LIB folder -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                <excludeTransitive>false</excludeTransitive> 
                <stripVersion>false</stripVersion>
            </configuration>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <!-- Add LIB folder to classPath -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

        <!-- Method 2 -->
        <!-- Package all libraries classes into one runnable jar -->
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>single</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
              </descriptorRefs>
            </configuration>
        </plugin>

21voto

Thomas Jung Punkte 31524

Da ist die Schatten-Maven-Plugin . Es kann verwendet werden, um Paket und benennen Sie es um in Abhängigkeiten (um Probleme mit Abhängigkeiten auf dem Klassenpfad zu vermeiden).

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