我用了
Runtime.getRuntime().exec("_____")
Run Code Online (Sandbox Code Playgroud)
但它抛出IOException
如下:
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
Run Code Online (Sandbox Code Playgroud)
我不知道在指定路径或其他方面是否存在问题.任何人都可以帮我解决这些问题.
Mar*_*ark 10
你正试图执行"C:/".你想要执行类似的东西:
"javaw.exe d:\\somejavaprogram\\program.jar"
注意路径分隔符.
我假设这是一个特别的项目,而不是一个大的项目.但是,从代码运行外部程序的最佳实践:
"cmd /c start " + myProg
如果是myProg,则无法使用"my program.jar"
.您可以启动另一个JVM(如其他答案中详细描述的).但这不是我想要的解决方案.
原因是:
无论如何,这样做的主要原因是,另一个应用程序也无法控制您的部分程序.更重要的是,如果其他应用程序不知道其线程101,那么像AWT-Thread这样的无响应系统线程也没有问题.
但!通过使用基本插件技术,您可以实现更多控制和类似行为.即只是调用"已知的接口方法",其他应用程序必须实现.(在这种情况下是"主要"方法).
只有它听起来并不像听起来那么容易.
这需要一个自定义的类加载器.但要注意 - 实施这一点有一些隐藏的陷阱.另一方面,这是一个很好的练习.
所以,请选择:快速,肮脏或艰难但有益.
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)
Run Code Online (Sandbox Code Playgroud)
如果我没记错,错误代码5表示访问被拒绝.这可能是因为您的路径不正确(尝试执行"c:/")或者您正在碰撞您的操作系统安全性(在这种情况下,请查看权限).
如果您在查找Java可执行文件时遇到问题,通常可以使用系统属性找到它:
public class LaunchJre {
private static boolean isWindows() {
String os = System.getProperty("os.name");
if (os == null) {
throw new IllegalStateException("os.name");
}
os = os.toLowerCase();
return os.startsWith("windows");
}
public static File getJreExecutable() throws FileNotFoundException {
String jreDirectory = System.getProperty("java.home");
if (jreDirectory == null) {
throw new IllegalStateException("java.home");
}
File exe;
if (isWindows()) {
exe = new File(jreDirectory, "bin/java.exe");
} else {
exe = new File(jreDirectory, "bin/java");
}
if (!exe.isFile()) {
throw new FileNotFoundException(exe.toString());
}
return exe;
}
public static int launch(List<String> cmdarray) throws IOException,
InterruptedException {
byte[] buffer = new byte[1024];
ProcessBuilder processBuilder = new ProcessBuilder(cmdarray);
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
InputStream in = process.getInputStream();
while (true) {
int r = in.read(buffer);
if (r <= 0) {
break;
}
System.out.write(buffer, 0, r);
}
return process.waitFor();
}
public static void main(String[] args) {
try {
Runtime.getRuntime().exec("c:/");
List<String> cmdarray = new ArrayList<String>();
cmdarray.add(getJreExecutable().toString());
cmdarray.add("-version");
int retValue = launch(cmdarray);
if (retValue != 0) {
System.err.println("Error code " + retValue);
}
System.out.println("OK");
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
(经测试的Windows XP,Sun JRE 1.6; Ubuntu 8.04,OpenJDK JRE 1.6)
这相当于运行:
java -version
Run Code Online (Sandbox Code Playgroud)
在尝试查找可执行文件时,您可能还需要查看"java.library.path"系统属性(和"path.separator").
只从 java 程序中调用 main 怎么样?
测试.main(null);
这对我来说效果很好
归档时间: |
|
查看次数: |
58992 次 |
最近记录: |