2010-01-22 162 views
3

我看了herehereherehere從Python運行Java程序

雖然信息豐富,但他們只是不足以讓我發現問題的根源。我的代碼不包含在JAR文件中,客戶要求我們不要這樣發貨。

我在Eclipse中構建應用程序,並從那裏運行良好。我已經設置了一個腳本來修改其中一個java文件的main方法用於測試目的。我想在修改後使用來自Python的調用來運行應用程序。然而,在命令行,當我嘗試調用使用javajava -cp .我得到以下錯誤的程序:

Exception in thread "main" java.lang.NoClassDefFoundError: DemoAPIFunctionality 
Caused by: java.lang.ClassNotFoundException: DemoAPIFunctionality 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    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) 
    at java.lang.ClassLoader.loadClassInternal(Unknown Source) 
Could not find the main class: DemoAPIFunctionality. Program will exit. 

我的項目依賴於幾個JAR,它們是不是根目錄中,和DLL文件,再次不在根目錄中。我希望這是與其中一個位置有關,但我不確定,而且進展甚微。這裏是DemoAPIFunctionality.java

public class DemoAPIFunctionality 
{ 
    public final static void main(String[] args) 
    { 
    DemoAPIFunctionality demo = new DemoAPIFunctionality(); 

我會高興地列出任何詳細信息,如果它會幫助你幫助我。 (不,我不是體育經紀人。)我需要做些什麼才能讓它至少從命令行起作用?

在此先感謝。

+1

套件中是否包含'DemoAPIFunctionality'? (如果你能顯示完整的源代碼,這將有所幫助。)你的目錄和文件結構是什麼? '.class'文件在哪裏? – 2010-01-22 22:20:15

回答

3

你沒有提到你的python腳本在應用編輯之後實際編譯了java源文件。

Eclipse將自動編譯它(內置構建器),但當然,在IDE之外,您必須先調用javac,然後才能執行該類。 java不適用於源文件。

編輯

我不知道你在Java中的實際經驗 - 但這就是它通常工作在命令行上。

假設,你有一個Java類com.example.Hello與主要方法和文件結構像

/dev/bin/com/example/Hello.class 

那麼你cd/dev/bin,做一個java com.example.Hello。請注意,包名稱(com.example)始終映射到文件夾結構(com/example)。如果您執行了上述命令,並且java在文件夾./com/example中找不到Hello.class,則會拋出NoClassDefFoundError

+0

你是對的。但是,錯誤依然存在。我從命令行使用Eclipse編譯的代碼,並得到相同的結果。 – wheaties 2010-01-22 23:35:47

+1

奇怪。當執行命令'java DemoAPIFunctionality'而不是在項目或'src'文件夾中時,請仔細檢查你是否真的在項目的'bin'文件夾中(假設你有一個典型的帶項目的eclipse項目文件夾結構/ src'用於源文件,'project/bin'用於類文件) – 2010-01-22 23:54:52

+0

是的,我在bin目錄中,而不是src。這就是爲什麼我包含有關其他JAR依賴關係和DLL依賴關係的知識,這些依賴關係在bin目錄樹中找不到。 – wheaties 2010-01-23 00:21:56

4
  1. 在默認包(即沒有包裝),其具有類氣餒
  2. 必須調用java -cp .從項目的根目錄 - 即所在的目錄,你.class文件駐留,或者當您創建套餐,目錄,comorg等)子目錄所在的目錄。
  3. 您必須使用完全限定名稱引用該類 - 即com.package.ClassName
  4. 您最好使用IDE - 用於教育目的的是BlueJ和JCreator。 Eclipse和NetBeans更強大,更復雜。
+0

1.是的,是的,我不好。將改變它修復它?我做到了。 3.參見1 4.雖然內置IDE,但他們不想使用IDE進行演示。它應該表明它可以像使用腳本一樣進行測試。 – wheaties 2010-01-22 22:29:03

3

簡單的解決方法,提示和快捷方式。 從python中調用java classname時不要使用任何路徑。 例如。 commands.getstatusoutput("java -cp $CLASSPATH clusterize")