maven?springboot如何將jar包打包到指定目錄
如何將jar包打包到指定目錄
今天分享一下springboot將jar包打包到指定目錄下。
由于之前上線都是一個(gè)打包到一個(gè)jar,由于服務(wù)多了,1個(gè)包100多M,哪怕是小版本上線都需要重新上傳jar包。
1.目的
將不常用的比如spring,druid等不常用打包到lib目錄,這樣每次上線不需要上傳這些。第三方或者常改動(dòng)的還打包到本身的jar包內(nèi),每次上線都會(huì)新打包。
這樣原來(lái)的100多M的jar包,可以變成2、3M。
如圖所示:
原來(lái)的打包方式
改后的方式:
2.修改pom
簡(jiǎn)單解釋一下,includes標(biāo)簽內(nèi)就是打入jar包第三方j(luò)ar。將上面的2M的包解壓縮后,就是includes的包。
如圖所示。
excludeGroupIds和excludeArtifactIds 是配置不在lib目錄里的包,由于java啟動(dòng)加載的機(jī)制是優(yōu)先加載jar包,再加載外部目錄,如果jar包都存在兩個(gè)地方,這樣配置就沒(méi)有意義了,每次還是得重新發(fā)布lib目錄,所以將includes中的包,再在excludeGroupIds 和 excludeArtifactIds 配置上。
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.0.5.RELEASE</version> <executions> <execution> <goals> <goal>repackage</goal> <goal>build-info</goal> </goals> </execution> </executions> <configuration> <layout>ZIP</layout> <includes> <include> <groupId>nothing</groupId> <artifactId>nothing</artifactId> </include> <include> <groupId>com.etc</groupId> <artifactId>etc-manage-api</artifactId> </include> <include> <groupId>com.etc</groupId> <artifactId>etc-manage-core</artifactId> </include> <include> <groupId>com.etc</groupId> <artifactId>etc-manage-rpc-api</artifactId> </include> <include> <groupId>com.sinoiov.etc.apollo</groupId> <artifactId>apollo-spring-boot-starter</artifactId> </include> </includes> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <excludeGroupIds> com.sinoiov.etc.apollo </excludeGroupIds> <excludeArtifactIds> etc-manage-api,etc-manage-core,etc-manage-rpc-api </excludeArtifactIds> <outputDirectory>${project.build.directory}/lib</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build>
3.修改啟動(dòng)腳本
原腳本
java -jar etc-manage-service-basic-2.2.0.jar
現(xiàn)腳本 (如果相對(duì)目錄不好用,就用絕對(duì)目錄試試)
java Dloader.path=../lib -jar etc-manage-service-basic-2.2.0.jar
jar包外指定配置文件及原理
解決方案
修改maven的pom.xml文件
不拷貝資源文件
<resources> <resource> <directory>src/main/resources</directory> <excludes> <exclude>*</exclude> </excludes> <filtering>true</filtering> </resource> </resources>
修改打包方式
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <layout>ZIP</layout> </configuration> </plugin>
運(yùn)行
假設(shè)application.properties和application-{profile}.properties都在/tmp/temp/config,jar文件在/tmp/temp
java -Dloader.path=file:///tmp/temp/config,demo-1.0.jar -jar demo-1.0.jar
原理
對(duì)比jar包中MANIFEST.MF文件在`ZIP配置前后的區(qū)別
配置前:
Main-Class: org.springframework.boot.loader.JarLauncher Start-Class: com.chinaunicom.gateway.GatewayApplication
配置后:
Main-Class: org.springframework.boot.loader.PropertiesLauncher Start-Class: com.chinaunicom.gateway.GatewayApplication
發(fā)現(xiàn)是類加載器變了,查看org.springframework.boot.loader包下所有加載器實(shí)現(xiàn):
查看五個(gè)類描述:官方文檔
JarLauncher
Launcher for JAR based archives. This launcher assumes that dependency jars are included inside a /BOOT-INF/lib directory and that application classes are included inside a /BOOT-INF/classes directory.
WarLauncher
Launcher for WAR based archives. This launcher for standard WAR archives. Supports dependencies in WEB-INF/lib as well as WEB-INF/lib-provided, classes are loaded from WEB-INF/classes.
PropertiesLauncher
Launcher for archives with user-configured classpath and main class via a properties file. This model is often more flexible and more amenable to creating well-behaved OS-level services than a model based on executable jars.
Looks in various places for a properties file to extract loader settings, defaulting to application.properties either on the current classpath or in the current working directory. The name of the properties file can be changed by setting a System property loader.config.name (e.g. -Dloader.config.name=foo will look for foo.properties. If that file doesn't exist then tries loader.config.location (with allowed prefixes classpath: and file: or any valid URL). Once that file is located turns it into Properties and extracts optional values (which can also be provided overridden as System properties in case the file doesn't exist):
loader.path: a comma-separated list of directories (containing file resources and/or nested archives in .jar or .zip or archives) or archives to append to the classpath. BOOT-INF/classes,BOOT-INF/lib in the application archive are always used
loader.main: the main method to delegate execution to once the class loader is set up. No default, but will fall back to looking for a Start-Class in a MANIFEST.MF, if there is one in ${loader.home}/META-INF.
spring-boot-maven-plugin幫助
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
idea將項(xiàng)目上傳到Gitee的圖文過(guò)程
這篇文章主要介紹了idea將項(xiàng)目上傳到Gitee上,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08java.sql.SQLException:?connection?holder?is?null錯(cuò)誤解決辦法
這篇文章主要給大家介紹了關(guān)于java.sql.SQLException:?connection?holder?is?null錯(cuò)誤的解決辦法,這個(gè)錯(cuò)誤通常是由于連接對(duì)象為空或未正確初始化導(dǎo)致的,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02springboot中如何去整合shrio實(shí)例分享
這篇文章主要介紹了springboot中如何去整合shrio實(shí)例分享的相關(guān)資料,需要的朋友可以參考下2023-08-08Java簡(jiǎn)單統(tǒng)計(jì)字符串中漢字,英文字母及數(shù)字?jǐn)?shù)量的方法
這篇文章主要介紹了Java簡(jiǎn)單統(tǒng)計(jì)字符串中漢字,英文字母及數(shù)字?jǐn)?shù)量的方法,涉及java針對(duì)字符串的遍歷、編碼轉(zhuǎn)換、判斷等相關(guān)操作技巧,需要的朋友可以參考下2017-06-06Mybatis查不到數(shù)據(jù)查詢返回Null問(wèn)題
mybatis突然查不到數(shù)據(jù),查詢返回的都是Null,但是 select count(*) from xxx查詢數(shù)量,返回卻是正常的。好多朋友遇到這樣的問(wèn)題不知所措,下面小編通過(guò)本教程簡(jiǎn)單給大家說(shuō)明下2016-08-08