spring boot 项目 四种方式启动项目的正确姿势和注意点
2017-06-05 00:00
941 查看
在 研究使用spring boot 的 小demo的时候,还真是 遇到了不少的问题,,,对于我这个不怎么看官网文档和教程的人来说,,,也是搞了半天的哦。spring boot 是搞简单了,可是 需要注意的细节还是不少的,不然就不用玩了,,,特别是对于新手来说。
可以 你想啊,如果我 有很多controller 呢。 一些的demo 就是 这样
可是我作为新生就遇到了一个 问题,,,为什么 启动了项目,,我的controller 类访问不了?或者一部分访问不了? 这个是怎么回事?
我百度了一下, 参考地址: https://www.oschina.net/question/2830949_2190988
那个大神的话,提醒了我, 我发现我写的 启动main方法类 和 controller 不是在同一个包,,, 我把他们放在同一个包下面的时候,果然可以测试访问成功了。测试如果是子包下面的也是可以访问的。 即 spring 3 是需要配置包扫描的, 这个 boot默认扫描路径是 当前 main 启动类的 当前 包目录和子包 下面的 类的。
除非 我们手动自定义了 配置的包扫描路径。这样的原理 不管是 使用 那种方式 启动项目都是一样的
我的demo类
这样我们才可以使用 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
我的demo
可以 这样的:
使用 maven命令;
那么多种 启动方式, 我推荐我们测试开发的时候 ,使用 main方法,即第一种方式启动。
因为 感觉这样 项目 编译的快,反应快, 对于测试开发来说还是挺好的。 使用tomcat 部署, 反应慢一下,而且 很可能改动了之后 需要重新编译后 才会起效果的,不然tomcat 会比较迟钝的, 特别是对于渣渣电脑来说了。 main 方法一个好处地方就是,,,可以 针对于 一个 controller 测试。
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 测试。
相关文章推荐
- spring boot 项目打包jar 启动方式,以及 可能遇到的坑。
- 启动spring boot项目的三种方式
- gradle构建的springboot项目的三种启动方式
- spring boot 项目三种启动方式
- 常识-SpringBoot项目的启动方式
- <springBoot>(三)(入门篇)新建一个springBoot项目(两种启动的方式)
- springboot项目启动方式
- gradle启动springboot项目进行远程调试
- IDEA+gradle +SpringBoot 项目,bootrun 无法启动项目
- Spring boot项目Tomcat启动与切换
- SpringBoot学习(2)——SpringBoot启动方式
- SpringBoot项目在eclipse启动成功,在idea中失败
- SpringBoot小彩蛋,自定义项目启动时图案
- spring boot 启动方式
- springboot项目第一次启动报错
- Spring-boot 微服务jar包方式启动,获取jar内资源文件到本地磁盘
- IDEA启动Spring Boot项目提示Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServlet...
- springboot项目访问静态资源(默认方式)
- springboot项目修改启动端口
- springboot+angular项目 使用token方式进行权限验证