从VB.Net执行Java类
我有一个java“Main.class”类,编写并存储在%TEMP%中。通过VB.Net Shell执行类时,例如:从VB.Net执行Java类,java,vb.net,class,shell,classpath,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/c
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时,该类运行良好。原因是什么?您需要向其中添加-classpath。Java解释器基本上不知道在哪里可以找到这个“Main”类。应该可以工作。差不多
Shell("cmd.exe /k java -classpath %TEMP% Main")
因为您可以(并且应该)省略.class扩展。正如CoolBeans所说,您将类文件所在的目录设置为类路径
当javac获取一个文件时,java获取一个类(换句话说,在“public Class”之后的类名),以及它所包含的内容(如果您的java文件顶部没有“package something;”,不用担心),它会在您提供的类路径中查找该类,或当前工作目录
如果这最终成为解决方案,请给CoolBeans一个公认的答案
但是,另一种解决方案是将Shell的当前工作目录更改为%TEMP%,如:
IO.Directory.SetCurrentDirectory(Environ("TEMP"))
Shell("cmd.exe /k java Main")
或者也可以查看类,它提供了对启动其他程序的更精细的控制(通过过程,您也可以更改正在启动的程序的目录,而不更改您自己应用程序的当前目录)。试试这个
Shell("java.exe -cp .;" & Environment.GetEnvironmentVariable("TEMP") & " Main")
或
Shell(“cmd.exe/k java.exe-classpath%TEMP%\Main.class”)仍然无法工作。在classpath之后,添加Main.class existsDoes%TEMP%所需库转换为C:\Users\Ben\AppData\Local\TEMP的路径,所有类/lib都位于该路径?它应该是-classpath%TEMP%Main.Yes。也尝试过-它自己解决了%TEMP%。尝试:Shell(“cmd.exe/k java-classpath.%TEMP%\Main.class”)-仍然不走运。@Tom Hall好吧,那么您的类文件似乎不是真正的类文件。那个神奇的数字是C38AC3BE,用十六进制表示,而它应该是CAFEBABE。
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()