1. 程式人生 > >Maven打包成Jar檔案時依賴包的問題

Maven打包成Jar檔案時依賴包的問題

我們專案中使用到第三方的庫檔案,這些jar庫檔案並沒有放到Maven中央庫上,導致我們需要在專案中自己配置使用。我們的兩三個開發人員對Java都是很熟,因此在使用中遇到了一些問題,表現在:在本地中引入第三方jar包後,在Idea中進行相應設定後,可以除錯運行了,但是用Docker打包上傳到伺服器後,執行時會提示找不到某些類的定義。

經檢視這些找不到的類就是來自第三方庫,那麼問題有可能是第三方jar包的路徑問題,或者是根本就沒有打包進jar檔案裡面。我們可以去Docker容器內部檢視jar檔案,執行命令:jar tf xxx.jar|grep lib,其中xxx.jar是打包後生成的檔名稱。這個命令打印出jar檔案中lib目錄下的所有檔案,從這裡我們可以看到,確實沒有包含第三方的jar檔案。

在網上找了一陣子,各種說法五花八門,然而都不能解決問題,比如這裡有一篇:3-ways-to-add-local-jar-to-maven-project,看著貌似能解決問題,但使用後還是無法解決。比如將第三方jar包安裝到本地Maven,這種方式是可以解決本地編譯的問題,但我們還得去編譯伺服器上再安裝一遍,而且要指定groupId,artifactId等東西,感覺蠻麻煩。我們只想在編譯打包時,把我們的lib資料夾的檔案都拷貝到jar檔案的lib目錄下。有什麼辦法呀?

Maven中有各種plugin,也就是外掛,有人推薦用assembly外掛,比如這樣寫:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>

    <configuration>
        <descriptorRefs>
         <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>

我們以為這樣就能把所有依賴包放進最終的jar檔案中了,可惜試了之後還是不行,其它類似方法也試了都不行。後面想想,是不是要把lib資料夾放到resource目錄下。試了之後,發現這回倒是拷貝進jar檔案了,但是放置的位置是BOOT-INF/classes/lib裡面,而其他的庫檔案則放到BOOT-INF/lib裡面,這樣執行時會不會找不到那些第三方jar檔案呢?我們沒有驗證,然後在這裡找到一篇文章,解決了拷貝lib目錄檔案到BOOT-INF/lib的問題,配置如下:

