任意のクラスパスエントリ(jarファイルを指す)を実行可能jarのマニフェストに追加する必要があるという異常な状況があります。 (これはSwingデスクトップアプリケーション用です。)
Maven-jar-pluginは、maven依存関係を使用してjarマニフェストの「Class-Path」エントリを生成しますが、任意のエントリを追加する方法はないようです。
「-classpath」パラメーターを使用して、アプリケーションを起動するバッチファイルに任意のクラスパスエントリをハードコーディングすることも検討しましたが、Mavenがクラスパスをバッチファイルにフィルター処理する方法を理解できません。
この問題には簡単な解決策があることがわかりました。 <Class-Path>
要素を<manifestEntries>
要素に追加し、<addClassPath>true</addClassPath>
を<manifest>
要素に設定できます。したがって、<Class-Path>
要素の値は自動的にクラスパスに追加されます。例:
<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>
更新:クラスパスをカスタムマニフェストにフィルターする方法は次のとおりです。
Maven-dependency-pluginのbuild-classpath
ゴールは、プロパティ形式(つまり、classpath = [classpath])でファイルへのクラスパスを出力するように構成できます。次に、生成されたクラスパスファイルを使用するようにfilters要素を構成し、リソースディレクトリをフィルタリングするように構成します。
例えば:
<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>
次に、src/main/resources/META-INF/Manifest.MFで以下を指定します。
Bundle-Version: 4.0.0
...
Classpath: ${classpath};[specify additional entries here]
注:標準ウィンドウパスセパレーター(\
)を使用したこの処理にはバグがあり、生成パスからセパレーターが削除されます(注Linuxでは正常に動作します)。 <fileSeparator>\\\\</fileSeparator>
ゴールの設定でbuild-classpath
を指定することにより、Windowsでクラスパスを正しく生成できます。
jar-plugin の構成でマニフェストをカスタマイズできます。そのためには、このようなものを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>
完全な アーカイバ仕様 は、かなりの数のオプションを提供します。クラスパスの設定に関するオプションについては、 例のページ を参照してください。
これらのいずれも機能しない場合は、 独自のマニフェストを定義 、必要なエントリを含むプロパティを設定し、 filter を使用してマニフェストにそれらのプロパティを設定できます
このバグで行うように、つまりmanifestEntries/Class-Path要素を使用してエントリをマージするようにしてください