13

Mavenにある手順を使用しました。jarに任意のクラスパスエントリを追加して、属性に任意のエントリを追加するにはどうすればよいですか。Class-Pathこれが私のMANIFEST.MFファイルです:

Manifest-Version: 1.0
Class-Path: jace-runtime.jar
Main-Class: org.jace.examples.Test

org.jace.examples.Testを次のように定義しました。

public class Test
{
    public static void main(String[] args)
    {
        System.out.println("classpath: " + System.getProperty("java.class.path"));
        System.out.println("PeerExample: " + Class.forName("org.jace.util.ShutdownHook"));
    }
}

ここorg.jace.util.ShutdownHookで、はで定義されていjace-runtime.jarます。呼び出すjava -jar peer_example1.jarと、次の出力が得られます。

classpath: peer_example1.jar スレッド「メイン」の例外java.lang.ClassNotFoundException:org.jace.util.ShutdownHook

つまり、Javaは実行可能JARファイルをクラスパスに追加していますが、を無視していClass-Pathます。呼び出すjava -cp jace-runtime.jar;peer_example1.jar org.jace.examples.Testと、期待どおりの出力が得られます。

classpath: jace-runtime.jar;peer_example1.jar

何か案は?

4

3 に答える 3

20

私自身の質問に答える:

  1. に任意のエントリを追加することClass-Path自体は問題ありません。この問題は、以下を使用してJARインデックスを有効にすると発生します。

    <configuration>
      <archive>
        <index>true</index>
      </archive>
    </configuration>
    

    Mavenはからのエントリを省略しますMETA-INF/INDEX.LIST

  2. 実行時にJARを使用すると、JavaはMANIFEST.MFではなくINDEX.LISTを参照してクラスを検索します。

  3. エントリがINDEX.LISTにないため、マニフェストの内容に関係なく、クラスローダーによってエントリが検出されません。

簡単な回避策は、JARインデックスを無効にすることです。Class-Pathインデックスを有効にして任意のデータを挿入する方法がわかりません。

于 2012-05-03T18:19:52.257 に答える
0

他の方法では気付かない可能性がある場合、実行可能アーカイブメカニズムはマニフェストクラスパスを取得し、それを使用してアーカイブの外部のクラスをロードします。

したがって、WEB-INF / classesのマニフェストクラスパスを持つWARが、アーカイブのWEB-INF / classesエントリでクラスを検索することを期待している場合は、がっかりします。

于 2014-01-05T23:05:29.700 に答える
-4

jarオプションのtooldocsページごと-ドキュメントへのリンク

このオプションを使用すると、JARファイルがすべてのユーザークラスのソースになり、他のユーザークラスパス設定は無視されます。

于 2012-05-03T17:59:48.890 に答える