Spring Boot+Jetty+JPA+MySQL项目配置及Jetty部署异常排查
解决Spring Boot 2.0.2 + Jetty 9.4.1部署时ASM模块扫描错误问题
问题原因
Jetty 9.4.1.v20170120的注解扫描组件对Java 9引入的module-info.class文件兼容性不佳,而你使用的Spring Boot 2.0.2.RELEASE依赖的ASM版本是6.1.1(该版本包含Java 9模块支持),当Jetty扫描WEB-INF/lib下的ASM相关jar包时,会因为无法解析module-info.class而抛出启动异常。
解决方案
1. 降级ASM版本到Jetty兼容的版本
在你的pom.xml中,排除Spring Boot依赖链中自带的ASM 6.x版本,手动引入Jetty 9.4.1兼容的ASM 5.x版本(推荐5.2.4):
修改后的pom.xml依赖部分:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> <!-- 排除自带的ASM 6.x --> <exclusion> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> </exclusion> <exclusion> <groupId>org.ow2.asm</groupId> <artifactId>asm-tree</artifactId> </exclusion> <exclusion> <groupId>org.ow2.asm</groupId> <artifactId>asm-analysis</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> <!-- 排除Jetty依赖的ASM,统一用我们指定的版本 --> <exclusions> <exclusion> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> </exclusion> <exclusion> <groupId>org.ow2.asm</groupId> <artifactId>asm-tree</artifactId> </exclusion> <exclusion> <groupId>org.ow2.asm</groupId> <artifactId>asm-analysis</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入兼容Jetty 9.4.1的ASM版本 --> <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> <version>5.2.4</version> </dependency> <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm-tree</artifactId> <version>5.2.4</version> </dependency> <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm-analysis</artifactId> <version>5.2.4</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
2. 确保Spring Boot WAR包的正确打包配置
你的主启动类需要继承SpringBootServletInitializer,这样Jetty才能正确识别并启动Spring Boot应用:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication public class JettyTestApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(JettyTestApplication.class, args); } }
Spring Boot + Jetty + JPA + MySQL 完整配置模板
1. 补充JPA和MySQL依赖到pom.xml
<!-- JPA依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
2. application.yml配置(放在src/main/resources下)
spring: datasource: url: jdbc:mysql://你的MySQL地址:3306/数据库名?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC username: 数据库用户名 password: 数据库密码 driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update # 根据实体自动更新表结构,生产环境建议用none或validate show-sql: true # 打印SQL语句,调试用 properties: hibernate: format_sql: true # 格式化SQL输出
验证步骤
- 执行
mvn clean package重新打包WAR包 - 将新的WAR包上传到Jetty的
webapps目录 - 启动Jetty,观察日志是否正常启动
内容的提问来源于stack exchange,提问作者Manuel Vergara
相关产品推荐
相关产品推荐

