如果之前已经提出要求,我会尽力帮助,但我无法找到任何相同的内容。
我创建了一个简单的jar(myFailingJar.jar)文件,其中包含两个类,一个主类和一个简单的类,它从另一个jar文件(CCJAPI.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文件外运行它。它必须是某种类型的类路径或路径问题,我一直无法弄清楚。任何帮助将不胜感激。
答案 0 :(得分:0)
您可能没有使用正确的依赖创建正确的jar 。使用eclipse导出(右键单击项目 - > 导出),这也将创建所需的清单文件。
使用它应该会有所帮助。
答案 1 :(得分: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
感谢所有人的倾听,并让我了解了在哪里以及在什么地方看。