webentwicklung-frage-antwort-db.com.de

Maven - Wie kann ich einem Jar einen beliebigen Klassenpfadeintrag hinzufügen?

Ich habe eine ungewöhnliche Situation, in der ich einen beliebigen Klassenpfadeintrag (der auf eine JAR-Datei verweist) in das Manifest einer ausführbaren JAR-Datei einfügen muss. (Dies ist für eine Swing-Desktop-Anwendung.)

Das Maven-Jar-Plugin generiert den "Klassenpfad" -Eintrag für das JAR-Manifest unter Verwendung der Maven-Abhängigkeiten, und es scheint keine Möglichkeit zu geben, beliebige Einträge hinzuzufügen.

Ich habe auch versucht, den willkürlichen Klassenpfadeintrag mit dem Parameter "-classpath" fest in die Batchdatei zu codieren, die die Anwendung startet, aber ich kann nicht herausfinden, wie Maven dazu gebracht wird, den Klassenpfad in eine Batchdatei zu filtern.

62
Ken Liu

Ich fand, dass es eine einfache Lösung für dieses Problem gibt. Sie können dem Element <Class-Path> Ein Element <manifestEntries> Hinzufügen und <addClassPath>true</addClassPath> Auf das Element <manifest> Setzen. Der Wert des Elements <Class-Path> Wird also automatisch zum Klassenpfad hinzugefügt. Beispiel:

<plugin>
  <groupId>org.Apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <configuration>
    <archive>
      <manifest>
        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
        <addClasspath>true</addClasspath>
        <mainClass>your.main.Class</mainClass>
      </manifest>
      <manifestEntries>
        <Class-Path>../conf/</Class-Path>
      </manifestEntries>
    </archive>
  </configuration>
</plugin>
72
Ali Reza

Update: So filtern Sie einen Klassenpfad in ein benutzerdefiniertes Manifest.

Das Maven-Dependency-Plugin build-classpath goal kann so konfiguriert werden, dass der Klassenpfad in eine Datei im Eigenschaftenformat (d. h. Klassenpfad = [Klassenpfad]) ausgegeben wird. Anschließend konfigurieren Sie das filter-Element so, dass es die generierte Klassenpfaddatei verwendet, und konfigurieren das zu filternde Ressourcenverzeichnis.

Beispielsweise:

<build>
  <plugins>
    <plugin>
      <artifactId>maven-dependency-plugin</artifactId>
      <version>2.1</version>
      <executions>
        <execution>
          <phase>generate-resources</phase>
          <goals>
            <goal>build-classpath</goal>
          </goals>
        </execution>
      </executions>
      <configuration>
        <outputFilterFile>true</outputFilterFile>
        <outputFile>${project.build.directory}/classpath.properties</outputFile>
      </configuration>
    </plugin>
    <plugin>
      <artifactId>maven-jar-plugin</artifactId>
      <configuration>
        <archive>
          <manifestFile>
            ${project.build.outputDirectory}/META-INF/MANIFEST.MF
          </manifestFile>
        </archive>
      </configuration>
    </plugin>
  </plugins>
  <filters>
    <filter>${project.build.directory}/classpath.properties</filter>
  </filters>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering>
    </resource>
  </resources>
</build>

Geben Sie dann Folgendes in src/main/resources/META-INF/Manifest.MF an:

Bundle-Version: 4.0.0
...
Classpath: ${classpath};[specify additional entries here]

Hinweis: Es gibt einen Fehler bei dieser Verarbeitung mit dem standardmäßigen Fensterpfadtrennzeichen (\), der Erstellungspfad wird von Trennzeichen befreit (beachten Sie, dass dies unter Linux gut funktioniert). Sie können den Klassenpfad für Windows korrekt generieren lassen, indem Sie <fileSeparator>\\\\</fileSeparator> in dem build-classpath Zielkonfiguration.


Sie können das Manifest in der Konfiguration von jar-plugin anpassen. Dazu würden Sie Ihrem Pom etwas Ähnliches hinzufügen.

<plugin>
  <groupId>org.Apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  ...
  <configuration>
    <archive>
      <index>true</index>
      <manifest>
        <addClasspath>true</addClasspath>
      </manifest>
      <manifestEntries>
        <mode>development</mode>
        <url>${pom.url}</url>
        <key>value</key>
      </manifestEntries>
    </archive>
  </configuration>
  ...
</plugin>

Das vollständige Archivierungsspezifikation bietet einige Optionen. Weitere Informationen zum Konfigurieren des Klassenpfads finden Sie auf der Seite Beispiele .

Wenn keine dieser Funktionen für Sie geeignet ist, können Sie Ihr eigenes Manifest definieren , Eigenschaften mit den erforderlichen Einträgen einrichten und Filter verwenden, um das Manifest mit diesen Eigenschaften zu füllen

18
Rich Seller

Versuchen Sie, dies wie in diesem Fehler zu tun, d. H., Einträge mit dem manifestEntries/Class-Path-Element zusammenzuführen

https://issues.Apache.org/jira/browse/MJAR-41

5
Foyta