Spring Boot中自带有Tomcat容器,因此Spring Boot项目只需要运行main函数,就可以运行,但是以往的web项目,我们习惯于使用自己安装的Tomcat运行或者使用Tomcat、Jetty插件来运行项目,方便简单,同时部署也是简单,只需要把生成的war包放在Tomcat的webapps下面,然后重启Tomcat,就可以访问项目了。那么Spring Boot想通过上面的方式部署和访问,应该如何操作呢?

其实主要的思路就是把Spring Boot自带的Tomcat屏蔽掉,然后引入新的Tomcat,这样就可以了,也就达到了使用Spring Boot轻松开发web项目,简单部署了。

本文的项目是基于Maven的多模块开发的,因此需要有一点这个基础,如果还不太了解看一下这篇博客http://www.cnblogs.com/advancing/category/1123469.html

具体的使用外部容器部署的实现方式如下:

1.在父级中设置以下配置

<!-- 这里指定打包的时候不再需要tomcat相关的包 更改打war包加入的配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>

父级pom中添加Tomcat、Jetty插件,子模块中才会继承,之后再根据子模块的特性去重新修改插件参数,如端口、编码....

<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<!--如果在这设置属性(port、path),模块的path就不起作用了-->
<configuration>
<uriEncoding>UTF-8</uriEncoding>
<!--<port>9080</port>-->
<!--<path>/</path>-->
</configuration>
</plugin> <plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${jetty-version}</version>
<configuration>
<jvmArgs>-Dfile.encoding=UTF-8</jvmArgs>
</configuration>
</plugin> <!--surefire-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>

2.在子模块中新建一个和Spring Boot含有main方法的类同级的一个修改启动类的方法

/**
* 修改启动类,继承 SpringBootServletInitializer 并重写 configure 方法
* Created by kk on 2017/11/21.
*/
public class SpringBootStartApplication extends SpringBootServletInitializer { @Override
public SpringApplicationBuilder configure(SpringApplicationBuilder builder){
return builder.sources(含有Main方法的类名.class);
} }

3.子模块pom中添加打包所依赖的插件,以及Tomcat、Jetty插件。

<plugins>
<!--spring-boot为了保护application.yml和application.properties,修改了默认的占位符${...}为@...@-->
<!--为了spring boot的yml和properties文件能够使用maven变量替换,使用${}占位符-->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>utf-8</encoding>
<useDefaultDelimiters>true</useDefaultDelimiters>
</configuration>
</plugin> <plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--指定该Main Class为全局的唯一入口-->
<mainClass>cn.XX.wechat.authorization.XXWechatAuthorizationCloudApplication</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<!--可以把依赖的包都打包到生成的Jar包中-->
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin> <!-- 这个配置是打包war包需要的 maven打包的时候告诉maven不需要web.xml,否刚会报找不到web.xml错误 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<!--<version>2.4</version>-->
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin> <plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- Tomcat启动 直接访问http://localhost:8080/ -->
<!--<url>http://localhost:8080/</url>-->
<!--<server>tomcat</server>-->
<!--<username>manager</username>-->
<!--<password>manager.123</password>-->
<!--<path>/</path>-->
<uriEncoding>UTF-8</uriEncoding>
<path>/${project.module.name}</path>
<port>8866</port>
</configuration>
</plugin> <plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${jetty-version}</version>
<configuration>
<jvmArgs>-Dfile.encoding=UTF-8</jvmArgs>
<systemProperties>
<systemProperty>
<name>jetty.port</name>
<value>9083</value>
</systemProperty>
<systemProperty>
<name>org.eclipse.jetty.server.Request.maxFormContentSize</name>
<value>-1</value>
</systemProperty>
</systemProperties>
<stopKey>stop</stopKey>
<stopPort>5599</stopPort>
<webAppConfig>
<contextPath>/${project.module.name}</contextPath>
<parentLoaderPriority>true</parentLoaderPriority>
</webAppConfig>
<scanIntervalSeconds>0</scanIntervalSeconds>
</configuration>
</plugin>
</plugins>

4.这样在本地就可以运用自己配置的容器运行了,成功之后子模块会有以下标志。

5.如果需要对子模块发布到生产上,需要子模块设置packaging为war,在父模块先mvn install(因为对其他模块有依赖),然后在mvn package,之后将生成的war包放在生产就OK了。

延伸一点:

使用Spring Boot自带的Tomcat开发,不做如上操作,该如何部署Spring Boot项目呢,有两种方式:

一:将Spring Boot项目生成一个jar包,然后通过。

1.cmd进入到Spring Boot项目打包成的jar文件目录
2.运行java -Xms128m -Xmx256m -jar 项目jar名.jar

nohup /opt/appstack/java/bin/java -Xms128m -Xmx256m -jar /opt/appstack/apps/test/release/eureka-center.jar &

3.访问项目中定义的路径

二:通过Docker来部署。

