背景
公司项目传统的tomcat方式运行,需要改造成springBoot的体系。对于改造这东西听着就知道会有不少坑,何况还有很多公司自研的框架在里面。处理掉web.xml变成@EnableMVC自动配置就花了我不少时间分析和改造公司自研的CGI框架。后来发现fineReport的坑也不小,花了很多时间寻找解决方案索性顺利解决,分享给后面需要的人尽量少走坑。
场景分析
Tomcat方式运行的项目是本地开发和生产部署都运行在tomcat中间件中,FineReport的资源文件统一放在webapp/WEB-INF/目录下最终一起打包到war里面。fr(fineReport缩写)采用WEB-INF目录配置很好的融合了tomcat为构建基础的项目并尽可能做到配置傻瓜化。
现在的微服务框架springboot采用的内置tomcat方式本地直接run mainclass和生产环境可执行jar(或war)方式运行,已经没有webapp目录也没有war包部署tomcat,所以面临几个问题:
- 1、原来在web.xml里面配置fr的ReportServlet如何在springboot里面配置?
- 2、fr的resources、reportlets、lib、plugins这些资源文件springboot项目如何存放?
- 3、fr的资源文件如何打包配置?生产环境如何?
- 4、可执行jar和war是否支持fr的资源读取?之前就遇到很多坑。
- 5、本地开发测试如何运行fr环境?
找了大量资料得出两个解决方向:
- 半SpringBoot方式融合webapp目录war方式部署到tomcat中,本地springboot插件命令:maven springboot:run运行。
- 完全SpringBoot可执行jar或war部署,本地采用run mainClass方式运行。
详细解决方案
以war方式部署到tomcat中运行、本地采用springboot:run运行
1、保留src/main/webapp/WEB-INF/目录,即保留fr的资源文件。
2、在maven pom.xml中配置spring-boot-maven-plugin,一般默认打包会把webapp/WEB-INF目录打包到war中,不行就自己配置个
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<mainClass>com.isesol.rent.platform.RentApplication</mainClass>
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
<finalName>ROOT</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
3、配置maven的systemPath加载本地jar方式处理fr的lib/*.jar问题,或者你把jar上传到自己公司的nexus上在配置pom也行。
<dependency>
<groupId>com.fr</groupId>
<artifactId>fr-third</artifactId>
<version>8.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/fr-third-8.0.jar</systemPath>
</dependency>
4、springboot的web配置。
<packaging>war</packaging>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
5、采用SpringBoot的ServletRegistrationBean和@Bean配置ReportServlet,可以配置在Applicaiton中也可以配置在mvc的配置文件里面。
@Configuration
@EnableWebMvc
public class MvcConfig {
@Bean
public ServletRegistrationBean frReportServlet() {
ServletRegistrationBean bean1 = new ServletRegistrationBean(new ReportServlet(),"/ReportServer");
bean1.setLoadOnStartup(0);
bean1.setName("ReportServlet");
return bean1;
}
}
6、maven插件命令:maven springboot:run 运行本地开发;
7、采用maven package构建war包部署到tomcat/webapp目录下。
可执行jar或war直接提供服务,本地直接run mainClass开发测试
其他配置和上面一样,目前还在解决fr的资源加载bug,会持续研究。
作者:Owen Jia,推荐关注他的博客:Owen Blog。