我有一个spring boot项目,并在其中创建了一个jar,然后通过传递参数从另一个项目中调用此jar。
无法获得输出并且卡住了。
下面是我从中得到一个罐子的项目。
public class Demo1Application {
public static void main(String[] args) {
System.out.println("jar called");
for(String arg : args) {
System.out.println("next argument is"+ arg );
}
SpringApplication.run(Demo1Application.class, args);
}
}
它是一个简单的spring boot主类。
下面是另一个我想通过传递参数来调用此jar的项目的类。
public class AAAAAAAAAAAAAAAAA {
public static void main(String[] args) throws IOException, InterruptedException {
File jarFile = new File("D:\\NewConfigWorkSpace\\Demo1\\target\\Demo1-0.0.1-SNAPSHOT.jar");
Process p = Runtime.getRuntime().exec("java -jar D:\\NewConfigWorkSpace\\Demo1\\target\\Demo1-0.0.1-SNAPSHOT.jar bisnu mohan");
p.waitFor();
System.out.println("finished");
}
}
当我调用jar时如何查看控制台,如何跟踪发生了多少执行。
答案 0 :(得分:0)
您需要的是创建过程的输入流。这是运行应用程序时通常返回到控制台的内容。
Process p = Runtime.getRuntime().exec("java -jar D:\\NewConfigWorkSpace\\Demo1\\target\\Demo1-0.0.1-SNAPSHOT.jar bisnu mohan");
InputStream inputStream = p.getInputStream();
然后您可以阅读其中的内容并打印到正在运行的进程的控制台,如下所示:
StringBuilder outputLines = new StringBuilder();
String output;
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, UTF_8))) {
String line;
while ((line = reader.readLine()) != null) {
logger.info("Command execution output: " + line);
outputLines.append(line).append("\n");
}
} finally {
output = outputLines.toString().trim();
}
以同样的方式处理错误流也是一个好主意,因为这样您就可以查看子进程是否返回了一些错误。
InputStream errorStream = p.getErrorStream();
在单独的线程中使用此流处理,这样它们就不会彼此阻塞。
答案 1 :(得分:0)
从我的角度来看,您不需要通过命令行执行JAR。
如果将JAR包含到您的项目中,则可以从JAR导入SpringApplication
并像这样直接运行它:
public class AAAAAAAAAAAAAAAAA {
public static void main(String[] args) throws IOException, InterruptedException {
SpringApplication.run(Demo1Application.class, args);
}
}