Spring Boot 的Maven多模块开发web项目使用外部容器进行部署的更多相关文章

  1. 【源码解析】凭什么?spring boot 一个 jar 就能开发 web 项目

    问题 为什么开发web项目,spring-boot-starter-web 一个jar就搞定了?这个jar做了什么? 通过 spring-boot 工程可以看到所有开箱即用的的引导模块 spring- ...

  2. Maven多模块开发SpringBoot项目自定义第三方依赖版本

    参考:官方文档 - Build System of Maven https://blog.didispace.com/books/spring-boot-reference/IX. 'How-to' ...

  3. spring boot + vue + element-ui全栈开发入门——项目部署

     前言 常用的部署方式有两种: 1.是把生成好的静态页面放到spring boot的static目录下,与打包后的spring boot项目一起发布,当spring boot运行起来后,自然而然就能访 ...

  4. spring boot + Thymeleaf开发web项目

    "Spring boot非常适合Web应用程序开发.您可以轻松创建自包含的HTTP应用.web服务器采用嵌入式Tomcat,或者Jetty等.大多数情况下Web应用程序将使用 spring- ...

  5. spring boot + vue + element-ui全栈开发入门——开篇

    最近经常看到很多java程序员朋友还在使用Spring 3.x,Spring MVC(struts),JSP.jQuery等这样传统技术.其实,我并不认为这些传统技术不好,而我想表达的是,技术的新旧程 ...

  6. spring boot + vue + element-ui全栈开发入门

    今天想弄弄element-ui  然后就在网上找了个例子 感觉还是可以用的  第一步是完成了  果断 拿过来  放到我这里这  下面直接是连接  点进去 就可以用啊 本想着不用vue   直接导入连接 ...

  7. Spring Boot集成MyBatis开发Web项目

    1.Maven构建Spring Boot 创建Maven Web工程,引入spring-boot-starter-parent依赖 <project xmlns="http://mav ...

  8. spring+springmvc+hibernate架构、maven分模块开发样例小项目案例

    maven分模块开发样例小项目案例 spring+springmvc+hibernate架构 以用户管理做測试,分dao,sevices,web层,分模块开发測试!因时间关系.仅仅測查询成功.其它的准 ...

  9. 使用Spring Boot开发Web项目(二)之添加HTTPS支持

    上篇博客使用Spring Boot开发Web项目我们简单介绍了使用如何使用Spring Boot创建一个使用了Thymeleaf模板引擎的Web项目,当然这还远远不够.今天我们再来看看如何给我们的We ...

随机推荐

  1. linux 计划任务(crontab)

    每天写一点,总有一天我这条咸鱼能变得更咸 cron服务是一个linux下 的定时执行工具,可以在无需人工干预的情况下运行作业.频率可以划分为 分钟 小时 天 月 周,格式如下: 1.crontab 服 ...

  2. win10 uwp clone

    clone 可以用MemberwiseClone来复制一个类 但这个复制是浅复制,创建一个新的object然后复制值字段,对于引用就直接复制引用,不复制引用的本身,指向同样引用 如果要复制引用,可以使 ...

  3. 彻底了解构建 JSON 字符串的三种方式

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7701856.html 前言:JSON 是轻量级的数据交换格式,很常用,尤其是在使用 Ajax ...

  4. vim中SnipMate 和 YouCompleteMe 插件触发键 tab 冲突

    花了好几天废了九牛二虎之力终于在win下把ycm插件装上了 然而在配置插件的时候发现snipmate插件与youcompleteme插件会发生tab键冲突 而ycm比较调,直接使snipmate插件完 ...

  5. Ubuntu软件中心卡在正在应用更改的解决办法

    http://forum.ubuntu.org.cn/viewtopic.php?t=374037 http://forum.ubuntu.org.cn/viewtopic.php?p=2743994 ...

  6. C++点滴20130724

    warning c4627:"#include stdafx.h":在查找预编译头使用时跳过 原因: 1.没有添加 #include "stdafx.h" 2. ...

  7. Servlet 笔记-异常处理

    当一个 Servlet 抛出一个异常时,Web 容器在使用了 exception-type 元素的 web.xml 中搜索与抛出异常类型相匹配的配置. 必须在 web.xml 中使用 error-pa ...

  8. [CF] Final Exam Arrangement

    问题链接:http://www.bnuoj.com/v3/contest_show.php?cid=4329#problem/F   问题大意:         就是有1--N们课程,每一个课程都有一 ...

  9. 对于Swift的Enum,文档上没有说的

    今天无意发现一个东西, 但是在文档上看了很多遍都没找到, 但是亲测是可行的, 那到底是什么呢? 以前我们定义枚举 会这样: enum Hello { case Item( String, Int) c ...

  10. C Run-Time Error R6034问题的解决

    1.问题描述 这两天一直在用vs2008编写一个小项目,需要在c++代码中通过命令行的方式调用cl.exe和link.exe,也就是给编译器cl和链接器link传递参数,然后编译链接生成可执行文件ex ...