我在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时 - 该类运行正常。这是什么原因?
答案 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()