64 votes

Maven - comment puis-je ajouter une entrée de chemin de classe arbitraire à un fichier jar?

J'ai une situation inhabituelle où j'ai besoin d'ajouter un arbitraire classpath (qui pointe vers un fichier jar) dans le manifeste d'un exécutable jar. (C'est pour un Swing application de bureau.)

Le maven-jar-plugin génère le "Chemin de Classe" entrée pour le pot manifeste en utilisant les dépendances maven, et il ne semble pas être un moyen de l'ajout d'arbitraire entrées.

J'ai également regardé coder en dur l'arbitraire classpath entrée dans le fichier batch qui lance l'application, à l'aide de la "-classpath" paramètre, mais je ne peux pas comprendre comment obtenir Maven pour filtrer le chemin de la classe dans un fichier de commandes.

82voto

Ali Reza Points 376

J'ai trouvé qu'il existe une solution facile à ce problème. Vous pouvez ajouter un élément <Class-Path> à <manifestEntries> et définir les éléments <addClassPath>true</addClassPath> à <manifest> . Ainsi, la valeur de <Class-Path> élément est ajoutée automatiquement à class-path. 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>
 

18voto

Rich Seller Points 46052

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

Le maven-dépendance-plugin build-classpath objectif peut être configuré pour émettre le chemin d'un fichier dans les propriétés de format (c'est à dire classpath=[classpath]). Vous pouvez ensuite configurer les filtres élément à utiliser généré le classpath de fichier, et de configurer le répertoire de ressources pour être filtré.

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>

Ensuite, spécifiez 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 bug avec ce traitement à l'aide de la fenêtre standard séparateur de chemin d'accès (\), l'générer chemin est dépouillé de séparateurs (remarque, il fonctionne très bien sur Linux). Vous pouvez obtenir le classpath pour être correctement généré pour Windows, en spécifiant <fileSeparator>\\\\</fileSeparator> dans la build-classpath de l'objectif de configuration.


Vous pouvez personnaliser le manifeste du jar-plugin's de configuration. Pour ce faire, vous devez ajouter quelque chose comme ceci à votre pom.

<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 pleine archiveur spécification fournit quelques options. Voir la page des exemples pour les options à configurer le classpath.

Si aucun de ces travaux pour vous, vous pouvez définir votre propre Manifeste, définir les propriétés contenant les entrées nécessaires et l'utilisation d'un filtre pour remplir le manifeste avec ces propriétés

5voto

Foyta Points 116

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

http://jira.codehaus.org/browse/MJAR-41

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X