Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从VB.Net执行Java类_Java_Vb.net_Class_Shell_Classpath - Fatal编程技术网

从VB.Net执行Java类

从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

我有一个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时,该类运行良好。原因是什么?

您需要向其中添加-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()