我們知道,Maven 是通過倉庫對依賴進行管理的,當 Maven 項目需要某個依賴時,隻要其 POM 中聲明了依賴的坐标資訊,Maven 就會自動從倉庫中去下載下傳該構件使用。但在實際的開發過程中,經常會遇到一種情況:對接第三方廠商,人家給了一個jar包,然後項目需要使用這個jar包,但是這個jar包并沒有上傳到遠端倉庫,這時候就不能使用簡單的pom依賴引用了,是以存在兩個問題:
- 如何将jar引用到項目,并且能夠讓項目正常調用該jar包的方法
- 外部引用的jar如何打包進項目?
當然公司如果是有私服的,可以直接将jar包上傳到私服。然後直接通過pom依賴簡單的聲明即可。
是以本篇文章重點針對于這兩點進行講解
目錄
如下是個maven項目,java-demo.jar是我們要引入的jar包。
<!--外部依賴-->
<dependency>
<groupId>com.gzl.cn</groupId>
<artifactId>java-demo</artifactId>
<!--依賴範圍-->
<scope>system</scope>
<version>1.0-SNAPSHOT</version>
<!--依賴所在位置-->
<systemPath>${project.basedir}/src/main/resources/lib/java-demo.jar</systemPath>
</dependency>
在以上配置中,除了依賴的坐标資訊外,外部依賴還使用了 scope 和 systemPath 兩個元素。
- scope 表示依賴範圍,這裡取值必須是 system,即系統。
- systemPath 表示依賴的本地構件的位置。
打包插件:<includeSystemScope>true</includeSystemScope> 這個非常重要,是将外部依賴打包進來的,如果沒有該配置,打出來的jar包是不包含外部jar包的,進而可能會導緻運作異常!
<build>
<!-- 打出來的jar包名 -->
<finalName>maven-demo</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<!-- 主啟動類全類名 -->
<mainClass>com.gzl.cn.App</mainClass>
<!-- 這個配置很重要,是将外部依賴打包進來的,如果沒有該配置,打出來的jar包是不包含外部jar包的 -->
<includeSystemScope>true</includeSystemScope>
</configuration>
<executions>
<execution>
<!--自定義 id -->
<id>repackage</id>
<!--插件目标 -->
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
但是現在存在一個問題,打出來的jar包可以用,但是特别大。
如下是jar包解壓後的目錄:
我們可以将jar解壓會發現BOOT-INF的lib目錄下是有一個第三方引用的jar。
然後在BOOT-INF的classes/lib目錄下也有個這個jar包,這個是源碼當中的jar包,上面的是打出來的jar包運作的時候所要依賴的jar包。正常來說我們就可以将源碼當中的jar包給去掉,這樣就可以減小jar包的大小。
添加如下依賴,排除jar的打包
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>**/lib/**</exclude>
</excludes>
</resource>
</resources>
...以下省略
</build>
重新進行打包後會然後将jar解壓觀察源代碼當中已經沒有lib目錄了。
java -jar 依然是可以運作起來的