Springboot 和我们之前学习的web 应用程序不一样,其本质上是一个 Java 应用程序,那么又如何部署呢?
通常来说,Springboot 部署会采用两种方式:全部打包成一个jar,或者打包成一个war。
一、jar方式
1、前面已经写好了一个spring boot项目,(IJ创建一个spring boot项目)dos命令进入该项目目录
2、打包成jar
输入命令
mvn install
在target目录下生成了一个jar文件
3、运行该jar
java -jar target/springboot-0.0.1-SNAPSHOT.jar
4、访问http://localhost:8080/hello
二、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
接下来查看项目的target目录
可以看到生成了一个war文件,把文件重命名为ROOT.war,这样做的目的是把它放在webapps目录下时,可以直接通过localhost:8080/hello访问,不然的话这个链接就太长了。
接下来把webapps下的文件都删掉,这是为了防止访问时出现404错误。
startup.bat,启动tomcat,一堆可以作为三流科幻片黑客入侵画面的代码闪过
这样tomcat就跑起来了,访问网址localhost:8080/hello
这个倒霉催的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
四、错误及解决
Perhaps you are running on a JRE rather than a JDK
从字面上看,大概是应该配置的jdk配成了jre,它想要jdk,那给它吧。查了一下,这是是以前的旧坑,以前装Java的时候,jdk和jre没有分的那么开,所以现在就坐蜡了,没办法,重新配置吧。Java JDK 下载安装,以及环境配置