SpringBoot專案打包為jar包過程(基於Maven)
文章目錄
SpringBoot專案完成開發後需要打包成jar包,並部署執行,才算完成了整個專案的流程。
1、pom檔案中
<build>
<finalName>DAG-1.0</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target >
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.yml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.yml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
1.1 maven-compiler-plugin
maven-compiler-plugin
可以指定專案中JDK的版本,以及指定編譯生成的class檔案的版本。在我的例子中我指定了開發時原始碼中使用的是JDK11,生成的class檔案也是對應JDK11.
1.2 spring-boot-maven-plugin
spring-boot-maven-plugin
使用Maven進行打包的外掛。repackage
重新打包應用程式。預設情況下,repackage和run這兩個maven目標會包括定義在工程中的任何依賴。
一些依賴被要求從可執行jar包中排除。下面有三種方式可以在包執行時排除依賴模組:
1.2.1 排除一個具體的maven模組
排除一個具體的maven 模組,通過唯一的groupId和artifactId組合來實現。(如果有必要,可以加入classifier來唯一確認。)
<build>
<finalName>DAG-1.0</finalName>
<plugins>
......
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<excludes>
<excludes>
<groupId>com.foo</groupId>
<artifactId>bar</artifactId>
</excludes>
</excludes>
</configuration>
</plugin>
</plugins>
......
</build>
排除com.foo下的bar模組。
1.2.2 排除和“指定的artifactId”相符的所有maven模組
排除和“指定的artifactId”相符的所有maven模組。
<build>
<finalName>DAG-1.0</finalName>
<plugins>
......
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<excludes>
<excludeArtifactIds>my-lib,another-lib</excludeArtifactIds>
</excludes>
</configuration>
</plugin>
</plugins>
......
</build>
排除artifactId
為my-lib
、another-lib
的所有模組,即所有groupId
下artifactId
為my-lib
、another-lib
的模組。
1.2.3 排除屬於“指定的groupId”的所有maven模組
<build>
<finalName>DAG-1.0</finalName>
<plugins>
......
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<excludes>
<excludeGroupIds>com.foo</excludeGroupIds>
</excludes>
</configuration>
</plugin>
</plugins>
......
</build>
排除groupId
為com.foo
下的所有模組.
2、jar包名
<finalName>Your jar Package Name</finalName>
build中的fileName
指定了打包生成的jar包的名字。
3、maven打包
在SpringBoot專案的根目錄下執行如下命令:
mvn package spring-boot:repackage
即可在根目錄下生成target資料夾,裡面包含了xxx.jar.
4、執行jar包
4.1 控制檯執行jar包
java -jar xxx.jar
4.2 後臺執行jar包,關閉終端不影響jar包執行
nohup java -jar DAG-1.0.jar > msg.log 2>&1 &
後臺執行jar包,日誌資訊輸入到msg.log檔案中,錯誤日誌和正確日誌都輸入到msg.log中。
在命令最後加上&符號,表示讓這個程序到後臺去執行,這樣立刻返回到提示符狀態,我們可以接著做下面的事。
4.3 後臺執行jar包,正確的日誌和錯誤的日誌分別輸入到不同的檔案中
nohup java -jar DAG-1.0.jar >> msg1.log 2>>msg2.log &
正確的日誌輸入到msg1.log中,錯誤的日誌輸入到msg2.log中.
5、打包生成war包
預設生成的是jar包。在pom檔案中指定要生成的什麼形式的包
<packaging>war</packaging>
<name>DAG-1.0</name>
<description>DAG project for Spring Boot</description>
執行打包命令
mvn package spring-boot:repackage
可以看到生成了war包,部署war包執行程式.
6、遇到的錯誤以及注意事項
6.1 訪問HTML頁面找不到對應的頁面
這種情況首先要看一下,生成的target資料夾下面有沒有對應的templates資料夾及其中應該包含有的xxx.html檔案。程式執行時只認識target資料夾下的東西,如果target資料夾下面根本就沒有對應的templates資料夾和xxx.html檔案,肯定是無法開啟HTML頁面的。
造成這個錯誤的常見原因是沒有指定將xxx.html作為專案的資源進行打包,這個需要在pom檔案中指明。
<build>
......
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.yml</include>
<include>**/*.html</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.yml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
<build>
如上面的,指明瞭src/main/resources資料夾下面的.properties檔案、.xml檔案、.yml檔案、.html檔案和src/main/java資料夾下面的.properties檔案、.xml檔案、.yml檔案被作為專案的資原始檔,因此在生成的target檔案中才能找到html檔案.
如果去掉對.html檔案的指明,生成的target資料夾中找不到對應的HTML檔案,也就打不開HTML頁面了。
<build>
......
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.yml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.yml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
<build>
去掉後,生成的target資料夾中沒有HTML檔案.
沒有templates資料夾及其中的HTML檔案,執行程式將無法訪問HTML頁面.
6.2 target中生成了HTML檔案,仍然找不到HTML頁面
很有可能是thymeleaf
的配置寫錯了。
thymeleaf.prefix
處,一定要寫正確,不能多一個/
或者少寫一個/
,因為這樣在寫訪問頁面的,路徑時就會多或則少一個/
,將無法找到HTML頁面.
6.3 pom檔案中maven-compiler-plugin
或則spring-boot-maven-plugin
等外掛無法正確的匯入(變紅)
需要在dependencies中引入這些用到外掛,然後再在build中的plugins中引入這些外掛.