Spring boot 不像其它巨石的web工程,其本质上是一个 Java 应用程序,那么又如何部署呢?
通常来说,Springboot 部署会采用两种方式:全部打包成一个jar,或者打包成一个war。
以前普通的web工程是这样打成war包的
直接导出.war 放置到服务器tomcat目录下面
当然也有其它的容器
这里讲讲Spring boot的两种打包方式
1.jar的打包方式
都知到Spring boot是由main方法,而且是程序启动的入口,我们如果是直接打包成jar文件
则一定会出现找不到main入口的情况
解决办法
加入一下代码便可以直接在idea里面打包了
org.springframework.boot
spring-boot-maven-plugin
可以通过这种方式直接打包 执行一遍clean 然后执行package就好了,install也可以弄到私有库
示例:
就拿这个工程来示例,
application.yml
server:
port: 9999
JumApplication.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class JumApplication {
public static void main(String[] args) {
SpringApplication.run(JumApplication.class, args);
}
}
User.java
package com.jum.controller;
public class User { //当然也可以使用Lombok来实现get set 构造,这里简单写
private String id;
private String name;
public User(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
IndexController.java
package com.jum.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.LinkedList;
import java.util.List;
@Controller
public class IndexController {
private static List users = new LinkedList<>();
static {
User user = new User("123456","张大毛");
User user2 = new User("654321","张二毛");
User user3 = new User("456789","张三毛");
User user4 = new User("987654","张小毛");
users.add(user);
users.add(user2);
users.add(user3);
users.add(user4);
}
@RequestMapping(value = "/user", method = RequestMethod.GET)
public String index(Model model, @RequestParam("id") String param1) {
users.stream().filter(member -> {
if (param1.equals(member.getId())){
model.addAttribute("name", member.getName());
}
return param1.equals(member.getId());
}).findAny();
return "index";
}
}
pom.xml
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.8.RELEASE
com.jum
jum
0.0.1-SNAPSHOT
jum
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
src/main/resources
**/*.*
如此就完工了
这个便是可执行的jar文件
我将我这个jar文件拷贝到了自己的D:\A 目录下
如此便可正常运行了,当然linux也是一样
nohup java -Dfile.encoding=UTF-8 -jar jum-0.0.1-SNAPSHOT.jar & 这个为不挂断执行
2.打war方式
主要修改 把pom.xml
加入
war
org.springframework.boot
spring-boot-starter-tomcat
provided
spring-boot-starter-tomcat修改为 provided,以避免和独立 tomcat 容器的冲突.
表示只在编译和测试的时候使用,打包的时候它就不参与了。
如下:
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.8.RELEASE
com.jum
jum
0.0.1-SNAPSHOT
jum
war
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
provided
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
src/main/resources
**/*.*
然后需要新加@ServletComponentScan注解,并且继承SpringBootServletInitializer 。
打包成war包,则需要继承 org.springframework.boot.context.web.SpringBootServletInitializer类,覆盖其config(SpringApplicationBuilder)方法
package com.jum;
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.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
@ServletComponentScan
public class JumApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(JumApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(JumApplication.class, args);
}
}
我则把自己打的war放置如上目录下,编译之后会出现jum-0.0.1-SNAPSHOT文件夹,它会使用外部的tomcat所以端口号为外部tomcat的端口号