pom裏引入lib下的包後編譯報 package com.sun.crypto.provider does not exist問題解決

最近正在迭代開發的一個項目編譯安裝時出現報「package com.sun.crypto.provider does not exist」的錯誤,因爲本人能力水平有限,也是第一次遇到該問題,來來回回折騰了小半天才解決,故記錄下,避免下次再作無用功。java

 

環境:jdk1.七、maven 3.3.0、spring MVC、git、gerrit、sonar等git

現象:IDEA裏代碼沒有報錯,可是在項目目錄下執行mvn install就會報錯,提示「package com.sun.crypto.provider does not exist」github

問題出現過程:本項目以前爲eclipse+svn項目,已穩定運行一年有餘,沒有問題,最近遷移到git+gerrit+sonar代碼檢查 環境。代碼遷移新環境後,sonar檢查報100多個bug,因爲出現bug的代碼不是本人寫的,是同事在網上找的一個開源的方案來修改的,代碼檢查bug不少沒法入庫web

開源代碼地址:https://github.com/haifengl/smile

在此吐槽下這個開源代碼,sonar顯示110多個bug,大部分都是除數可能爲0的問題,甚至還有10幾處代碼寫死爲 double a = xxxx/0.0的代碼塊,並且衆多使用該方案的朋友都沒有提出問題,整個方案几十上百個類,我看過sonar報錯的類,幾乎都沒有看到有try...catch異常處理的邏輯,不解,爲什麼代碼能正常運行
View Code

 

改了60多個bug,後來擔憂改動多多少少會影響到程序邏輯,既然以前都能運行,乾脆就不應,改用將該部分代碼打包爲jar,引入到工程裏,以避開sonar檢查的方案。步驟以下:spring

  一、在idea的當前項目下新建一個modual,取名smile(開源代碼的包名),將smile相關的代碼整個目錄複製到該工程中,解決相關的依賴報錯等問題後,將該module編譯爲jar包(具體過程能夠百度,有須要後面再單獨描述)apache

  二、將smile.jar放入當前項目的lib文件夾下app

  三、在工程中使用add to buid path(eclipse,idea爲再Project Structure裏添加libraries)方式引入(問題出在這裏,應該使用pom添加依賴引入)eclipse

 至此成功將smile打成jar包並引入工程。idea不報錯,代碼沒有飄紅。而後編譯代碼打包,報錯說smile包的相關代碼符號不存在,通過百度後,在pom中編譯插件配置裏添加以下配置(這也是網上大部分朋友對該問題給出的解決辦法)webapp

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.6.0</version>
    <configuration>
          <source>1.7</source>
          <target>1.7</target>
          <encoding>UTF-8</encoding>
          <compilerArguments>
               <extdirs>${project.basedir}/src/main/webapp/WEB-INF/lib</extdirs>
          </compilerArguments>
     </configuration>
</plugin>

  再次編譯,smile包的問題解決,可是又出現報錯「 package com.sun.crypto.provider does not exist」,由於有個DesUtils的工具類用到了com.sun.crypto.provider裏的代碼。maven

再次百度,常見的結果以下:

  

程序包com.sun.crypto.provider不存在的錯誤 - howard789的博客 - CSDN博客  https://blog.csdn.net/howard789/article/details/80040430

mavne工程運行報錯:軟件包javax.crypto 不存在解決辦法 - wangliutao1的專欄 - CSDN博客  https://blog.csdn.net/wangliutao1/article/details/53997357

maven install 時提示「程序包 javax.crypto不存在」 - weixin_34043301的博客 - CSDN博客  https://blog.csdn.net/weixin_34043301/article/details/86228858 ....

但都和個人狀況有些差異,第一個朋友表示是jdk版本問題,可是個人jdk原本就是1.7的,且在代碼裏這個報錯的包是存在的,代碼也沒有飄紅,點擊也能夠導航。

按照第二個朋友的方式設置添加bootclasspath配置,可行,但上傳到git後,sonar檢查不過(提示不能寫死路徑,不便於協同開發),不容許這種寫法。

  

結果:

  通過反覆試驗,發現,(在我此次的環境下,其餘人不必定)只要添加了"<extdirs>${project.basedir}/src/main/webapp/WEB-INF/lib</extdirs>"這個配置,就會報這個錯。去掉後報smile包找不到。但smile包找不到是由於我使用的add to build path方式引入,致使只是在開發工具中有效,mvn編譯時實際上是沒有引入該包的。

最終辦法,將smile包加入到依賴中,去掉extdirs的配置。這樣兩個問題都不報了。

 

總結: 問題都是因爲本身對maven的經驗不足,maven的原理不夠理解。致使本身走了半天的冤枉路。

遺留問題:smile包使用本地systemPath方式在pom裏添加的依賴,仍然過不了sonar的檢查,須要將smile包加入到maven倉庫中。

相關文章
相關標籤/搜索