从我们的Java程序执行一个Java程序
我曾经 但它抛出一个从我们的Java程序执行一个Java程序,java,Java,我曾经 但它抛出一个IOException,如下所示: Runtime.getRuntime().exec("_____") java.io.IOException:CreateProcess:c:/error=5 位于java.lang.Win32Process.create(本机方法) 位于java.lang.Win32Process。(Win32Process.java:63) 在java.lang.Runtime.execInternal(本机方法 我不知道我在指定路径或其他方面是否
IOException
,如下所示:
Runtime.getRuntime().exec("_____")
java.io.IOException:CreateProcess:c:/error=5
位于java.lang.Win32Process.create(本机方法)
位于java.lang.Win32Process。(Win32Process.java:63)
在java.lang.Runtime.execInternal(本机方法
我不知道我在指定路径或其他方面是否有问题。有人能帮我编写代码吗。从java程序调用main如何 Test.main(空)
这对我来说很好有什么原因不能直接在Java代码中调用它吗
如果有什么原因,我没有在执行Java程序时使用它,但您可以尝试使用它来执行大多数程序。您必须在exec方法中传递可执行文件的路径。您真的要执行“-”进程吗
另外,请看一些有用的提示。我记不起用于实现此功能的确切代码,但您必须传递“java.exe”(或等效代码)作为可执行文件,然后作为参数运行的类或jar,使用正确的工作目录。因此,这并不像只调用一个方法那么简单。您正在尝试执行“C:/”。您需要执行类似以下内容:
“javaw.exe d:\\somejavaprogram\\program.jar”
请注意路径分隔符
我假设这是一个临时项目,而不是大型项目。但是,对于从代码运行外部程序的最佳实践:
- 不要硬编码可执行文件的位置,除非你确定它永远不会改变
- 使用System.getenv查找目录,如%windir%
- 不要假设像javaw.exe这样的程序在搜索路径中:首先检查它们,或者允许用户指定位置
- 请确保您考虑了空格:
如果myProg是“cmd/c start”+myProg
,则将不起作用“my program.jar”
- 我最近不得不这么做。
我是这样做的,只挑选了相关部分:
java.io.IOException: CreateProcess: c:/ error=5
at java.lang.Win32Process.create(Native Method)
at java.lang.Win32Process.<init>(Win32Process.java:63)
at java.lang.Runtime.execInternal(Native Method
private静态最终字符串[]straJavaArgs=
{
“?i/j2re/bin/java”,
“-ms64m”,
“-mx64m”,
“-Djava.ext.dirs=?i/lib;?i/jar/lib;?i/jar”
};
// ...
//AppDesc appToRun;
List params=new ArrayList();
//javaexe和参数
addAll(ExpandStrings(straJavaArgs));
//常见VM参数
params.addAll(Arrays.asList(AppDesc.GetCommonVMArgs());
//特定VM参数
params.addAll(ExpandStrings(appToRun.GetVMArgs());
//要运行的程序
add(appToRun.GetClass());
//它的论点
params.addAll(ExpandStrings(appToRun.GetProgramArgs());
//常见论点
params.addAll(ExpandStrings(AppDesc.GetCommonProgramArgs());
ProcessBuilder ProcessBuilder=新的ProcessBuilder(参数);
process=processBuilder.start();
return CaptureProcessOutput();//使用StreamGoBler类
受保护的ArrayList ExpandString(字符串[]stra)
{
ArrayList alResult=新的ArrayList();
对于(int i=0;i
不完整,如果您需要更多详细信息,请询问
private static final String[] straJavaArgs =
{
"?i/j2re/bin/java",
"-ms64m",
"-mx64m",
"-Djava.ext.dirs=?i/lib;?i/jar/lib;?i/jar"
};
// ...
// AppDesc appToRun;
List<String> params = new ArrayList<String>();
// Java exe and parameters
params.addAll(ExpandStrings(straJavaArgs));
// Common VM arguments
params.addAll(Arrays.asList(AppDesc.GetCommonVMArgs()));
// Specific VM arguments
params.addAll(ExpandStrings(appToRun.GetVMArgs()));
// The program to run
params.add(appToRun.GetClass());
// Its arguments
params.addAll(ExpandStrings(appToRun.GetProgramArgs()));
// The common arguments
params.addAll(ExpandStrings(AppDesc.GetCommonProgramArgs()));
ProcessBuilder processBuilder = new ProcessBuilder(params);
process = processBuilder.start();
return CaptureProcessOutput(); // Uses a StreamGobbler class
protected ArrayList<String> ExpandStrings(String[] stra)
{
ArrayList<String> alResult = new ArrayList<String>();
for (int i = 0; i < stra.length; i++)
{
// Super flexible, eh? Ad hoc for the current task, at least...
alResult.add(stra[i]
.replaceAll("\\?i", strInstallDir)
.replaceAll("\\?c", strConfigDir)
);
}
return alResult;
}
public enum AppDesc
{
// Enumerate the applications to run, with their parameters
}
如果我没记错的话,错误代码5表示访问被拒绝。这可能是因为您的路径不正确(尝试执行“c:/”),或者您的操作系统安全受到了影响(在这种情况下,请查看权限)
如果您在查找Java可执行文件时遇到问题,通常可以使用系统属性找到它:
java.io.IOException: CreateProcess: c:/ error=5
at java.lang.Win32Process.create(Native Method)
at java.lang.Win32Process.<init>(Win32Process.java:63)
at java.lang.Runtime.execInternal(Native Method)
在尝试查找可执行文件时,您可能还需要查看“java.library.path”系统属性(和“path.separator”)。您可以启动另一个JVM(如其他答案中详细介绍的)。 但这不是我想要的解决方案 原因是:
- 从java调用本机程序是“肮脏的”(有时会使您自己的VM崩溃)
- 您需要知道外部JVM的路径(现代JVM不再将JAVA_设置为HOME)
- 你无法控制另一个程序
- 您必须在运行时动态地包含所需的JAR(或者在应用程序的类路径中包含它们)
- 你必须把插件放在一个沙箱中,以防止危及其他应用程序的关键类
所以,你可以选择:要么快速而肮脏,要么努力但有回报。我也有一个类似的问题。我需要在一个单独的虚拟机中运行一段Java代码,因为它通过JNI调用本机代码,而JNI偶尔会炸掉整个虚拟机 不过我有点作弊。我最初使用Runtime调用一个简单的批处理命令文件,并将work in progress java命令放在其中。这使我能够根据需要对其进行调整,并在DOS提示符下运行该命令以便于测试。完成后,我只需将结果复制到Runtime调用中
java -version
上面的方法非常有效,不要将\“c:/program files/windows/notepad.exe \”作为可执行文件的参数,而是使用
java -version
public class Test {
public static void main(String[] args) throws Exception {
Process p = Runtime.getRuntime().exec("\"c:/program files/windows/notepad.exe\"");
p.waitFor();
}
}
$ process p = Runtime.getRuntime().exec("javac factorial.java"); in the try catch block
try
{
process p = Runtime.getRuntime().exec("javac factorial.java");
}
catch(IOException e)
{
e.printStackTrace();
}
public class ProgA {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
System.out.println("Helllo print thr ProgA");
}
}
}
public class ProgB {
public static void main(String[] args) {
ProgA progA = new ProgA();
String arg[] = null;
progA.main(arg);
}
}
try {
Runtime runTime = Runtime.getRuntime();
Process process = runTime.exec("java -jar deleteDriveC.jar");
} catch (IOException ex) {
//jar file doesnt exist
//Logger.getLogger(this.class.getName()).log(Level.SEVERE, null, ex);
}
import org.apache.tools.ant.taskdefs.Execute;
Execute exe = new Execute();
exe.setCommandline(new String[]{"java", "-version"});
exe.execute();