Java 运行 来自另一个带有传递参数的 jar 的 jar
Java run jar from another jar with passing arguments
我生成了run1.jar:
package runner;
import java.io.IOException;
import java.io.PrintWriter;
public class Run1 {
public static void main(String[] args) {
int i = Integer.parseInt(args[0]);
System.out.println(i);
try {
PrintWriter writer = new PrintWriter("1.txt", "UTF-8");
writer.println(i);
writer.println(i);
writer.close();
} catch (IOException e) {
// do something
}
}
}
我还生成了 run2.jar:
package runner;
import java.io.File;
import java.io.IOException;
public class Run2 {
public static void main(String[] args) throws IOException, InterruptedException {
ProcessBuilder pb = new ProcessBuilder("java", "-jar", "C:\test2\run1.jar", "1");
pb.directory(new File("C:\"));
try {
Process p = pb.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我有 运行 这个命令 java -jar run2.jar 1 并运行它。
预期结果是 运行 这个命令:java -jar run2.jar 谁不工作。
我如何 运行 run2.jar 从 run2.jar 中的 main 方法内部传递参数?
错误是:
C:\test2>java -jar run2.jar
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoa
der.java:58)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0
at runner.Run1.main(Run1.java:9)
我在您的问题中添加的错误与缺少参数有关:args[0]
,第 9 行抛出 ArrayIndexOutOfBoundsException
。
参数“1”未传递给 run1.jar
异常堆栈显示了 jar-in-jar 加载器的用法,为什么?
使用 Oracle 命令行实用程序或 ANT 构建 jar,然后再次测试。
我们在这里,下面是两个不同的例子,可以回答您的问题
Process proc = Runtime.getRuntime().exec("java -jar C:\...\Run1.jar 1");
proc.waitFor();
//2 inputstream for the result and for the errors in subprogram
InputStream in = proc.getInputStream();
InputStream err = proc.getErrorStream();
byte b[]=new byte[in.available()];
in.read(b,0,b.length);
System.out.println(new String(b));
byte c[]=new byte[err.available()];
err.read(c,0,c.length);
System.out.println(new String(c));
ProcessBuilder pb = new ProcessBuilder("java", "-jar", "C:\...\Run1.jar", "1");
Process proc2 = pb.start();
proc2.waitFor();
InputStream in2 = proc2.getInputStream();
InputStream err2 = proc2.getErrorStream();
byte b2[]=new byte[in.available()];
in.read(b,0,b.length);
System.out.println(new String(b));
byte c2[]=new byte[err.available()];
err.read(c,0,c.length);
System.out.println(new String(c));
来自 IDE (Eclipse) 的输出
命令行输出:
注意: "ok" 是我的 System.out.println 我输入 Run1.jar (我用大写字母保存文件 jar,但是你可以使用你自己的名字)
我生成了run1.jar:
package runner;
import java.io.IOException;
import java.io.PrintWriter;
public class Run1 {
public static void main(String[] args) {
int i = Integer.parseInt(args[0]);
System.out.println(i);
try {
PrintWriter writer = new PrintWriter("1.txt", "UTF-8");
writer.println(i);
writer.println(i);
writer.close();
} catch (IOException e) {
// do something
}
}
}
我还生成了 run2.jar:
package runner;
import java.io.File;
import java.io.IOException;
public class Run2 {
public static void main(String[] args) throws IOException, InterruptedException {
ProcessBuilder pb = new ProcessBuilder("java", "-jar", "C:\test2\run1.jar", "1");
pb.directory(new File("C:\"));
try {
Process p = pb.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我有 运行 这个命令 java -jar run2.jar 1 并运行它。 预期结果是 运行 这个命令:java -jar run2.jar 谁不工作。
我如何 运行 run2.jar 从 run2.jar 中的 main 方法内部传递参数?
错误是:
C:\test2>java -jar run2.jar
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoa
der.java:58)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0
at runner.Run1.main(Run1.java:9)
我在您的问题中添加的错误与缺少参数有关:args[0]
,第 9 行抛出 ArrayIndexOutOfBoundsException
。
参数“1”未传递给 run1.jar
异常堆栈显示了 jar-in-jar 加载器的用法,为什么?
使用 Oracle 命令行实用程序或 ANT 构建 jar,然后再次测试。
我们在这里,下面是两个不同的例子,可以回答您的问题
Process proc = Runtime.getRuntime().exec("java -jar C:\...\Run1.jar 1");
proc.waitFor();
//2 inputstream for the result and for the errors in subprogram
InputStream in = proc.getInputStream();
InputStream err = proc.getErrorStream();
byte b[]=new byte[in.available()];
in.read(b,0,b.length);
System.out.println(new String(b));
byte c[]=new byte[err.available()];
err.read(c,0,c.length);
System.out.println(new String(c));
ProcessBuilder pb = new ProcessBuilder("java", "-jar", "C:\...\Run1.jar", "1");
Process proc2 = pb.start();
proc2.waitFor();
InputStream in2 = proc2.getInputStream();
InputStream err2 = proc2.getErrorStream();
byte b2[]=new byte[in.available()];
in.read(b,0,b.length);
System.out.println(new String(b));
byte c2[]=new byte[err.available()];
err.read(c,0,c.length);
System.out.println(new String(c));
来自 IDE (Eclipse) 的输出
命令行输出:
注意: "ok" 是我的 System.out.println 我输入 Run1.jar (我用大写字母保存文件 jar,但是你可以使用你自己的名字)