wake-up-neo.com

Maven: Verpackungsabhängigkeiten neben Projekt-JAR?

Ich möchte, dass Maven ein Projekt zusammen mit seinen Laufzeitabhängigkeiten packt. Ich erwarte, dass es eine JAR-Datei mit dem folgenden Manifest erstellt:

.....
Main-Class : com.acme.MainClass
Class-Path : lib/dependency1.jar lib/dependency2.jar
.....

und erstellen Sie die folgende Verzeichnisstruktur:

target
|-- ....
|-- my-project.jar
|-- lib
    |-- dependency1.jar
    |-- dependency2.jar

Das heißt, ich möchte, dass die Haupt-JAR alle Abhängigkeiten ausschließt und dass alle transitiven Abhängigkeiten in ein "lib" -Unterverzeichnis kopiert werden. Irgendwelche Ideen?

45
Gili

Ich möchte, dass Maven ein Projekt mit Laufzeitabhängigkeiten packt.

Dieser Teil ist unklar (es ist nicht genau das, was Sie kurz danach beschreiben). Meine Antwort deckt das ab, was Sie beschrieben haben.

Ich erwarte, dass es eine JAR-Datei mit dem folgenden Manifest erstellt (...)

Konfigurieren Sie dazu das Maven Jar Plugin (genauer gesagt das Maven Archiver ):

<project>
  ...
  <build>
    <plugins>
      <plugin>
         <artifactId>maven-jar-plugin</artifactId>
         <configuration>
           <archive>
             <manifest>
               <addClasspath>true</addClasspath>
               <classpathPrefix>lib/</classpathPrefix>
               <mainClass>com.acme.MainClass</mainClass>
             </manifest>
           </archive>
         </configuration>
      </plugin>
    </plugins>
  </build>
  ...
  <dependencies>
    <dependency>
      <groupId>dependency1</groupId>
      <artifactId>dependency1</artifactId>
      <version>X.Y</version>
    </dependency>
    <dependency>
      <groupId>dependency2</groupId>
      <artifactId>dependency2</artifactId>
      <version>W.Z</version>
    </dependency>
  </dependencies>
  ...
</project>

Und das wird ein MANIFEST.MF mit den folgenden Einträgen erzeugen:

...
Main-Class: fully.qualified.MainClass
Class-Path: lib/dependency1-X.Y.jar lib/dependency2-W.Z.jar
...

und erstellen Sie die folgende Verzeichnisstruktur (...)

Dies ist mit dem Maven Dependency Plugin und dem dependency:copy-dependencies Ziel möglich. Aus der Dokumentation:

  • dependency:copy-dependencies nimmt die Liste der direkten Projektabhängigkeiten und optional der transitiven Abhängigkeiten und kopiert sie an einen angegebenen Speicherort, wobei die Version bei Bedarf entfernt wird. Dieses Ziel kann auch über die Befehlszeile ausgeführt werden.

Sie könnten es in der package Phase binden:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.1</version>
        <executions>
          <execution>
            <id>copy-dependencies</id>
            <phase>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>
    </plugins>
  </build>
  [...]
</project>
64
Pascal Thivent

Fügen Sie die folgenden Plugins in pom.xml hinzu. Überprüfen Sie den Wert in den Tags mainClass, classpathPrefix und addClasspath.

<plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.4</version>
        <configuration>
            <archive>
                <manifest>
                    <mainClass>org.Apache.camel.spring.Main</mainClass>
                    <classpathPrefix>lib/</classpathPrefix>
                    <addClasspath>true</addClasspath>
                </manifest>
            </archive>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-Assembly-plugin</artifactId>
        <version>2.4</version>
        <configuration>
            <descriptors>
                <descriptor>src/Assembly/some-Assembly.xml</descriptor>
            </descriptors>
        </configuration>
        <executions>
            <execution>
                <id>make-Assembly</id>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

Erstellen Sie die Datei some-Assembly.xml unter src/Assembly wie folgt.

<Assembly
xmlns="http://maven.Apache.org/plugins/maven-Assembly-plugin/Assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.Apache.org/plugins/maven-Assembly-plugin/Assembly/1.1.0 http://maven.Apache.org/xsd/Assembly-1.1.0.xsd">
<id>distribution</id>
<formats>
    <format>Zip</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
    <fileSet>
        <directory>${project.build.directory}</directory>
        <outputDirectory>/</outputDirectory>
        <includes>
            <include>*.jar</include>
        </includes>
    </fileSet>
</fileSets>
<dependencySets>
    <dependencySet>
        <scope>runtime</scope>
        <outputDirectory>/lib</outputDirectory>
        <useProjectArtifact>false</useProjectArtifact>
        <unpack>false</unpack>
    </dependencySet>
</dependencySets>

Beachten Sie, dass useProjectArtifact flag auf false gesetzt ist, und entpacken Sie flag auf false. Wenn der Stammordner in der Zip-Datei nicht erforderlich ist, kann includeBaseDirectory auf false gesetzt werden.

Dadurch wird die Datei name-version-distribution.Zip erstellt. In der Zip-Datei befindet sich die Ordnernamen-Version. In diesem Ordner befinden sich Ihre ausführbare JAR- und LIB-Datei, die alle abhängigen JAR-Dateien enthalten. Überprüfen Sie die manifest.MF-Datei der ausführbaren JAR-Datei. Es enthält sowohl Hauptklassen- als auch Klassenpfadinformationen.

4
PShetty

Sie können das maven jar-Plugin verwenden. Schauen Sie sich diese Seite an: http://maven.Apache.org/plugins/maven-jar-plugin/examples/manifest-customization.html

0
Skarab