天天看點

SpringBoot學習筆記(二、部署方式)

Springboot 和我們之前學習的web 應用程式不一樣,其本質上是一個 Java 應用程式,那麼又如何部署呢?

通常來說,Springboot 部署會采用兩種方式:全部打包成一個jar,或者打包成一個war。

一、jar方式

1、前面已經寫好了一個spring boot項目,(

IJ建立一個spring boot項目

)dos指令進入該項目目錄

SpringBoot學習筆記(二、部署方式)

2、打包成jar

輸入指令

mvn install      
SpringBoot學習筆記(二、部署方式)
SpringBoot學習筆記(二、部署方式)

在target目錄下生成了一個jar檔案

3、運作該jar

java -jar target/springboot-0.0.1-SNAPSHOT.jar      
SpringBoot學習筆記(二、部署方式)

4、通路http://localhost:8080/hello

SpringBoot學習筆記(二、部署方式)

二、war方式

1、用IJ建一個maven項目

2、具體代碼

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>edu.hpu</groupId>
    <artifactId>springboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot</name>
    <description>springboot</description>
    <packaging>war</packaging>    <!--表示打包成war-->

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
              <!--打包的時候可以不用包進去,别的設施會提供。事實上該依賴理論上可以參與編譯,測          試,運作等周期。
        相當于compile,但是打包階段做了exclude操作-->
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>      

作注釋的那個依賴表示排除了spring boot的内置容器,spring boot内置容器是tomcat8,部署到其它版本的tomcat下會報錯,還有另外一種排除的寫法

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
      

Application.java

package edu.hpu.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.support.SpringBootServletInitializer;//不要導錯包了

@SpringBootApplication
@ServletComponentScan   
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}      

這個和前面的SpringBoot項目有三個差別:

(1)、繼承org.springframework.boot.web.servlet.support.SpringBootServletInitializer

(2)、添加注解@ServletComponentScan

(3)、重寫configure方法

HelloController.java

package edu.hpu.springboot.web;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello(){
        return "你好,好他媽頭疼";
    }
}      

3、dos視窗進入項目所在目錄,輸入指令

mvn clean package

SpringBoot學習筆記(二、部署方式)

接下來檢視項目的target目錄

SpringBoot學習筆記(二、部署方式)

可以看到生成了一個war檔案,把檔案重命名為ROOT.war,這樣做的目的是把它放在webapps目錄下時,可以直接通過localhost:8080/hello通路,不然的話這個連結就太長了。

接下來把webapps下的檔案都删掉,這是為了防止通路時出現404錯誤。

SpringBoot學習筆記(二、部署方式)

startup.bat,啟動tomcat,一堆可以作為三流科幻片黑客入侵畫面的代碼閃過

SpringBoot學習筆記(二、部署方式)

這樣tomcat就跑起來了,通路網址localhost:8080/hello

SpringBoot學習筆記(二、部署方式)

這個倒黴催的Spring Boot war部署方式就算是完成了。

三、熱部署

熱部署:對于Java應用程式來說,熱部署就是在運作時更新Java類檔案。使用熱部署可以不重新開機應用的情況下,更新應用。舉個例子,就像電腦可以在不重新開機的情況下,更換U盤。熱部署是利用類加載機制實作的,項目更新後,銷毀該自定義ClassLoader,更新class類檔案,建立新的ClassLoader去加載更新後的class類檔案。

SpringBoot熱部署:

1、在pom.xml中新增依賴

<!--新增熱部署插件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>         <!--這個設定為true熱部署才會生效-->
        </dependency>      

完整pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>edu.hpu</groupId>
    <artifactId>springboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot</name>
    <description>springboot</description>
    <packaging>war</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>

        <!--新增熱部署插件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>         <!--這個設定為true熱部署才會生效-->
        </dependency>
    </dependencies>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>      

2、運作Application,通路網址localhost:8080

3、修改HelloController内容,重新啟動Application,通路網址loclhost:8080

SpringBoot學習筆記(二、部署方式)

四、錯誤及解決

Perhaps you are running on a JRE rather than a JDK

從字面上看,大概是應該配置的jdk配成了jre,它想要jdk,那給它吧。查了一下,這是是以前的舊坑,以前裝Java的時候,jdk和jre沒有分的那麼開,是以現在就坐蠟了,沒辦法,重新配置吧。

Java JDK 下載下傳安裝,以及環境配置
SpringBoot學習筆記(二、部署方式)