maven 打包指定依赖包_Maven打包成Jar文件时依赖包的问题
我們項目中使用到第三方的庫文件,這些jar庫文件并沒有放到Maven中央庫上,導致我們需要在項目中自己配置使用。我們的兩三個開發(fā)人員對Java都是很熟,因此在使用中遇到了一些問題,表現(xiàn)在:在本地中引入第三方j(luò)ar包后,在Idea中進行相應(yīng)設(shè)置后,可以調(diào)試運行了,但是用Docker打包上傳到服務(wù)器后,運行時會提示找不到某些類的定義。
經(jīng)查看這些找不到的類就是來自第三方庫,那么問題有可能是第三方j(luò)ar包的路徑問題,或者是根本就沒有打包進jar文件里面。我們可以去Docker容器內(nèi)部查看jar文件,執(zhí)行命令:jar tf xxx.jar|grep lib,其中xxx.jar是打包后生成的文件名稱。這個命令打印出jar文件中l(wèi)ib目錄下的所有文件,從這里我們可以看到,確實沒有包含第三方的jar文件。
在網(wǎng)上找了一陣子,各種說法五花八門,然而都不能解決問題,比如這里有一篇:3-ways-to-add-local-jar-to-maven-project,看著貌似能解決問題,但使用后還是無法解決。比如將第三方j(luò)ar包安裝到本地Maven,這種方式是可以解決本地編譯的問題,但我們還得去編譯服務(wù)器上再安裝一遍,而且要指定groupId,artifactId等東西,感覺蠻麻煩。我們只想在編譯打包時,把我們的lib文件夾的文件都拷貝到j(luò)ar文件的lib目錄下。有什么辦法呀?
Maven中有各種plugin,也就是插件,有人推薦用assembly插件,比如這樣寫:
maven-assembly-plugin
jar-with-dependencies
我們以為這樣就能把所有依賴包放進最終的jar文件中了,可惜試了之后還是不行,其它類似方法也試了都不行。后面想想,是不是要把lib文件夾放到resource目錄下。試了之后,發(fā)現(xiàn)這回倒是拷貝進jar文件了,但是放置的位置是BOOT-INF/classes/lib里面,而其他的庫文件則放到BOOT-INF/lib里面,這樣運行時會不會找不到那些第三方j(luò)ar文件呢?我們沒有驗證,然后在這里找到一篇文章,解決了拷貝lib目錄文件到BOOT-INF/lib的問題,配置如下:
src/lib
BOOT-INF/lib/
**/*.jar
src/main/resources
BOOT-INF/classes/
這樣之后,所有的依賴包都放到BOOT-INF/lib目錄下了,程序也可以正常運行了。
以為到這里能加雞腿了,結(jié)果來個更大的坑。第三方庫里面有讀取文件的接口,我們在使用接口時,傳入了一個配置相關(guān)的文件的路徑,我們是在resources目錄下新建了個目錄來存放這個配置文件的。運行時異常:
java.io.FileNotFoundException:
class path resource [aaa/xxx.conf] cannot be resolved to absolute file path because it does not reside in the file system.
這個問題是因為程序去讀取文件時,是去文件系統(tǒng)里面找文件,而不是從jar里面找,人家是建議使用getInputStream而不是getFile。可是讀取文件的功能是第三方庫實現(xiàn)的,我們沒法改動讀取文件的方式。那怎么辦?老老實實在Dockerfile文件加個拷貝操作唄,把配置文件放到文件系統(tǒng)相應(yīng)目錄下即可。
總結(jié)一下,這個問題的原因還在于,我們對官方Maven文檔不熟,沒有研究過各種配置,對Jar文件的組織結(jié)構(gòu)和運行原理不太清楚,因為我們幾個Java方面的經(jīng)驗都不夠多,踩過的坑還太少,同時也不得不感嘆,Java開發(fā)里面的各種配置,也真是眼花繚亂啊,即便我們也使用了Spring Boot這種簡化了配置的開發(fā)框架。
文章來源:技術(shù)人成長
歡迎關(guān)注公眾號:
總結(jié)
以上是生活随笔為你收集整理的maven 打包指定依赖包_Maven打包成Jar文件时依赖包的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tomcat启动占了12g_tomcat
- 下一篇: 手机 java服务器ip地址_java获