web-dev-qa-db-fra.com

Maven - comment puis-je ajouter une entrée de chemin de classe arbitraire dans un bocal?

J'ai une situation inhabituelle où j'ai besoin d'ajouter une entrée de chemin de classe arbitraire (qui pointe vers un fichier jar) dans le manifeste d'un jar exécutable. (Il s'agit d'une application de bureau Swing.)

Le plugin maven-jar génère l'entrée "Class-Path" pour le manifeste jar en utilisant les dépendances maven, et il ne semble pas y avoir de moyen d'ajouter des entrées arbitraires.

J'ai également examiné le codage en dur de l'entrée de chemin de classe arbitraire dans le fichier de commandes qui démarre l'application, en utilisant le paramètre "-classpath", mais je ne peux pas comprendre comment obtenir Maven pour filtrer le chemin de classe dans un fichier de commandes.

62
Ken Liu

J'ai trouvé qu'il existe une solution simple à ce problème. Vous pouvez ajouter un élément <Class-Path> À l'élément <manifestEntries> Et définir <addClassPath>true</addClassPath> Sur l'élément <manifest>. La valeur de l'élément <Class-Path> Est donc ajoutée automatiquement au chemin de classe. Exemple:

<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

Mise à jour: voici comment filtrer un chemin de classe dans un manifeste personnalisé.

Le plugin maven-dependency-plugin build-classpath l'objectif peut être configuré pour sortir le chemin de classe dans un fichier au format des propriétés (c'est-à-dire classpath = [classpath]). Vous configurez ensuite l'élément filters pour utiliser le fichier de chemin de classe généré et configurez le répertoire de ressources à filtrer.

Par exemple:

<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>

Spécifiez ensuite les éléments suivants dans src/main/resources/META-INF/Manifest.MF:

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

Remarque: il y a un bogue avec ce traitement utilisant le séparateur de chemin de fenêtre standard (\), le chemin de génération est dépourvu de séparateurs (notez qu'il fonctionne très bien sous Linux). Vous pouvez obtenir le chemin de classe à générer correctement pour Windows en spécifiant <fileSeparator>\\\\</fileSeparator> dans le build-classpath configuration de l'objectif.


Vous pouvez personnaliser le manifeste dans la configuration de jar-plugin . Pour ce faire, vous devez ajouter quelque chose comme ça à votre pompon.

<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>

La version complète spécification de l'archiveur fournit plusieurs options. Voir la page d'exemples pour les options de configuration du chemin de classe.

Si aucun de ces éléments ne fonctionne pour vous, vous pouvez définir votre propre manifeste , configurer des propriétés contenant les entrées requises et utiliser un filtre pour remplir le manifeste avec ces propriétés

18
Rich Seller

Essayez de le faire comme ils le font dans ce bogue, c'est-à-dire de fusionner les entrées en utilisant l'élément manifestEntries/Class-Path

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

5
Foyta