2011-12-07 83 views
1

對於在學校的作業,我需要創建一個類Blender,它實現了一些預定義的事情。我收到了一個JAR文件,imagecompositor.jar,它可以完成所有工作,並使用Blender類。 JAR文件包含兩個類(ImageCompositor.classStDraw.class)。Java NoClassDefFoundError

要運行該程序,老師說我必須運行以下命令:

java -cp ... ass3.ImageCompositor img1 img2 offsetx offsety 

我只知道如何代碼的Java。我不知道如何將外部類加載到JAR文件中。所以,我想這一點:

java -cp imagecompositor.jar ass3.ImageCompositor img1.png img2.png 0 0 

但它扔了NoClassDefFoundError

Exception in thread "main" java.lang.NoClassDefFoundError: ass3/Blender 
at ass3.ImageCompositor.main(ImageCompositor.java:113) 

Blender類有行package ass3在裏面。我究竟做錯了什麼?

我想給更多的信息,但我不知道怎麼去堆棧跟蹤等

+0

ImageCompositor第113行發生了什麼? java.lang.NoClassDefFoundError通常是一些靜態構造函數失敗。我們需要更多的堆棧跟蹤來解決這個問題,或者查看ImageCompositor以找出構造函數鏈中的內容。 –

+0

我們沒有得到任務的源代碼。我們只能得到jar文件,所以我不能告訴你發生了什麼。但它可能是攪拌機攪拌機=新的攪拌機();因爲這是它第一次抱怨沒有找到Blender類定義。 – Fatso

+0

你從哪裏看到異常消息?一般來說,堆棧跟蹤在此之後立即出現。 –

回答

0

您需要將Blender類添加到classpath中。

命令行

java -cp imagecompositor.jar ... 

使用imagecompositor.jar的類路徑。這告訴Java虛擬機(JVM)查看jar文件。它沒有告訴JVM要做的是尋找你的類。如果你把它們打包成一個jar文件,你應該做的

java -cp imagecompositor.jar;myclasses.jar ... 

如果.class文件是在根目錄path/to/someRoot樹(如類ass3.Blender應該在path/to/someRoot/ass3/Blender.class),那麼你應該使用相同的語法,但與根目錄,而不是一個.jar文件(我認爲這是正確的,找不到文檔):

java -cp imagecompositor.jar;path/to/someRoot ... 
+0

您描述的解決方案修復java.lang.ClassNotFoundException,但不修復java.lang.NoClassDefFoundError。 java.lang.NoClassDefFoundError通常是一些靜態構造函數失敗。我們需要更多的堆棧跟蹤來試圖解決這個問題。 –

+0

有趣.... –

+0

確實,鮑勃。我其實已經嘗試過了,但它不起作用(給出同樣的錯誤)。另外:jar文件必須用冒號分隔...... – Fatso

0

哪裏攪拌機類在什麼位置?要正確找到,Blender類(包「ass」)必須位於相對於當前目錄名爲「ass」的目錄中。如果是(並且您不從當前默認類路徑中刪除當前導演.),那麼您不需要修改您的班級路徑。

然而,你的情況,你需要修改類路徑(以指定提供的JAR文件),並命令在您的文章上市並從路徑中刪除.。所以,你必須做到以下幾點:

java -cp whatever.jar;. whatever_other_parameters 

(請注意「;」追加到-CP參數)。這使當前目錄早在類路徑中。

+0

你所描述的解決方案修復了java.lang.ClassNotFoundException但不是java.lang.NoClassDefFoundError(Jason的答案有同樣的問題)。 java.lang.NoClassDefFoundError通常是一些靜態構造函數失敗。我們需要更多的堆棧跟蹤來試圖解決這個問題。 –

+0

是的,NoClassDefFoundError只是由於在少數情況下命名的類完全缺失。更常見的原因是缺少不同的類,類版本不匹配或靜態初始化問題。您至少需要回溯的前十行左右才能對其進行分類。 –

+0

謝謝鮑勃:),那是真的。過去也試過,沒有奏效。 – Fatso

0

java.lang.NoClassDefFoundError通常是靜態構造函數中的失敗。如果JVM根本找不到你的類,那麼JVM會說java.lang.ClassNotFoundException。從你的問題的描述,我想在命令行是:

java -cp imagecompositor.jar ass3.ImageCompositor img1 img2 offsetx offsety 

這是假設imagecompositor.jar文件在同一目錄中,我們在執行java命令。這是告訴java編譯器將imagecompositor.jar中的所有內容都提供給類加載器,並且我們正在加載一個名爲ImageCompositor的類,該類駐留在ass3包中。我們還假設ImageCompositor有一個靜態主要方法,這是Java從命令行運行的東西。