1

如果以前有人问过这个问题,我很抱歉,但我找不到任何相同的东西。

我创建了一个简单的 jar(myFailingJar.jar) 文件,其中包含两个类,一个主类和一个从另一个 jar 文件 (CCJAPI.jar) 访问一个类及其函数的简单类。

主类只是实例化简单类,简单类加载一个共享库对象并调用 CCJAPI.jar 中跨 JNI 的函数。

当使用此命令作为 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

当我在命令行上指定类路径时,我认为加载到 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 回答
0

您可能没有创建具有正确依赖项的正确 jar 。使用 eclipse 导出(右键单击项目 -->导出),这也将创建所需的清单文件。

导出罐子

使用它应该会有所帮助。

于 2012-12-05T22:03:08.653 回答