文档章节

SpringBoot构建工程中的一些坑

noob_fly
 noob_fly
发布于 2017/07/24 15:39
字数 746
阅读 31
收藏 0
点赞 0
评论 0

pom配置

默认打成jar,在pom.xml中指定mainClass。

<properties>
    <mainClass>com.noob.Bootstrap</mainClass>
</properties>

<plugins> 
  <plugin> 
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-maven-plugin</artifactId>  
    <version>${spring-boot.version}</version>  
    <configuration> 
      <fork>true</fork> 
    </configuration>  
  </plugin> 
</plugins>

项目根目录下执行mvn package生成可执行的jar包, jar包中MANIFEST.MF文件会显示mainclass。

启动

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter</artifactId>
    <version>1.3.6.RELEASE</version>
</dependency>

@RestController @Controller + @ResponseBody;

@SpringBootApplication =@Configuration + @EnableAutoConfiguration + @ComponentScan;

  • 常规方式
    SpringApplication.run(CreditBootstrap.class, args);
  • 可设置参数
    new SpringApplicationBuilder(CreditBootstrap.class).run(args)

返回一个ConfigurableApplicationContext对象

  • org.springframework.context.annotation.AnnotationConfigApplicationContext
  • org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext  -----在支持web模式下启用

WebEnvironment

SpringApplicationinitialize方法:判定Classloader成功加载接口类"javax.servlet.Servlet"、
"org.springframework.web.context.ConfigurableWebApplicationContext"中的任意一个即设置
webEnvironment = true

开启Web环境,将加载AnnotationConfigEmbeddedWebApplicationContext  

---Spring-context
public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable;

---Spring-web
public interface WebApplicationContext extends ApplicationContext;

---Spring-context
public abstract class AbstractApplicationContext 
extends DefaultResourceLoader implements ConfigurableApplicationContext, DisposableBean;

---Spring-context
public class GenericApplicationContext 
extends AbstractApplicationContext implements BeanDefinitionRegistry;

---Spring-web
public interface ConfigurableWebApplicationContext 
extends WebApplicationContext, ConfigurableApplicationContext;

---Spring-web
public class GenericWebApplicationContext 
extends GenericApplicationContext implements ConfigurableWebApplicationContext, ThemeSource;

---Spring-boot
public class EmbeddedWebApplicationContext extends GenericWebApplicationContext;

可内嵌容器:

外部tomcat

步骤:

  1. 修改pom.xml:
    <packaging>war</packaging>
    
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-web</artifactId>
    	<version>1.3.6.RELEASE</version>
        <!-- 移除嵌入式tomcat插件 -->
        <exclusions>
          <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
          </exclusion>
        </exclusions>
    </dependency>
    打成war包的名称须和application.properties中server.context-path=/spring-boot 一致。
    <build>
        <finalName>spring-boot</finalName>
    </build>

    spring-boot-starter-web内嵌tomcat, 如果需要本地调试可以不移除。

  2. 添加servlet-api的依赖(二选一)

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    
    ---
    
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-servlet-api</artifactId>
      <version>8.0.36</version>
      <scope>provided</scope>
    </dependency>
  3. 启动类继承SpringBootServletInitializer类:
    public abstract class SpringBootServletInitializer implements WebApplicationInitializer 
    @SpringBootApplication(scanBasePackages = { "com.iboxpay.loan.route" })
    @ImportResource(locations = "classpath*:spring/applicationContext-per.xml")
    @MapperScan(basePackages = "com.iboxpay.loan.route.dao")
    @Slf4j
    public class RouteConsoleBootstrap extends SpringBootServletInitializer {
    
    	private static Class<RouteConsoleBootstrap> applicationClass = RouteConsoleBootstrap.class;
    
    	@Override
    	protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
    		return builder.sources(applicationClass);
    	}
    
    	/**
    	 * 还有一种:in a single line in application.properties:
    	 * server.context_parameters.p-name=-value
    	 * 
    	 */
    	@Override
    	public void onStartup(ServletContext servletContext) throws ServletException {
    		servletContext.setAttribute("contextConfigLocation",
               "classpath*:applicationContext-per.xml"); // 测试结果该设置无效,设置前后都为<NONE>
    		servletContext.setAttribute("failUrl", "/");
    		servletContext.setAttribute("unauthorizedUrl", "/deny.jsp");
    		servletContext.setAttribute("notFilterUrl", "");
    		super.onStartup(servletContext);
    	}
    
    	/** 本地调试使用 **/
    	public static void main(String[] args) {
    		try {
    			new SpringApplicationBuilder(applicationClass).run(args);
    			Object lock = new Object();
    			synchronized (lock) {
    				try {
    					while (true)
    						lock.wait();
    				} catch (Exception e) {
    					log.error("application running exception.", e);
    				}
    			}
    		} catch (Exception ex) {
    			log.error("start application exception.", ex);
    		}
    
    	}
    
    }

