原文地址:https://blog.csdn.net/u012811805/article/details/80878848 1 jar啟動分離依賴lib和配置 先前發佈boot項目的時候,改動一點東西,就需要將整個項目重新打包部署,十分不便,故把依賴lib從項目分離出來,每次部署只需要發佈代碼即可 ...
原文地址:https://blog.csdn.net/u012811805/article/details/80878848
1 jar啟動分離依賴lib和配置
先前發佈boot項目的時候,改動一點東西,就需要將整個項目重新打包部署,十分不便,故把依賴lib從項目分離出來,每次部署只需要發佈代碼即可。
1.1 半自動化步驟
1.1.1 更換maven的jar打包插件
先前使用的是spring-boot-maven-plugin來打包,這個插件會將項目所有的依賴打入BOOT-INF/lib下,替換為maven-jar-plugin:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.1.1</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>org.orcrtech.pvpsddp.registry.center.PvpsddpRegistryCenterApplication</mainClass> </manifest> </archive> </configuration> </plugin>
解釋:
a addClasspath表示需要加入到類構建路徑
b classpathPrefix指定生成的Manifest文件中Class-Path依賴lib前面都加上路徑,構建出lib/xx.jar
1.1.2 拷貝依賴到jar外面的lib目錄
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-lib</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>target/lib</outputDirectory> <excludeTransitive>false</excludeTransitive> <stripVersion>false</stripVersion> <includeScope>runtime</includeScope> </configuration> </execution> </executions> </plugin>
1.1.3 在和jar包同級的目錄下新建一個config目錄,放入application.yml文件
這裡可能有小伙伴有疑問了,打包的jar裡面不是應該有application.yml文件嗎,這裡為什麼再放一份?
這是因為boot讀取配置有一個優先順序,放在jar包外面config目錄優先順序最高,主要是便於從外部修改配置,而不是改jar包中的application.yml文件。優先順序如下:
當前目錄的config目錄下
當前目錄
classpath的config目錄下
classpath的根目錄
1.1.4 啟動項目
加入–debug可以讓你可以看到比較詳細的啟動日誌:
java -jar xxx-1.0.0.jar --debug
1.2 全自動化步驟
前面介紹的步驟中,需要手動的拷貝application.yml文件,並且jar包內外都存在配置,總感覺怪怪的(偷笑…)。這裡引入一種自動化配置,將所有東西打成zip文件,直接發佈到服務目錄,解壓後,即可啟動。
1.2.1 指定打包插件
如上。
1.2.2 拷貝依賴的插件。
如上。
1.2.3 自動化步驟2
排除resources下麵的yml(因為我們需要把它放在jar外部,不能讓jar打包插件將其打入jar包classpath下去)
<resources> <resource> <directory>src/main/resources</directory> <excludes> <exclude>**/application.yml</exclude> </excludes> </resource> </resources>
上面這種排除*.yml配置文件的辦法,會在IDEA編譯器啟動的時候報錯,下麵的排除方法不會引起報錯:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lid/</classpathPrefix> <mainClass>org.orcrtech.pvpsddp.structure.management.PvpsddpStructureManagementApplication</mainClass> </manifest> </archive> <!-- 排除配置文件 --> <excludes > <exclude>*.yml</exclude> </excludes> </configuration> </plugin>
1.2.4 使用maven-assembly-plugin自定義打包
具體打包詳情在assembly.xml配置中指定
<plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <!-- 打包後的包名是否包含assembly的id名 --> <appendAssemblyId>false</appendAssemblyId> <!-- 指定最後tar或者zip包的名字 --> <finalName>gateway</finalName> <!-- tar或者zip包的輸出目錄 --> <!-- ../ 是指當前項目的根目錄 ,例如:F:\pvpsddp\pvpsddp-gateway 的上一級--> <outputDirectory>F:\pvpsddp\tar</outputDirectory> <descriptors> <!-- 引用的assembly配置文件,可以用多個,即可以同時打包多個格式的包 --> <descriptor>src/main/resources/assembly.xml</descriptor> </descriptors> </configuration> <executions> <!-- phase加入package後,則在執行maven package時就可以調用maven-assembly-plugin插件定義的打包方式 --> <execution> <!--名字任意 --> <id>make-assembly</id> <!-- 綁定到package生命周期階段上 --> <phase>package</phase> <goals> <!-- 只運行一次 --> <goal>single</goal> </goals> </execution> </executions> </plugin>
註:
生成的tar.gz文件的名字為:maven-assembly-plugin插件中配置的 “finalName-assembly.xml配置的id”(若assembly中沒有指定id,則只有前半部分。
assembly.xml具體配置如下:
將application.yml放在外部config目錄下
所有依賴打成zip壓縮包(還可以打成其他類型包https://www.cnblogs.com/f-zhao/p/6929814.html)
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd"> <id>package</id> <formats> <format>zip</format> </formats> <includeBaseDirectory>true</includeBaseDirectory> <fileSets> <fileSet> <directory>${basedir}/src/main/resources</directory> <includes> <include>*.yml</include> </includes> <filtered>true</filtered> <outputDirectory>${file.separator}config</outputDirectory> </fileSet> <fileSet> <!-- 需要打包的路徑 --> <directory>src/main/resources/runScript</directory> <!-- 打包後輸出的路徑,自定義 --> <outputDirectory>${file.separator}bin</outputDirectory> </fileSet> <fileSet> <directory>${project.build.directory}/lib</directory> <outputDirectory>${file.separator}lib</outputDirectory> <!-- 打包需要包含的文件 --> <includes> <include>*.jar</include> </includes> </fileSet> <fileSet> <directory>${project.build.directory}</directory> <outputDirectory>${file.separator}</outputDirectory> <includes> <include>*.jar</include> </includes> </fileSet> </fileSets> </assembly>