web-dev-qa-db-ja.com

Maven-jarに任意のクラスパスエントリを追加するにはどうすればよいですか?

任意のクラスパスエントリ(jarファイルを指す)を実行可能jarのマニフェストに追加する必要があるという異常な状況があります。 (これはSwingデスクトップアプリケーション用です。)

Maven-jar-pluginは、maven依存関係を使用してjarマニフェストの「Class-Path」エントリを生成しますが、任意のエントリを追加する方法はないようです。

「-classpath」パラメーターを使用して、アプリケーションを起動するバッチファイルに任意のクラスパスエントリをハードコーディングすることも検討しましたが、Mavenがクラスパスをバッチファイルにフィルター処理する方法を理解できません。

62
Ken Liu

この問題には簡単な解決策があることがわかりました。 <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>
72
Ali Reza

更新:クラスパスをカスタムマニフェストにフィルターする方法は次のとおりです。

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 を使用してマニフェストにそれらのプロパティを設定できます

18
Rich Seller

このバグで行うように、つまりmanifestEntries/Class-Path要素を使用してエントリをマージするようにしてください

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

5
Foyta