2011-01-29 20 views
1

我在java「Main.class」中有一個類,寫入並存儲在%TEMP%中。當通過VB.Net殼牌執行類,如:從VB.Net執行Java Class

Shell("cmd.exe /k java %TEMP%\Main.class") 

此外,當試圖通過CMD手動執行:

Exception in thread "main" java.lang.NoClassDefFoundError: C:\Users\Ben\AppData\ 
Local\Temp\Main/class 
Caused by: java.lang.ClassNotFoundException: C:\Users\Ben\AppData\Local\Temp\Mai 
n.class 
     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) 
Could not find the main class: C:\Users\Ben\AppData\Local\Temp\Main.class. Prog 
ram will exit. 
: 「Java的%TEMP%\ Main.class」,我與返回

但是,當我通過compile.bat手動執行Main.class時 - 類運行良好。這是什麼原因?

回答

1

您需要爲其添加-classpath。基本上Java解釋器不知道在哪裏找到這個「Main」類。

+0

殼牌( 「CMD.EXE/K的java.exe -classpath%TEMP%\ Main.class」)還不行。 – 2011-01-29 21:42:30

1

CoolBean's solution應該工作。類似於

Shell("cmd.exe /k java -classpath %TEMP% Main") 

由於您可以(也應該)省略.class擴展名。就像CoolBeans說的那樣,你需要設置類文件所在的目錄作爲類路徑。

雖然的javac需要一個文件,的Java(「公共類」之後,換句話說,這個名字之類的)需要一個類,它是在什麼packages沿(如果你沒有「打包一些東西;「在你的java文件的頂部,不用擔心),它會在你提供的類路徑或當前工作目錄中尋找那個類。

如果這確實最終成爲解決方案,請給予CoolBeans公認的答案。

然而,另一種解決辦法是改變當前的工作目錄殼牌%TEMP%,如:

IO.Directory.SetCurrentDirectory(Environ("TEMP")) 
Shell("cmd.exe /k java Main") 

或可選擇地窺視Process類,它在啓動其他程序提供更精細的控制(和Process,你也可以改變你正在啓動的程序的目錄,而不必改變你自己的應用程序的當前目錄)。

0

試試這個,

Shell("java.exe -cp .;" & Environment.GetEnvironmentVariable("TEMP") & " Main") 

OR

Dim args As String = String.Format("-cp .;{0} {1}", Environment.GetEnvironmentVariable("TEMP"), "Main") 

    Dim procInfo As New ProcessStartInfo 
    procInfo.FileName = "java.exe" 
    procInfo.Arguments = args 

    Dim proc As New Process 

    proc.StartInfo = procInfo 
    proc.Start() 
    proc.WaitForExit()