java專案動態載入外部jar,呼叫其中類方法
阿新 • • 發佈:2021-12-30
一,背景
專案需要通過載入外部jar檔案更新某項功能
1,這是ServiceImpl中的方法摘取,
處理業務:
簡單點來說就是:接收前端上傳的jar檔案和請求資料,通過呼叫上傳的jar檔案中的類方法對請求資料做處理(實現動態載入)
/** * 這是ServiceImpl中的方法摘取 * * @param abilityContributionStructDataReq 請求資料 * @param file jar檔案 * @return * @Author zl */ @Override public Double dynamicLoad(String abilityContributionStructDataReq, MultipartFile file) throwsIOException { //上傳檔案不能為空 if (file == null) { throw new CustomException("動態計算lib庫不能為空"); } //這就是一個封裝的檔案上傳返回檔案路徑的方法 String textUrl = FileUtil.uploadText(file); //jar檔案 File fileJar = new File(textUrl); URLClassLoader urlClassLoader= null; Class<?> mytest = null; String substring = null; if (file.getOriginalFilename() != null) { substring = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.') + 1); } //jar包校驗 if (!"jar".equals(substring)) {throw new CustomException("只能上傳“.jar”檔案"); } try { //通過URLClassLoader載入外部jar urlClassLoader = new URLClassLoader(new URL[]{new URL("file:" + fileJar.getAbsolutePath())}); //獲取外部jar裡面的具體類物件 mytest = urlClassLoader.loadClass("jsyc.CalculateAbilityContribution"); //建立物件例項 Object instance = mytest.newInstance(); //獲取例項當中的方法名為calculate,引數只有一個且型別為String的public方法 Method method = mytest.getMethod("calculate", String.class); //傳入例項以及方法引數資訊執行這個方法 String ada = (String) method.invoke(instance, abilityContributionStructDataReq); TechOneAbilityContributionInputOutcomeData abilityContributionInputOutcomeData = JSON.parseObject(ada, TechOneAbilityContributionInputOutcomeData.class); coreApi.getInputOutcomeData().getAbilityContributionModuleDataMgr().saveData(abilityContributionInputOutcomeData); System.out.println(ada); return 0.0; } catch (Exception e) { throw new CustomException("計算出錯,請匯入正確動態計算庫"); } finally { //解除安裝關閉外部jar try { urlClassLoader.close(); } catch (IOException e) { System.out.println("關閉外部jar失敗:" + e.getMessage()); } } }
二,一般情況下,我們動態載入的jar可能會引用第三方依賴,這裡存在很多坑
一般情況下,我們動態載入的lib庫的類名和方法,都是通過配置檔案配置,也可以約束死
方法引數和返回值就像前後端介面一樣要約束好
1,我這邊主專案動態載入的jar檔案都是我們自己設計的,我們已經在主專案裡面添加了其相應的依賴,在編譯器中啟動專案操作前端頁面沒有任何問題,但是部署伺服器就拋異常,
我們編寫的jar用到了alibaba的json,找不到異常
2,其實說到底還是編寫jar檔案打包的問題,需要把第三方依賴也打進去
我們現在把java程式碼打包有許多中方式:
1,jar -cvf my.jar jsyc #通過命令列,將資料夾jsyc下面所有的class檔案打成jar包(不包括依賴)
2,通過編譯器,普通maven專案,package打包(也不包含依賴)
3,build artifacts(包含依賴)步驟如下:
打包成功的jar:
心有所想,必有迴響