2012-12-05 101 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 

感謝所有爲聆聽和給我的位置,以及所看的想法。