1

これが以前に尋ねられた場合は申し訳ありませんが、同じものを見つけることができませんでした.

メインクラスと、別のjarファイル(CCJAPI.jar)からクラスとその関数にアクセスする単純なクラスの2つのクラスを持つ単純なjar(myFailingJar.jar)ファイルを作成しました。

メイン クラスは単純なクラスをインスタンス化するだけで、単純なクラスは共有ライブラリ オブジェクトをロードし、JNI をまたぐ CCJAPI.jar 内の関数を呼び出します。

このコマンドで jar ファイルとして実行すると、クラスパス上にある CCJAPI.jar にクラスが見つからないため失敗します: java -classpath /home/scott:/home/scott/CCJAPI.jar -jar myFailingJar.jar

起動

Exception in thread "main" java.lang.NoClassDefFoundError: ccjni/DeviceManager
    at DetachedManager.DetachedDeviceManager.startManager(DetachedDeviceManager.java:24)
    at DetachedManager.Main.main(Main.java:19)
Caused by: java.lang.ClassNotFoundException: ccjni.DeviceManager
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336)

myFailingJar.jar ファイルの内容を抽出してこのコマンドを実行すると、動作します。私が知る限り、抽出されたクラス ファイルに移動し、次のコマンドを実行します: java -classpath /home/scott:/home/scott/ CCJAPI.jar DetachedManager.Main

開始中 ** 開始済み ** 成功 = - クラッシュします

両方のソース ファイルの内容は次のとおりです。

メインのソース

package DetachedManager;

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        DetachedDeviceManager devMgr = new DetachedDeviceManager();
        if( devMgr.startManager() )
        {
            System.out.println("Success = - Going to crash now");
        }

    }

}

単純なクラスのソース:

package DetachedManager;

import ccjni.DeviceManager;

public class DetachedDeviceManager {

    {
        System.load("/usr/lib/libccJNI.so");
    }

    public boolean startManager()
    {
        System.out.println("Starting");
        DeviceManager.start();
        System.out.println("** Started ** ");
        return true;
    }

}

唯一の違いは、コンパイルされたクラスを jar ファイル内から実行しようとするものと、jar ファイルの外部で実行するものです。私が把握できていないのは、ある種のクラスパスまたはパスの問題であるに違いありません。どんな助けでも大歓迎です。

4

2 に答える 2

0

正しい依存関係を持つ正しい jar を作成していない可能性があります。Eclipse エクスポートを使用します (プロジェクトを右クリック --> [エクスポート] )。これにより、必要なマニフェスト ファイルも作成されます。

輸出瓶

これを使用すると役立つはずです。

于 2012-12-05T22:03:08.653 に答える
0

コマンドラインでクラスパスを指定したとき、Java環境にロードされたjarファイルがjarファイルを見つけるのに十分であると考えましたが、明らかにそうではありません。そのパスがコマンドラインで指定されていたとしても、クラスパスをマニフェストファイルに追加する必要がありました。

失敗したマニフェストは次のとおりです。

Manifest-Version: 1.0
Created-By: 1.6.0_0 (Sun Microsystems Inc.)
Main-Class: DetachedManager.Main

これが成功したマニフェストです

Manifest-Version: 1.0
Created-By: 1.6.0_0 (Sun Microsystems Inc.)
Class-Path: lib/CCAPI.jar
Main-Class: DetachedManager.Main

聞いてくれて、どこで何を見るべきかを教えてくれてありがとう。

于 2012-12-06T17:43:46.430 に答える