maven構建的springboot項目打包很方便,可是若是項目是多模塊的,依賴的第三方jar包可能比較多時,最終打包的jar包會很大,甚至超過100M,這對於版本迭代頻率比較高的狀況是比較浪費時間的,而當項目架構定下來後,一般第三方依賴包是不變的,好比:spring-boot-starter選用的是2.1.2.RELEASE,那麼後續就基本不會改變了,因此想到要給項目瘦身。java
假設我有一個多模塊的項目,由core、model、dao、service等基礎模塊以及web-api和web-api-admin這兩個web模塊組成,web
以web-api爲例,該模塊依賴那四個基礎模塊,pom.xml裏的build寫法以下:spring
<build>
<finalName>api</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<!--此處修改成你的應用入口類全路徑-->
<mainClass>com.benseji.api.ApiApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<!--這個插件就是把依賴的jar包複製出來放到編譯後的target/lib目錄,而且在打包時候排除內部依賴-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
執行完以後,切到web-api模塊下,執行mvn clean package,等待執行結束:apache
好比在/webapps/api文件夾下,有這四個文件,api
#!/bin/sh java -Dloader.path="lib/" -jar /webapps/api/api.jar --spring.profiles.active=pro --server.port=8081 > /home/benseqifu/logs/api.log & echo $! > /var/run/api.pid
#!/bin/sh PID=$(cat /var/run/api.pid) kill -9 $PID
3.編寫註冊服務springboot
在/etc/systemd/system下編寫api-service腳本(ExecStart和ExecStop的路徑對應上面兩個腳本路徑)bash
[Unit] Description=apiservice for xxx After=syslog.target network.target remote-fs.target nss-lookup.target [Service] Type=forking ExecStart=/webapps/api/start.sh ExecStop=/webapps/api/stop.sh PrivateTmp=true [Install] WantedBy=multi-user.target
systemctl enable api-service #開機自啓動 systemctl start api-service #啓動 systemctl stop api-service #中止
在執行啓動服務的腳本後,會在/var/run目錄下多出一個api.pid文件,裏面的數字就是服務運行的進程編號,當服務中止後該文件就自動刪除了,項目運行的日誌文件在 /home/benseqifu/logs/api.log ,查看它 tail -500f api.log,部份內容以下:服務器
其中啓動以後自定義處理代碼:架構