问题

错误开启webEnvironment

dubbo 2.8.4 中 依赖了 javax.servlet-api 3.1.0 , 导致判定开启webEnvironment =true;

启动报错:

Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:185) ~[spring-boot-1.3.6.RELEASE.jar:1.3.6.RELEASE]
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:158) ~[spring-boot-1.3.6.RELEASE.jar:1.3.6.RELEASE]
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130) ~[spring-boot-1.3.6.RELEASE.jar:1.3.6.RELEASE]
	... 8 common frames omitted

解决方法:  关闭Web环境

new SpringApplicationBuilder(CreditBootstrap.class).web(false).run(args);

打war包报错:提示缺少web.xml

原因:

spring boot项目中引用了依赖包spring-boot-starter-web。该包中引用的spring-boot-starter-tomcat里包含了tomcat嵌入式servlet容器,其不同版本实现的是不同的servlet版本规范。

解决方法:

servlet 3.0 以下的必须有WEB-INF/web.xml;

servlet 3.0 以上(包括)且没有web.xml: maven-war-plugin 下设置failOnMissingWebXml = flase;

<build>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-war-plugin</artifactId>
			<version>2.6</version>
			<configuration>
				<failOnMissingWebXml>false</failOnMissingWebXml>
			</configuration>
		</plugin>
	</plugins>
</build>

集成mybatis

application.yml:

mybatis: 
        typeAliasesPackage: com.iboxpay.loan.routing.domain
        config: classpath:mybatis-config.xml

@MapperScan(basePackages = "com.iboxpay.loan.routing.core.dao") 是必须的。每个mapper上的@Mapper不是必须的。

在mybatis-config.xml文件中配置:

<mappers>
        <mapper resource="mapper/ErrorCodeDetailMapper.xml"/>
        <mapper resource="mapper/ChannelPriorityMapper.xml"/>
        <mapper resource="mapper/RuleInfoMapper.xml"/>
        <mapper resource="mapper/RuleMapper.xml"/>
        <mapper resource="mapper/ChannelSpecifiedMapper.xml"/>
        <mapper resource="mapper/CreditChannelCostMapper.xml"/>
</mappers>

 

Spring Environment 与 disconf 的 ReloadablePropertiesFactoryBean 冲突

 

© 著作权归作者所有

共有 人打赏支持
noob_fly
粉丝 3
博文 37
码字总数 43665
作品 0
南昌
程序员
Docker下ELK三部曲之二:细说开发

本章是《Docker下ELK三部曲》的第二篇,之前的《Docker下ELK三部曲之一:极速体验》部署了ELK,还有一个web应用可以将日志上报到ELK,然后在Kibana提供的页面查询到了日志,今天我们一起深入...

boling_cavalry ⋅ 04/21 ⋅ 0

(一)SpringBoot——helloworld

一、为什么会诞生SpringBoot? 先看看spring的优势: 1、代码解耦、简化开发:代码中不再需要new去构造对象,而是交由spring去管理对象。 2、支持AOP:面向切面的编程,方便进行权限拦截、日...

solidwang ⋅ 04/17 ⋅ 0

学习 Spring Boot 知识看这一篇就够了

从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区、我的博客和我的公号内。粗略的统计了一下总共的文章加起来大概有六十多篇了,其中一部分...

ityouknow ⋅ 05/28 ⋅ 0

SpringBoot2.x整合MyBatis

首先在IDEA中创建一个SpringBoot工程: 选择一些基本的包: 完成创建: 工程创建成功后,补充pom.xml文件中的依赖,完整的依赖如下: 编辑配置文件完成后,打开SpringBoot的启动类,加上@Ma...

ZeroOne01 ⋅ 06/12 ⋅ 0

SpringBoot自定义starter

SpringBoot 提供了众多的starter简化我们开发,为了更好地使用这些starter,了解其原理是很重要的,今天就来自定义一个starter。 1,如何自定义 ①,我们首先要有一个意识,springboot自己适...

暗中观察 ⋅ 05/21 ⋅ 0

恒宇少年/spring-boot-chapter

简书整套文档以及源码解析 专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解 003 Quer...

恒宇少年 ⋅ 04/19 ⋅ 0

