1. 程式人生 > 其它 >SpringBoot專案打包為jar包過程(基於Maven)

SpringBoot專案打包為jar包過程(基於Maven)

技術標籤:javamavenspring bootjar

文章目錄


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>

排除artifactIdmy-libanother-lib的所有模組,即所有groupIdartifactIdmy-libanother-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>

排除groupIdcom.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中引入這些外掛.