2012-12-05 96 views
1

我apoligize如果已经问过,但我一直无法找到任何是一样的。Jar文件无法运行,提取类运行良好

我创建了一个简单罐(myFailingJar.jar)文件与两类主要类和一个简单的类访问一个类和从另一个jar文件(CCJAPI.jar)其功能。

主类只实例化了简单的类中,简单的类加载共享库对象,并调用该跨越JNI内CCJAPI.jar的功能。

当与此命令,因为它无法找到CCJAPI.jar一类是在classpath失败jar文件运行: 的java -classpath /home/scott:/home/scott/CCJAPI.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

你有清单文件吗? – ApproachingDarknessFish

+0

是指向主。 Apparenlty我刚才发现了这个问题。它是清单文件。如果我在清单中包含类路径,它将起作用。如果仅在命令行中指定,则不会。 – CoderG

+0

谢谢你指点我正确的方向。我最后不得不到类路径添加到即使是在命令行上指定的路径清单文件。 这里是失败的表现: 清单-版本:1.0 创建-者:1.6.0_0(Sun微系统公司) 主类:DetachedManager.Main 这里是成功的体现 清单,版本:1.0 创建者:1.6.0_0(Sun Microsystems Inc.) 类路径:lib/CCAPI.jar Main-Class:DetachedManager.Main – CoderG

回答

0

你可能没有创建正确的罐子与正确的依赖。使用eclipse导出(右键点击一个项目 - >导出),这也会创建需要的清单文件。

Export jar

使用这应该是有帮助的。

+0

不使用eclipse。直接java。 – CoderG

+0

没有IDE只是javac和jar。 – CoderG

0

当我在命令行上指定classpath时,我认为对于任何加载到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 

感谢所有为聆听和给我的位置,以及所看的想法。