1 Runtime函数解决调用jar包问题
在Springboot搭建的后台项目中想要调用外部jar包,该jar包拥有一个外部的ini格式文件,两者同时存在才能使用java -jar ***.jar 启动jar包。
最开始将此jar包放在了另一个盘,通过Runtime.getRuntime().exec()成功启动,但是都在e盘下存在问题,jar包不能成功执行。
@Controller
public class JarController {
public static void main(String[] args) throws Exception {
//String cmd = "cmd /c f: & cd 文件夹 & java -jar jar包名.jar";
// String cmd = "cmd.exe /c f: & cd 文件夹 & java -jar jar包名.jar";
try {
// String[] cmd = new String[]{"cmd","/c","f:"+"&"+"cd 文件夹"+"&"+"java -jar jar包名.jar"};
String[] cmd = new String[]{"cmd","/c","e:/文件夹路径"+"&"+"java -jar jar包名.jar"};
Runtime.getRuntime().exec(cmd,null,new File("e:\\文件夹路径\\文件夹路径"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
通过该代码解决。
9/24更新
2 集成exe
2.1 问题
在已有的项目基础上需要集成第三方应用,即调用exe文件,有了上述调用jar包的基础后,原本打算继续使用Runtime.getRuntime().exec()解决,但是想查找是否有其他调用方法,所以找到了ProcessBuilder,也是java.lang中的类。据查找到的资料显示Runtime.getRuntime().exec()执行中也是调用ProcessBuilder,使用PB比Runtime更方便一些【也可能是成功执行了前者有了经验。】
因为有多个应用需要使用与cmd交互的方式访问,所以写成了公共函数。
下面代码参考另一篇文章,但是找不到链接了,后续补上。
public static void ProcessBulid(String[] cmd) {
try {
// ProcessBuilder执行cmd指令,调用jar、exe
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command(cmd);
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
BufferedInputStream in = new BufferedInputStream(process.getInputStream());
BufferedReader inbuf = new BufferedReader(new InputStreamReader(in,"gbk"));
String returnline;
while((returnline = inbuf.readLine())!= null)
System.out.println(returnline);
if(process.waitFor() != 0){
if (process.exitValue() == 1)
System.err.println("命令执行失败!");
}
inbuf.close();
in.close();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
接口部分
@RequestMapping("/app/Shell")
public void Xshell(){
//获取xhsell.exe所在目录
String gen = BaseFunction.mulu();
String[] cmd = new String[]{"cmd","/c","cd"+" "+gen+"/xmanager & Xshell"};
BaseFunction.ProcessBulid(cmd);
}