<resources>

      <resource>

        <directory>src/lib</directory>

        <targetPath>BOOT-INF/lib/</targetPath>

        <includes>

          <include>**/*.jar</include>

        </includes>

      </resource>

      <resource>

        <directory>src/main/resources</directory>

        <targetPath>BOOT-INF/classes/</targetPath>

      </resource>

    </resources>

這樣之後,所有的依賴包都放到BOOT-INF/lib目錄下了,程式也可以正常運行了。

以為到這裡能加雞腿了,結果來個更大的坑。第三方庫裡面有讀取檔案的介面,我們在使用介面時,傳入了一個配置相關的檔案的路徑,我們是在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.

這個問題是因為程式去讀取檔案時,是去檔案系統裡面找檔案,而不是從jar裡面找,人家是建議使用getInputStream而不是getFile。可是讀取檔案的功能是第三方庫實現的,我們沒法改動讀取檔案的方式。那怎麼辦?老老實實在Dockerfile檔案加個拷貝操作唄,把配置檔案放到檔案系統相應目錄下即可。

總結一下,這個問題的原因還在於,我們對官方Maven文件不熟,沒有研究過各種配置,對Jar檔案的組織結構和執行原理不太清楚,因為我們幾個Java方面的經驗都不夠多,踩過的坑還太少,同時也不得不感嘆,Java開發裡面的各種配置,也真是眼花繚亂啊,即便我們也使用了Spring Boot這種簡化了配置的開發框架。

 

文章來源:技術人成長

 

歡迎關注公眾號:

相關推薦

Maven打包Jar檔案依賴的問題

我們專案中使用到第三方的庫檔案,這些jar庫檔案並沒有放到Maven中央庫上,導致我們需要在專案中自己配置使用。我們的兩三個開發人員對Java都是很熟,因此在使用中遇到了一些問題,表現在:在本地中引入第三方jar包後,在Idea中進行相應設定後,可以除錯運行了,但是用Docker打包上傳到伺服器後,執行時會提

maven打包jar,上傳到伺服器

  1.builderPath -> maven build 刪除jre,匯入jdk環境 2.maven builder 生成jar包,需要從最基礎的依賴專案一層一層的打包,不能一起打包,打包後的檔案為jar包,在property點開目錄專案裡的target中。 &nbs

Eclipse將引用了第三方jar的Java專案打包jar檔案的兩種方法

方案一:用Eclipse自帶的Export功能 步驟1:準備主清單檔案 “MANIFEST.MF”, 由於是打包引用了第三方jar包的Java專案,故需要自定義配置檔案MANIFEST.MF,在該專案下建立檔案MANIFEST.MF,內容如下: Manifest-Version: 1.0 Clas

Java程式打包jar檔案(並使用bat格式的檔執行jar

把Java程式打包成jar檔案,並使用bat格式的檔執行jar包。 1.     首先建立一個格式為.MF的檔:如TEST.MF。 在配置檔案中需做如下配置: Manifest-Version: 1.0 (設定版本號) Class-Path: . Test01_lib/co

關於在做Java專案的時候如何把第三方的jar一起打包jar檔案

步驟1:準備主清單檔案 “MANIFEST.MF”, 由於是打包引用了第三方jar包的Java專案,故需要自定義配置檔案MANIFEST.MF,在該專案下建立檔案MANIFEST.MF,內容如下:

maven打包jar, 包括依賴其他的jar

   maven打包的時候不會自動把依賴的專案打成jar放在專案中,如果需把管理的jar放在target/lib目錄下,可以在pom.xml新增: <plugin> <groupId>org.apache.maven.

maven打包jar,並排除指定文件

pat addclass fig ani logs archive exc arc mave maven打包成jar,配置如下 <plugin> <groupId>org.apache.maven.plugins

springboot打包jar檔案無法正常執行,解決辦法已經找到

1.pom.xml 指向啟動頁 <!-- 打包包名 -->     <build>         <finalName>bigData</finalName&

CXF生成客戶端程式碼並打包jar檔案

最近其他部門提供了WebService介面,本地開發使用的是Java,現在選擇使用根據WSDL文件打成Jar包的方式來處理,在此記錄一下命令 CXF工具請百度自行安裝 CXF生成客戶端程式碼並打包成jar檔案: wsdl2java -frontend jaxws21 -encoding ut

Pyinstaller打包exe檔案,報錯:Cannot find existing PyQt5 plugin directories

如下圖所示:在用PyInstaller將.py檔案打包成exe檔案時出現下面的錯誤: 解決辦法: 根據Paths checked後面的路徑建立資料夾,把Anaconda下的qt資料夾裡的plugins資料夾下的所有檔案複製到新建的資料夾裡,我的電腦上對應的位置是:E:\Anac

打包jar檔案後執行出現Invalid or corrupt jarfile 解決

Invalid or corrupt jarfile /home/WebService.jar Failed to load Main-Class manifest attribute fro

Java專案打包jar檔案的兩種方法

* Export generated class files and resources 表示只匯出生成的.class檔案和其他資原始檔 * Export all output folders for checked projects 表示匯出選中專案的所有資料夾 * Export java source f

eclipse如何把java程式碼,打包jar檔案以及轉換為exe可執行檔案

1、背景:     學習java時,教材中關於如題問題,只有一小節說明,而且要自己寫麻煩的配置檔案,最終結果卻只能轉換為jar檔案。實在是心有不爽。此篇部落格教你如何方便快捷地把java程式碼,打包成jar檔案以及轉換為exe可執行檔案 2、前言:     我們都知道

eclipse -- 手把手教你如何把java程式碼,打包jar檔案以及轉換為exe可執行檔案

1、背景:     學習java時,教材中關於如題問題,只有一小節說明,而且要自己寫麻煩的配置檔案,最終結果卻只能轉換為jar檔案。實在是心有不爽。此篇部落格教你如何方便快捷地把java程式碼,打包成jar檔案以及轉換為exe可執行檔案 2、前言:     我們都知道Java可以將二進位制程式打包成可執

得到.java檔案的.class檔案、將目錄打包jar檔案

1.將.java檔案轉換成.class檔案 對於數量較少的檔案可以按以下步驟: 第一步:在開始選單,搜尋框中輸入“cmd”,進入黑口; 第二步:切換到java檔案的存放路徑; 第三步:輸入"javac   檔名.java",即可將java檔案編譯為class檔案。 備註:

將java專案打包jar檔案

方法一、用MyEclipse打jar 1、在Myclispe的工作區,右擊選擇Export 2、在出現的Export對話方塊中選擇 Java=》JAR file 3、填入jar檔名稱即可

MyEclipse將Java專案打包jar檔案

2、假設我們的專案打包後為KillCheatFans.jar,那麼按照上面的定義,應該在 KillCheatFans.jar的同層目錄下建立一個lib資料夾(即lib檔案和打包的jar檔案 在同一個目錄下),並將相關的jar包放在裡面。否則將會出現“Exception in thread "main" jav

Android Studio 打包jar檔案並混淆程式碼

參考博文:http://www.jianshu.com/p/0a3ce6e9ab85 開展專案合作時,基於模組化思想,對方要用到你的程式,而你又不想將原始碼給對方,通常會將程式進行打包生成jar,並作混淆處理。 1、建立專案 【File】——【New Module】——【A

把java專案打包jar檔案方法

1.先寫好需要打包成jar的java方法 2.右鍵單擊專案,選擇Export 3.在Export視窗中,選擇java-->JAR file,點選"Next"按鈕 4.在JAR Expor

Eclipse打包jar檔案的兩種方法

本文系轉載:http://www.cnblogs.com/lanxuezaipiao/p/3291641.html 方案一:用Eclipse自帶的Export功能 步驟1:準備主清單檔案 “MANIFEST.MF”, 由於是打包引用了第三方jar包的Java專案,