Spring Boot 2.0.1生成的War包能否部署到JBoss EAP 6.4?求技术指导
部署Spring Boot 2.0.1 War包到JBoss EAP 6.4的可行方案
当然有成功案例!我之前帮朋友处理过类似的部署问题,Spring Boot 2.0.1和JBoss EAP 6.4之间的核心冲突主要是Servlet、JPA版本不兼容以及容器自带库的冲突,按下面的步骤调整应该能解决:
1. 适配Servlet版本
JBoss EAP 6.4基于Java EE 6,仅支持Servlet 3.0,但Spring Boot 2.x默认依赖Servlet 3.1,这是最常见的冲突点。你需要在pom.xml里强制指定Servlet版本并排除Spring Boot自带的Servlet API:
<properties> <!-- 匹配JBoss EAP 6.4支持的Servlet版本 --> <servlet-api.version>3.0.1</servlet-api.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!-- 排除Spring Boot自带的Servlet API --> <exclusion> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入容器提供的Servlet API --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${servlet-api.version}</version> <scope>provided</scope> </dependency> </dependencies>
2. 修改启动类适配War部署
Spring Boot的War包部署需要让启动类继承SpringBootServletInitializer,并重写configure方法,这样JBoss才能正确识别并启动Spring应用:
@SpringBootApplication public class YourApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(YourApplication.class); } public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
3. 排除与JBoss冲突的依赖
JBoss EAP 6.4自带了Hibernate(4.3.x)、JPA 2.0等库,和Spring Boot starter里的默认依赖版本冲突,需要排除并适配:
处理JPA/Hibernate冲突
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <exclusions> <exclusion> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> </exclusion> <exclusion> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入JBoss兼容的Hibernate版本 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.3.11.Final</version> <scope>provided</scope> </dependency> <!-- 适配JPA 2.0版本 --> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> <version>1.0.1.Final</version> <scope>provided</scope> </dependency>
排除内嵌Tomcat
打包War时必须把内嵌Tomcat标记为provided,避免和JBoss的容器冲突:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
4. 添加JBoss部署描述符
在src/main/webapp/WEB-INF下创建jboss-deployment-structure.xml,明确排除容器自带的冲突模块:
<jboss-deployment-structure> <deployment> <exclusions> <module name="org.hibernate" /> <module name="javax.persistence.api" /> <module name="javax.servlet.api" /> </exclusions> </deployment> </jboss-deployment-structure>
最后检查点
- 确保JBoss EAP 6.4使用的是Java 8(Spring Boot 2.0.x要求最低Java 8),可以在JBoss的
bin/standalone.conf里配置JAVA_HOME指向Java 8目录。 - 打包用
mvn clean package生成War包,部署到JBoss的standalone/deployments目录后,查看standalone/log/server.log,如果还有错误,根据日志提示针对性调整(比如其他依赖冲突)。
内容的提问来源于stack exchange,提问作者Tao Lu
相关产品推荐
相关产品推荐

