これが以前に尋ねられた場合は申し訳ありませんが、同じものを見つけることができませんでした.
メインクラスと、別の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 ファイルの外部で実行するものです。私が把握できていないのは、ある種のクラスパスまたはパスの問題であるに違いありません。どんな助けでも大歓迎です。