springboot打成jar包后配置外部资源映射成静态资源

很多的项目都要上传图片那些,然后通过打包jar包或者war包发布到服务器上,我们不可能把上传图片的文件夹放在jar包或者war包里面,那样会越来越大。所以有了下面的配置,其他框架都好说可以把...

duangecho ⋅ 05/09 ⋅ 0

使用IDE或者向导工具迅速构建一个Spring Boot应用

第一篇简单的内容我们通过敲代码的方式构建了一个Spring Boot应用。 但在实际工作中,应该没有多少人能记住这已经不算太多的模板代码了。 这里介绍一些开发Spring Boot的利器,可以很有效的提...

虾游于海 ⋅ 06/16 ⋅ 0

SpringBoot 入门实例

SpringBoot 是由 pivotal 提供的 Java 开发框架,伴随着 spring 4.0 版本一起发布,旨在简化 Spring 项目的初始化及开发过程,框架本身为开发过程提供了大量的默认配置,当然我们也可以通过简...

Aotian ⋅ 05/29 ⋅ 0

SpringBoot 2.0 系列001 -- 入门介绍以及相关概念

SpringBoot 2.0 系列001 -- 入门介绍以及相关概念 什么是SpringBoot? 项目地址:http://projects.spring.io/spring-boot/ SpringBoot介绍 Spring Boot使开发独立的,产品级别的基于Spring的...

路上有你0314 ⋅ 05/10 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

apollo配置中心的学习笔记

公司现在配置文件太多了,导致配置文件修改起来还是非常麻烦的。在boss(业务运营支撑系统)中,配置文件是存放在jar包的,通过应用jar包来引用配置文件(区分不同环境)。这种方式虽然能够满足...

miaojiangmin ⋅ 4分钟前 ⋅ 0

Jena增删改查AP

插入、更新数据 public static void insert(){ String query = "PREFIX book: <http://www.book.com/jinyong/> \n" + " INSERT DATA \n" + ......

Vincent-Duan ⋅ 4分钟前 ⋅ 0

springMVC之与json数据交互方法

因为我也要返回json数据。所以需要这个注解@ResponseBody,把Java对象转换成json字符串 注意: 1、@RequestBody不能省,因为前台发过来的数据是json数据,得用这个注解去解析该怎么接收这些数...

颖伙虫 ⋅ 8分钟前 ⋅ 0

用实例域代替序号(31)

1、许多枚举天生就与一个单独的int 值相关联 ordinal 方法,返回枚举常量在类型中的数字位置 下述,枚举修改很不方便,不好维护 永远不要根据枚举的序数导出与他相关联的值 而是将他保存在一...

职业搬砖20年 ⋅ 10分钟前 ⋅ 0

并发编程---ConcurrentHashMap源码解析

ConcurrentHashMap是java中为了解决HashMap不能支持高并发而设计的新的实现。 ConcurrentHashMap的类结构 public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements C......

千古一梦888 ⋅ 13分钟前 ⋅ 0

微服务 WildFly Swarm 简介

我们将看到的最后一个Java微服务框架是一个相对较新的场景,它利用了 JBoss WildFly 应用服务器中已试过且受信任的 JavaEE 功能。WildFly Swarm 是 WildFly 应用服务器的一个完整的拆下来的组...

woshixin ⋅ 18分钟前 ⋅ 0

android apk 瘦身

头条APK瘦身之路 随着版本迭代,功能增加安装包体积也会慢慢增大。 今日头条576版本APK达到了25M,通过一系列的优化,到目前的607版本为12M。本文主要是介绍头条APK瘦身中用到的一些方法。 ...

GoldenVein ⋅ 22分钟前 ⋅ 1

mac机器学习开发环境部署及helloworld

一、下载并安装Anaconda2.7 https://repo.anaconda.com/archive/Anaconda2-5.2.0-MacOSX-x86_64.pkg 路径:/Users/shijun/anaconda2 二、运行Anaconda Navigator -> Environments -> base(ro......

八戒八戒八戒 ⋅ 33分钟前 ⋅ 0

关于日常开发的经验总结(Java),持续更新中

常量尽量使用枚举来表示,这样表现力会很强,因为枚举比一个常量类要有更多的扩展性 方法的入参和出参尽量不要使用Map,因为Map会让调用者感到迷惑,他不知道你里面装的什么,面向对象的开发...

小99 ⋅ 33分钟前 ⋅ 0

IDEA创建SpringMVC+Mybatis+Maven项目

视频如下(加载有点慢请见谅,服务器不太好): 视频

影狼 ⋅ 34分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部