1. 程式人生 > >Spring Boot 初級入門教程(十) —— 打完整 jar 包、部署和測試

Spring Boot 初級入門教程(十) —— 打完整 jar 包、部署和測試

不知不覺都第十篇了,用了這麼久,都是在本機執行,localhost 還是不爽,加上目前 jsp 頁面已配置,可以做幾個炫一些的頁面,掛伺服器上試試。那麼問題來了,如何打包、部署呢?接下來開始嘗試打包,Spirng Boot 預設配置是 jar 包,那首先來嘗試一下 jar 包的打包、部署和測試。

在文章開始之前,首先刪除配置檔案的部分配置,如下:

	<!-- Add Spring repositories -->
	<!-- (you don't need this if you are using a .RELEASE version) -->
	<repositories>
		<repository>
			<id>spring-snapshots</id>
			<url>http://repo.spring.io/snapshot</url>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</repository>
		<repository>
			<id>spring-milestones</id>
			<url>http://repo.spring.io/milestone</url>
		</repository>
	</repositories>
	<pluginRepositories>
		<pluginRepository>
			<id>spring-snapshots</id>
			<url>http://repo.spring.io/snapshot</url>
		</pluginRepository>
		<pluginRepository>
			<id>spring-milestones</id>
			<url>http://repo.spring.io/milestone</url>
		</pluginRepository>
	</pluginRepositories>

註釋的意思是:

<! - 新增Spring儲存庫 - >
<! - (如果您使用的是.RELEASE版本,則不需要此項) - >

官網解釋:

If you use a milestone or snapshot release, you also need to add the appropriate pluginRepository elements.

大概意思:如果使用里程碑或快照版本,則還需要新增相應的pluginRepository元素。

所以這裡先把這部分配置刪除, 因為目前專案用的是 2.0.2.RELEASE 版本。

一、打 jar 包。

如果不做任何的配置,直接打包:選中專案-》右鍵-》Run as -》4 Maven build -》彈出框 Goals 欄輸入 -X package -》點選 Run 按鈕,則打包開始。如果出現錯誤,可以嘗試做下面兩步操作:

第一步:選中專案-》右鍵 -》Maven -》Update Project。

第二步:選中專案-》選單 -》Project -》Clean。

備註:上面 IDE 是英文環境,如果你的是中文,請簡單翻譯,對照操作。

如果打包成功,可以在 target 目錄看到自己期盼已久的 jar 包,如圖:

上傳到 linux 伺服器。可以看到這個包非常小,不到 14k:

執行試下效果,總覺得有點懸:

啟動命令:java -jar test-springboot-1.0.jar

檢視 jar 包,找到 test-springboot-1.0.jar\META-INF\MANIFEST.MF,內容如下:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: LangLang
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_172

確實少 main 方法,因為這是 Spring Boot 啟動的入口,看來打包有問題,缺配置。

修改 pom.xml 配置檔案:

	<build>
		<plugins>
			<!-- 這是Spring Boot Devtools Plugin的配置 -->
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<!-- 如果沒有fork配置,可能devtools不會起作用,即不會restart -->
					<fork>true</fork>
					<mainClass>com.menglanglang.test.springboot.App</mainClass>
				</configuration>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

繼續打包,打包後可以再看看 test-springboot-1.0.jar\META-INF\MANIFEST.MF 檔案的內容:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: LangLang
Start-Class: com.menglanglang.test.springboot.App
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.0.3.RELEASE
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_172
Main-Class: org.springframework.boot.loader.JarLauncher

內容明顯比之前多很多,而且有了 Start-Class 等資訊,而且 jar 包的大小也變為近 20M。

上傳伺服器,再次執行測試,結果如下:

看來打包部署算是成功了。

二、測試

開啟瀏覽器,訪問下前幾篇測試的連結,看看結果是否一致。

訪問:http://192.168.220.254:8080/cfg/outStr1

訪問:http://192.168.220.254:8080/cfg/outStr4

訪問:http://192.168.220.254:8080/jsp/testJspPage

開啟 jar 包後發現,jar 包中並沒有打入 jsp 頁面部分,所以繼續修改 pom.xml 配置,如下:

	<build>
		<plugins>
			<!-- 這是Spring Boot Devtools Plugin的配置 -->
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<!-- 如果沒有fork配置,可能devtools不會起作用,即不會restart -->
					<fork>true</fork>
					<mainClass>com.menglanglang.test.springboot.App</mainClass>
				</configuration>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
		<resources>
			<resource>
				<directory>${basedir}/src/main/webapp</directory>
				<targetPath>META-INF/resources</targetPath>
				<includes>
					<include>**/**</include>
				</includes>
			</resource>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>false</filtering>
				<includes>
					<include>**/**</include>
				</includes>
			</resource>
			<resource>
				<directory>src/main/webapp</directory>
				<filtering>false</filtering>
				<includes>
					<include>**/**</include>
				</includes>
			</resource>
		</resources>
	</build>

打包,部署,測試,發現還是不能訪問頁面。查其原因,官網說法:

JSP limitations

When running a Spring Boot application that uses an embedded servlet container (and is packaged as an executable archive), there are some limitations in the JSP support.

  • With Jetty and Tomcat it should work if you use war packaging. An executable war will work when launched with java -jar, and will also be deployable to any standard container. JSPs are not supported when using an executable jar.
  • Undertow does not support JSPs.
  • Creating a custom error.jsp page won’t override the default view for error handlingcustom error pages should be used instead.

大概意思:

JSP 限制

當執行使用嵌入 servlet 容器的 Spring Boot 應用程式(並打包為可執行包)時,JSP 支援存在一些限制。

  • 使用 Jetty 和 Tomcat,如果使用 war 包,它應該可以工作。使用 java -jar 啟動時,可執行的 war 也將起作用,並且還可以部署到任何標準容器。 使用可執行 jar 包時不支援 JSP。
  • Undertow不支援JSP。
  • 建立自定義 error.jsp 頁面不會覆蓋錯誤處理的預設檢視,而應使用自定義錯誤頁面。

看來是 Jar 包不能很好的支援訪問 jsp 頁面導致。

是不是打包的外掛有問題,如果不設定版本,應該是最新版本,也就是 2.0.2,指定一個老版本再試試,比如 1.4.0。修改配置後如下:

	<build>
		<plugins>
			<!-- 這是Spring Boot Devtools Plugin的配置 -->
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<version>1.4.0.RELEASE</version>
				<configuration>
					<!-- 如果沒有fork配置,可能devtools不會起作用,即不會restart -->
					<!-- 。。。此處省略n行 -->
	</build>

再次部署測試,居然能看到 jsp 頁面內容,只是載入特別慢,如圖:

但在 1.4.0 的官方文件中,也有 JSP limitations 部分說明。

順便,又試了下 1.5.x 系列的版本,結果和 2.0.x 一樣,所打包的 jar 都是不能訪問 jsp 頁面的,其它版本大家可以自行嘗試。

猜測,Spring Boot 剛開始也是想支援 jsp 的,可能由於支援不是很好,所以在後續版本中,逐漸取消了 jsp 的支援。