[英]How to run a .jar file from inside another java program?
我有一个.jar文件,可以在命令行上运行:
java -jar myFile.jar argument1
我想将此.jar的输出另存为另一个Java程序中的String变量。
我该怎么做?
我尝试在程序中包含myFile.jar作为引用,并在程序中执行myFile.main(new String{"argument1"})
。 但这只是将结果打印到控制台,我无法在程序中使用结果。
希望这不会太令人困惑。
一世
运行Jar文件要求您将jar文件包含在类路径中。 这可以在运行时使用URLClassLoader
。 只需使用jar作为URL之一来构造URLClassLoader
。 如果知道类名(当然是全名forClass(...)
则调用它的forClass(...)
)。 或使用清单文件的“ findResources(String name)”检查清单文件。
一旦获得了类,就可以使用反射来获取其静态方法main
。
再次看到您的问题,您就知道了类名,因此,如果确定jar文件已经在类路径中,则可以在尝试时调用它。
II
要捕获输出,可以调用System.setOut(PrintStream out)
和System.setErrPrintStream out)
更改打印流。 您可以传递您创建的打印流。 像这样:
ByteArrayOutputStream BAOS = new ByteArrayOutputStream();
PrintStream MyOut = new PrintStream(BAOS);
System.setOut(MyOut);
// Do something to have something printed out.
...
String TheCaptured = new String(BAOS.toByteArray());
希望这可以帮助。
看一下ProcessBuilder:
http://java.sun.com/javase/6/docs/api/java/lang/ProcessBuilder.html
它有效地创建了一个操作系统进程,然后您可以使用以下命令捕获输出:
process.getInputStream()
。
该行:
processbuilder.redirectErrorStream(true)
在以下示例中,将合并输出流和错误流:
例如
public class ProcessBuilderExample {
public ProcessBuilderExample() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) throws IOException, InterruptedException {
ProcessBuilder pb = new ProcessBuilder("java", "-jar", "gscale.jar");
pb.redirectErrorStream(true);
pb.directory(new File("F:\\Documents and Settings\\Administrator\\Desktop"));
System.out.println("Directory: " + pb.directory().getAbsolutePath());
Process p = pb.start();
InputStream is = p.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
for (String line = br.readLine(); line != null; line = br.readLine()) {
System.out.println( line ); // Or just ignore it
}
p.waitFor();
}
}
如果您不能包括另一个罐子,
你可以用这样的东西
Runtime re = Runtime.getRuntime();
BufferedReader output;
try{
cmd = re.exec("java -jar MyFile.jar" + argument);
output = new BufferedReader(new InputStreamReader(cmd.getInputStream()));
} catch (IOException ioe){
ioe.printStackTrace();
}
String resultOutput = output.readLine();
我知道我的代码并不像捕获的异常那样完美,但是我认为这可以为您提供一个好主意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.