FineReport的SpringBoot整合方案

Owen Jia 2018年12月20日 237次浏览

背景

公司项目传统的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中,不行就自己配置个。配置maven-war-plugin设置不需要web.xml为必须。

<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