1. 程式人生 > 其它 >java專案動態載入外部jar,呼叫其中類方法

java專案動態載入外部jar,呼叫其中類方法

一,背景

專案需要通過載入外部jar檔案更新某項功能

1,這是ServiceImpl中的方法摘取,

處理業務:

簡單點來說就是:接收前端上傳的jar檔案和請求資料,通過呼叫上傳的jar檔案中的類方法對請求資料做處理(實現動態載入)

/**
     * 這是ServiceImpl中的方法摘取
     *
     * @param abilityContributionStructDataReq 請求資料
     * @param file jar檔案
     * @return
     * @Author zl
     */
    @Override
    public Double dynamicLoad(String abilityContributionStructDataReq, MultipartFile file) throws
IOException { //上傳檔案不能為空 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:





    心有所想,必有迴響