2016-05-09 140 views
1

Hello當我從Eclipse運行我的應用程序時它運行完美,但是當我將它作爲可運行jar導出時,它不會運行。 當我嘗試從CMD它給了我2個錯誤的一個第一errror是後,我只是用它導出「拷貝所需的庫到一個子文件夾」運行它:從.jar運行應用程序時發生Java 3d錯誤

Exception in thread "main" java.lang.UnsatisfiedLinkError: no j3dcore-ogl in java.library.path 
    at java.lang.ClassLoader.loadLibrary(Unknown Source) 
    at java.lang.Runtime.loadLibrary0(Unknown Source) 
    at java.lang.System.loadLibrary(Unknown Source) 
    at javax.media.j3d.NativePipeline$1.run(NativePipeline.java:189) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.media.j3d.NativePipeline.loadLibrary(NativePipeline.java:180) 
    at javax.media.j3d.NativePipeline.loadLibraries(NativePipeline.java:137) 
    at javax.media.j3d.MasterControl.loadLibraries(MasterControl.java:948) 
    at javax.media.j3d.VirtualUniverse.<clinit>(VirtualUniverse.java:280) 
    at javax.media.j3d.Canvas3D.<clinit>(Canvas3D.java:3862) 
    at Main.Game.<init>(Game.java:39) 
    at Main.Main.main(Main.java:6) 

當我改變子從IslandDomination_lib文件夾的名稱,只是LIB它給了我另一個錯誤:

Exception in thread "main" java.lang.NoClassDefFoundError: javax/media/j3d/Canvas3D 
     at Main.Main.main(Main.java:6) 
    Caused by: java.lang.ClassNotFoundException: javax.media.j3d.Canvas3D 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    ... 1 more 

我試圖運行它幾個方面:

1.

java.exe -jar IslandDomination.jar 

2.

java.exe -cp "lib/j3dcore.jar;lib/j3dutils.jar;lib/vecmath.jar" -jar IslandDomination.jar 

3.使用其他java程序爲我運行它:

package main; 
import java.io.File; 
import java.io.IOException; 

public class Main { 
    public static void main(String[] args) throws IOException,  InterruptedException{ 
    ProcessBuilder pb = new ProcessBuilder(System.getProperty("java.home")+"\\bin\\java.exe", "-cp" , "\"lib/j3dcore.jar;lib/j3dutils.jar;lib/vecmath.jar\"" , "-jar" , "IslandDomination.jar"); 
    pb.directory(new File("./")); 
    Process p = pb.start(); 
    p.waitFor(); 
    } 
} 

我的jar包的內部結構由4個文件夾:

J3DBool 
Main 
Maths 
META-INF 

帶有所需罐子的文件夾與主罐子位於同一文件夾中

+0

只需更新運行時類路徑,以包括JAR,並確保它實際上是在類路徑中準備啓用。你可以更新你的問題,包括如何從jar中運行你的應用程序,並顯示你的jar的內部結構? – ManoDestra

+0

JOGL缺失,它應該在您的類路徑中,Java3D 1.5(過時)使用JOGL 1.1.1(已過時)。請看下面的答案。如果Java3D不使用JOGL管道,則需要j3dcore-ogl.dll。使用Java3D 1.6.0不太麻煩並且更安全。 – gouessej

回答

0

我認爲在classpath中找不到所需的庫文件(jar文件)。

您需要在類路徑中設置庫文件。

步驟設置類路徑: -

MyComputer->屬性 - >高級系統設置 - >環境變量

發現無論是在用戶變量區或系統變量「類路徑」,如果發現編輯並把所有的jar文件鏈接。如果沒有找到,然後創建新的(點擊新的),並把所有的jar鏈接在那裏,並嘗試運行你的應用程序

+0

好吧,如果我這樣做,那麼最終用戶在下載我的應用程序時也必須這樣做,這很難完成,至少對最終用戶來說足夠困難,以免打擾使用我的應用程序 –

+0

在導出時jar文件選擇「將所需的庫打包到生成的JAR中」。它創建一個包含所有庫文件的單個jar文件。 –

+0

它仍然給我第一個錯誤 –

1

你使用一個完全過時的Java3D版本,這是很難捆綁在任何軟件,因爲你必須以某種方式設置Java庫路徑,並且必須捆綁Java庫本地庫。相反,使用Java3D 1.6.0 pre 12重建項目會更容易,因爲此版本依賴於使用自動本機庫加載的JOGL 2,並且所有內容都打包爲JAR,因此不再需要修改庫路徑,只需照顧類路徑。

請按照my tutorial,特別是最後一節(很多)更多的信息。

最後,您使用的過時版本無法保證適用於任何最新的操作系統。如果它有效,你會很幸運。如果不是,沒有人會解決它。

+0

好吧,我會嘗試這 –

+0

如果你需要一些幫助,使一個胖的JAR,讓我知道。我建議你使用Ant,它也可以在Eclipse中工作,但它不需要IDE。它非常靈活和強大,我們有很多JogAmp用戶使用它,如果出現問題,我們將能夠爲您提供幫助。如果我是你,我會把你的JAR與j3dcore.jar,j3dutils.jar,vecmath.jar和jogamp-fat.jar合併。然後,您的最終用戶不必修改環境變量來設置庫路徑,就不必擔心32位/ 64位體系結構。 – gouessej

+0

我剛纔看到,在jar文件旁邊有需要的dll-s修復了我的問題 –

0

我發現瞭如何解決我的問題,這是通過簡單地把所需的dll文件旁邊的可執行的JAR文件進行

+0

僅當Java3D 1.5使用其原生OpenGL管道(請參閱j3d.rend修改此行爲)時才使用j3dcore-ogl.dll。當Java3D 1.5使用其JOGL管道時,它也需要Java庫和JOGL的本地庫。據我所知,Java3D 1.5在Windows 32位和Windows 64位下不使用相同的管道。因此,您只修復了一小部分問題。 – gouessej

相關問題