您的位置:首页 > 编程语言 > Java开发

spring boot 项目 四种方式启动项目的正确姿势和注意点

2017-06-05 00:00 941 查看
在 研究使用spring boot 的 小demo的时候,还真是 遇到了不少的问题,,,对于我这个不怎么看官网文档和教程的人来说,,,也是搞了半天的哦。spring boot 是搞简单了,可是 需要注意的细节还是不少的,不然就不用玩了,,,特别是对于新手来说。

1, main 方法启动

spring boot 最简单方便的 ,main方法启动 项目。main方法启动项目,官网的demo,或者是百度的demo 都非常的简单,,都是可以启动的。
可以 你想啊,如果我 有很多controller 呢。 一些的demo 就是 这样

SpringApplication.run(WebController.class, args);
如果多个  controller 不是写死? 而且 人家也不给这样写啊,,写多个 就报错了吧,,,

可是我作为新生就遇到了一个 问题,,,为什么 启动了项目,,我的controller 类访问不了?或者一部分访问不了? 这个是怎么回事?
我百度了一下, 参考地址: https://www.oschina.net/question/2830949_2190988

啥意思,@SpringBootApplication和controller在一个包里吗,@ComponentScan配置了吗

那个大神的话,提醒了我, 我发现我写的 启动main方法类 和 controller 不是在同一个包,,, 我把他们放在同一个包下面的时候,果然可以测试访问成功了。测试如果是子包下面的也是可以访问的。 即 spring 3 是需要配置包扫描的, 这个 boot默认扫描路径是 当前 main 启动类的 当前 包目录和子包 下面的 类的。

除非 我们手动自定义了 配置的包扫描路径。这样的原理 不管是 使用 那种方式 启动项目都是一样的
我的demo类

package org.project.web;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

// 启动方式:  使用 spring-boot 的内嵌的 tomcat启动 项目
@SpringBootApplication // 这个注解 有没有都没有关系,如果是 加载web类的话
public class WebStartByMain {

public static void main(String[] args) throws Exception {

// 默认使用 tomcat 容器 ,端口 8080
//如果要 启动容器加载 这个 web 类,必须在类上加上  @EnableAutoConfiguration
//SpringApplication.run(WebController.class, args);
//System.out.println(">>>>>>>>>>>>>>>");
//SpringApplication.run(TestController.class, args);

//启动项目,默认是 tomcat 启动 端口 8080 ,
//不管有没有写controller 都会一直启动的,和以前启动tomcat项目一样的
SpringApplication.run(WebStartByMain.class, args);
// 需要 注意该类是否 和 controller 在同一个包,必须在同一个包下面,才可以访问的,或者是配置了包扫描的路径
// 默认包扫描的路径是 这个启动类的 同一级目录下的
}

}

2, spring-boot 怎么样才可以 和 以前的 web项目一样使用呢

我们在构建 maven项目的时候 ,就必须 构造成 web项目,或者把普通项目 改造为 web项目 ,
这样我们才可以使用 IED 里面的tomcat 测试启动项目了。或者是 我们 以后发布为war包的时候也是需要的。
我们在 创建 maven项目的时候, 可以选择 新建 maven-xxxx-webapp 类型的 项目,这样 新建的项目就是一个 web项目, 这时候 必须把 webapp 下面的 web.xml 文件给删掉,如果有的话。
因为 如果他在 会 导致spring-boot 的项目 不能使用 tomcat 启动的。 这种类型的web项目就是比较低级了,可以使用 tomcat 任何版本发版 了。

当然了 我们也可以把普通的maven 项目 改造为 maven web 项目 ,
把 pom .xml 打包设置为 war 包,在pom.xml里设置 <packaging>war</packaging>

然后 maven更新一下项目,即可了,这样的项目 是比较高级的,,,必须使用 tomcat8 来启动,,tomcat7 不能的。同样webapp 下面如果有web.xml 要删除,我的是没有的。
如果要 使用 eclipse 的自带的tomcat启动项目,就改造pom

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

<!-- 移除嵌入式tomcat插件,
如果使用 IDE比如eclipse里面的 tomcat 启动的时候,使用 ,
同时其他地方不能引入 spring-boot-starter-tomcat 的依赖,否则项目启动失败。    -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>

</dependency>

<!--IDE 的tomcat启动必须的  -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>

参考地址: http://blog.csdn.net/javahighness/article/details/52515226 
地址 http://blog.csdn.net/asdfsfsdgdfgh/article/details/52127562

我的demo

/**
* 修改启动类,继承 SpringBootServletInitializer 并重写 configure 方法
*
* 为了 使用 外部的tomcat 来启动项目,而不是使用 spring-boot 自带的tomcat启动
*
*/
public class WebStartByTomcat extends SpringBootServletInitializer{

@Override
protected SpringApplicationBuilder configure(
SpringApplicationBuilder builder) {

// 第二种启动方式
// 注意这里要指向原先用main方法执行的Application启动类
return builder.sources(WebStartByMain.class);

}

}

3, 部署boot项目

第三种的启动方式的, 就是这个了。 部署的话,spring boot 项目是可以 打成 jar包 使用JVM 直接部署启动的,内置了tomcat的。 默认也是 使用 tomcat8 容器发布的。 但是一般来说呢,我们 不会这样的,都是war包,使用 tomcat7,8 这样的。 如果直接打包 成 war 包部署,肯定启动失败,因为 内容了 tomcat容器了,会和 当前使用的 tomcat 的一些包有冲突的。
可以 这样的:

<!-- 部署,打war包时加入此项, 告诉spring-boot tomcat相关jar包用外部的,不要打进去
使用在 main 方法启动 项目,使用springboot 内嵌的tomcat启动的
-->
<!--  <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>   -->

这样打包war包放入tomcat里面启动的时候就不会 启动异常了,也不影响我们测试使用的。

4,第四种启动方式

其实还是有第四种启动方式的,原理是和main方法启动一样的。
使用 maven命令;

依然可以用内嵌的tomcat来调试,启动命令和以前没变,还是:mvn spring-boot:run。

总结

以我这个菜鸟,写demo 部署demo的体验来,,,特别是使用了 渣渣电脑的体验来看。
那么多种 启动方式, 我推荐我们测试开发的时候 ,使用 main方法,即第一种方式启动。
因为 感觉这样 项目 编译的快,反应快, 对于测试开发来说还是挺好的。 使用tomcat 部署, 反应慢一下,而且 很可能改动了之后 需要重新编译后 才会起效果的,不然tomcat 会比较迟钝的, 特别是对于渣渣电脑来说了。 main 方法一个好处地方就是,,,可以 针对于 一个 controller 测试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: