当前位置: 首页 > news >正文

SpringBoot构建工程中的一些坑

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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模式下启用

加载

启动先加载bootstrap.yml,从远端获取application.yml覆盖本地。

若指定scanBasePackages(包及子包下)则扫描指定路径,否则默认加载启动main方法类的包路径。

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }, scanBasePackages={"com.noob.mics"})

WebEnvironment

SpringApplicationinitialize方法:判定Classloader成功加载接口类"javax.servlet.Servlet"、
"org.springframework.web.context.ConfigurableWebApplicationContext"中的任意一个即设置
webEnvironment = true
150505_2Mpa_3434392.png
开启Web环境,将加载AnnotationConfigEmbeddedWebApplicationContext  

142924_kZxJ_3434392.png

---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;

可内嵌容器:151603_haWr_3434392.png

外部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=/projectName 一致。
    <build>
        <finalName>projectName</finalName>
    </build>

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

  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.noob.loan.route" })
    @ImportResource(locations = "classpath*:spring/applicationContext-per.xml")
    @MapperScan(basePackages = "com.noob.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);
    		}
    
    	}
    
    }

集成mybatis

application.yml:

mybatis: 
        typeAliasesPackage: com.noob.domain
        config: classpath:mybatis-config.xml

@MapperScan(basePackages = "com.noob.core.dao") 是必须的。 

在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>

Q&A

错误开启webEnvironment

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

启动报错:

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

183551_U2xx_3434392.png

原因:

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

解决方法:

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>

 

转载于:https://my.oschina.net/u/3434392/blog/1486298

相关文章:

  • dubbo服务调用超时问题解决方案
  • Spring Boot中使用@Async实现异步调用
  • Red and Black (DFS)
  • eclipse实现JavaWeb项目 增量打包
  • Dubbo框架介绍与安装 Dubbo 注册中心(Zookeeper-3.4.6)
  • 鼠标悬停在图片时出现×。然后删除图片
  • Laravel的本地化
  • File:方法(具体)
  • bzoj 2510 弱题 矩阵乘
  • CentOS的进程管理二
  • 深入浅出iOS事件机制
  • phpStudy配置多站点多域名步骤,及遇到的403错误解决方式
  • 模拟ajax实现网络爬虫——HtmlUnit
  • 关于冰岛足球的段子
  • Hadoop简单介绍
  • [数据结构]链表的实现在PHP中
  • centos安装java运行环境jdk+tomcat
  • CentOS从零开始部署Nodejs项目
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java-详解HashMap
  • PHP面试之三:MySQL数据库
  • Service Worker
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Spring框架之我见(三)——IOC、AOP
  • Vue实战(四)登录/注册页的实现
  • 大主子表关联的性能优化方法
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 近期前端发展计划
  • 坑!为什么View.startAnimation不起作用?
  • 力扣(LeetCode)22
  • 聊聊sentinel的DegradeSlot
  • 前端攻城师
  • 前端路由实现-history
  • 设计模式 开闭原则
  • 用Visual Studio开发以太坊智能合约
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 如何用纯 CSS 创作一个货车 loader
  • $$$$GB2312-80区位编码表$$$$
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (11)MSP430F5529 定时器B
  • (Java)【深基9.例1】选举学生会
  • (笔试题)分解质因式
  • (二)Eureka服务搭建,服务注册,服务发现
  • (二)PySpark3:SparkSQL编程
  • (二)换源+apt-get基础配置+搜狗拼音
  • (分类)KNN算法- 参数调优
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)计算机毕业设计大学生兼职系统
  • (全注解开发)学习Spring-MVC的第三天
  • (算法)Travel Information Center
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (原創) 系統分析和系統設計有什麼差別? (OO)