从VB.Net执行Java类

时间:2011-01-29 21:34:20

标签: java vb.net class shell classpath

我在java“Main.class”中有一个类,编写并存储在%TEMP%中。通过VB.Net Shell执行类时,例如:

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

当尝试通过CMD手动执行时:“java%TEMP%\ Main.class”,我将返回:

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.

但是,当我通过compile.bat手动执行Main.class时 - 该类运行正常。这是什么原因?

3 个答案:

答案 0 :(得分:1)

您需要为其添加-classpath。基本上Java解释器不知道在哪里可以找到这个“Main”类。

答案 1 :(得分:1)

CoolBean's solution 应该工作。像

这样的东西
Shell("cmd.exe /k java -classpath %TEMP% Main")

因为你可以(并且应该)省略.class扩展名。和CoolBeans说的一样,你将类文件所在的目录设置为类路径。

javac 获取文件时, java 会获取一个类(换句话说,“公共类”之后的类的名称)以及{{3它在(如果你没有“打包东西;”在你的java文件的顶部,不要担心这个),它会在你提供的类路径中查找该类,或者当前工作目录。

如果最终成为解决方案,请向CoolBeans提供接受的答案。

但是,另一种解决方案是将Shell的当前工作目录更改为%TEMP%,例如:

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

或者查看packages类,它可以更好地控制启动其他程序(使用Process,您还可以更改正在启动的程序的目录,而无需更改当前目录你自己的应用程序)。

答案 2 :(得分: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()