在SpringBoot - Hello World中我们简单的结识了SpringBoot
。
注意到我们是直接执行main
函数就把项目启动起来了,并且部署到了tomcat容器。但是我们从头到尾都没有配置过任何的容器,更何况是tomcat。而且,我们一般的线上启动web项目,可不是直接运行main
函数的。
一般情况,都是把项目打包成war包,然后丢到tomcat,再启动tomcat,现在SpringBoot这样玩,那怎么上线?
这些就是接下来要讨论的。
环境工具
- IDEA
- Maven3
- JDK1.8
- Tomcat8
当前Spring Boot 最新稳定版本为1.5.8
创建项目
打开IDEA -> new Project -> Spring Initializr -> 填写Group,Article -> 选择Web,勾选Web -> Next -> Finish
也可以基于Helloworld
那个项目
设置banner
我们发现在SpringBoot启动的时候会展示一个图案
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.5.8.RELEASE)
修改banner
我们可以将其更换为我们自己想要的图案:
- 在
src/main/resources
下面新建一个banner.txt
文件 - 将我们想更换的图案放入其中,比如我更换为下图:
.______ ______ ___ ______ __ __
| _ \ / __ \ / \ / || | | |
| |_) | | | | | / ^ \ | ,----'| |__| |
| / | | | | / /_\ \ | | | __ |
| |\ \----.| `--' | / _____ \ | `----.| | | |
| _| `._____| \______/ /__/ \__\ \______||__| |__|
- 重新启动项目,我们就能看到新的图案了。
关闭banner
有时候我们并不想看到这个banner,我们想关闭它。
只需要我们将main
函数里的内容修改为下面的代码就可以了:
SpringApplication springApplication = new SpringApplication(SpringBootContainerApplication.class);
springApplication.setBannerMode(Banner.Mode.OFF);
springApplication.run(args);
配置Tomcat
之所以我们不需要引入tomcat是因为SpringBoot帮我们内嵌了tomcat容器。我们在引入SpringBoot的时候,同时依赖引入了tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>1.5.8.RELEASE</version>
<scope>provided</scope>
</dependency>
容器相关的配置(不只是tomcat)都在org.springframework.boot.autoconfigure.web.ServerProperties
配置类中有定义。所以我们要修改内嵌tomcat容器相关的配置,只需要在application.properties
中配置即可。
## 容器端口号,默认8080
server.port=8280
## 上下文路径,默认/
server.context-path=/tutorial
## tomcat编码,默认UTF-8
server.tomcat.uri-encoding=UTF-8
具体的配置可以查看源码。
新建DemoController
新建DemoController
,代码如下:
@RestController
@RequestMapping("/demo")
public class DemoController {
@GetMapping
public List<Map<String, String>> get(){
List<Map<String, String>> demos = new ArrayList<>();
Map<String, String > demo1 = new HashMap<>();
demo1.put("roach", "小强");
demo1.put("crow", "乌鸦");
demos.add(demo1);
Map<String, String> demo2 = new HashMap<>();
demo2.put("lion", "狮子");
demo2.put("tiger", "老虎");
demos.add(demo2);
return demos;
}
}
- 启动项目
- 在浏览器中输入
http://localhost:8280/tutorial/demo
,查看结果 - 输出如下结果:
[
{
"roach": "小强",
"crow": "乌鸦"
},
{
"tiger": "老虎",
"lion": "狮子"
}
]
可见我们的配置是生效了的。
使用外置tomcat
-
将
pom.xml
中的<packaging>jar</packaging>
修改成<packaging>war</packaging>
,即修改打包方式。 -
SpringBootContainerApplication
类(注解@SpringBootApplication
所在的类)继承org.springframework.boot.web.support.SpringBootServletInitializer
类,并重写configure
方法:
@SpringBootApplication
public class SpringBootContainerApplication extends SpringBootServletInitializer{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(this.getClass());
}
}
- IDEA配置tomcat,配置项目到tomcat。具体如何配置项目到tomcat,这里不会涉及。当然你也可以先打war包,然后将war包丢到tomcat上。
需要注意的是:application.properties中对容器的配置只对内嵌的有效,对外置的容器是没有用的。
内嵌tomcat依赖设置
既然用外置的tomcat,那内嵌的就不需要了吧,就可以把依赖去掉了呀!
是的,我们只要把依赖去掉就可以了。
- 去依赖设置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
这样配置我们就能去掉内部的tomcat依赖了
- 添加servlet-api依赖
去掉tomcat的依赖,但是我们还是要servlet的依赖的,不然我们的项目是启动不了的。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
内外tomcat皆可
有朋友说,我有时想用内嵌的有时用外置的,看我心情。当然可以,我们只需要单独将tomcat的依赖加进来就可以。这样就能覆盖spring-boot-starter-web
依赖进来的tomcat。
- 在pom.xml中加入如下配置
设置scope是因为我们只需要在编译的时候用到,打包的时候就不需要了。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>1.5.8.RELEASE</version>
<scope>provided</scope>
</dependency>
- 在项目根目录下执行:
mvn spring-boot:run
,就能使用内置的tomcat运行项目。
项目源码
参考
《Java EE开发的颠覆者 Spring Boot 实战》
网友评论