Spring Boot部署JBoss EAP6.3时JSP源码直接显示问题求助
你的问题很典型——Spring Boot在嵌入式Tomcat里能正常解析JSP和Tiles标签,但放到JBoss EAP6.3上就直接输出源码,这主要是外部容器的JSP处理机制和Spring Boot自动配置的适配问题。下面是一步步的解决办法:
1. 清理冲突依赖
JBoss EAP6.3自带了专属的JSP引擎和Servlet实现,你的pom里有些Tomcat特有的依赖会干扰它的正常工作:
- 直接移除
tomcat-embed-jasper和ecj依赖,这俩是嵌入式Tomcat用来编译JSP的,JBoss完全不需要 - 你已经排除了
spring-boot-starter-tomcat,这步没问题,继续保持
需要删掉的依赖片段:
<!-- To compile JSP files --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> <!-- Need this to compile JSP --> <dependency> <groupId>org.eclipse.jdt.core.compiler</groupId> <artifactId>ecj</artifactId> <version>4.6.1</version> <scope>provided</scope> </dependency>
2. 让启动类适配外部容器
部署到外部Servlet容器时,Spring Boot必须通过SpringBootServletInitializer来初始化上下文,否则JBoss没法正确识别Spring的配置。修改你的启动类:
@SpringBootApplication public class SpringBootAppApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(SpringBootAppApplication.class); } public static void main(String[] args) { SpringApplication.run(SpringBootAppApplication.class, args); } }
3. 配置视图解析器和Tiles
在application.properties里添加视图解析规则,确保Spring能找到JSP文件,同时让Tiles视图生效:
# 根据你的JSP实际存放路径调整前缀 spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.jsp # 让Tiles视图解析器优先生效 spring.mvc.view.order=0
同时,确保你已经配置了Tiles的核心Bean(如果还没加的话):
@Configuration public class TilesConfiguration { @Bean public TilesConfigurer tilesConfigurer() { TilesConfigurer configurer = new TilesConfigurer(); configurer.setDefinitions("/WEB-INF/tiles.xml"); // 你的tiles配置路径 configurer.setCheckRefresh(true); return configurer; } @Bean public ViewResolver tilesViewResolver() { TilesViewResolver resolver = new TilesViewResolver(); return resolver; } }
4. 添加JBoss专属配置文件
在src/main/webapp/WEB-INF下创建jboss-web.xml,告诉JBoss正确处理JSP请求:
<?xml version="1.0" encoding="UTF-8"?> <jboss-web xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-web_7_0.xsd" version="7.0"> <!-- 让JBoss的JSP引擎处理所有.jsp请求 --> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping> <!-- 设置应用根路径,避免映射冲突 --> <context-root>/</context-root> </jboss-web>
5. 调整DispatcherServlet映射
你之前设置的server.servlet-path=/*会让Spring的DispatcherServlet拦截所有请求,包括JSP,导致JBoss的JSP引擎没机会处理。改成:
server.servlet-path=/
这样DispatcherServlet只会处理业务请求,JSP请求会直接交给JBoss的JSP引擎解析。
6. 验证WAR包结构
确保你的WAR包符合标准结构,比如:
SpringBootApp.war ├── WEB-INF │ ├── classes │ │ ├── 编译后的类文件 │ │ └── application.properties │ ├── lib │ │ ├── 依赖jar包 │ ├── views │ │ ├── 你的JSP文件 │ ├── tiles.xml │ └── jboss-web.xml └── META-INF └── MANIFEST.MF
做完这些修改后,重新打包部署到JBoss EAP6.3,应该就能正常解析JSP和Tiles标签了。
内容的提问来源于stack exchange,提问作者Ranjani

