問題:在作項目時,遇到jar版本衝突的問題,而且老代碼依賴不能用新jar包代替,要保證功能不變需要保證兩個jar都能使用java
思路:使用runtime 的exec 方式另啓線程運行,而後返回結果linux
解決:windows
1):建立可運行的jar包,並建立入口main方法,方法實現新功能的調用與結果或異常的返回併發
public static void main(String[] args) { try { //接收參數 String privateKeyPath = args [0]; /* 業務邏輯 */ System.out.println("ok" ); System.out.println(業務邏輯有返回結果,若是有 ); } catch (Exception e ) { System.out.println("error" ); System.out.println(e); }
2):在項目新建立調用方法,本例使用windows 環境jvm
Runtime r = Runtime.getRuntime(); try{ //new String[]{"/bin/sh","-c","ln -s exe1 exe2"}) linux下的命令 Process proc = r .exec(new String[]{"cmd" ,"/c" ,"java -jar citicbankclient.jar gbz"}); BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream(), "gbk" )); String line = null ; while ((line = reader.readLine()) != null){ //接收system.out輸出 System. out.println(line); } int exitVal = proc.waitFor(); //調用是否成功 System. out.println(exitVal == 0 ? "ok" : "error" ); } catch(Exception e ){ e.printStackTrace(); }
注意:這種方式是把新功能另啓jvm來完成jar包隔離的,在高併發狀況下會啓動多個jvm,若是jvm不能很快的執行完,會消耗大量內存及cpu資源,高併發
解決這個問題只能控制併發量spa