如何用嵌入式服务器运行Jakarta EE应用?部署故障求助
单命令启动Jakarta EE应用(嵌入式服务器+H2数据库)问题排查
我需要创建一个基于嵌入式Web服务器和嵌入式H2数据库的Jakarta EE Web应用,实现单命令启动。该应用部署到独立Glassfish实例时运行正常,但使用嵌入式服务器时失败,已尝试cargo-maven3-plugin和wildfly-maven-plugin两种插件。
故障详情
- Payara(cargo插件):执行
mvn clean package cargo:run后,服务器启动后随即停止,部署失败,报错包含org/hibernate/bytecode/enhance/spi/EnhancementContextWrapper类找不到的信息。 - Wildfly(wildfly插件):执行
mvn clean package wildfly:dev后,服务器启动失败,提示glassfish-resources.xml路径不符合配置要求。
解决方案
一、修复Payara+cargo插件问题
问题根源
Payara内置了兼容Jakarta EE的Hibernate版本,项目中自行引入的Hibernate Core与内置版本冲突,导致字节码增强相关类加载异常;同时不必要的连接池依赖也会引发兼容性问题。
修改步骤
- 调整pom.xml依赖:将Hibernate Core设为
provided范围,移除commons-dbcp2依赖:
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.28</version> </dependency> <dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-api</artifactId> <version>${jakartaee-api.version}</version> <scope>provided</scope> </dependency> <!-- 使用Payara内置Hibernate,改为provided范围 --> <dependency> <groupId>org.hibernate.orm</groupId> <artifactId>hibernate-core</artifactId> <version>6.2.6.Final</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>2.1.214</version> </dependency> <!-- 移除commons-dbcp2,使用Payara内置连接池 --> </dependencies>
- 修改glassfish-resources.xml:改用H2官方数据源实现,避免自定义连接池冲突:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd"> <resources> <jdbc-connection-pool datasource-classname="org.h2.jdbcx.JdbcDataSource" name="embeddedConnPool" res-type="javax.sql.DataSource"> <property name="URL" value="jdbc:h2:mem:dataSource;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false" /> <property name="User" value="root" /> <property name="Password" value="qwerty" /> </jdbc-connection-pool> <jdbc-resource jndi-name="java:app/jdbc/embeddedDS" pool-name="embeddedConnPool" enabled="true" /> </resources>
二、修复Wildfly+maven插件问题
问题根源
Wildfly不识别GlassFish的资源配置格式,且server-config参数指向的路径不符合Wildfly的配置规范,需要改用Wildfly原生的数据源配置方式。
修改步骤
- 调整pom.xml中的wildfly插件配置:移除无效的
server-config,添加H2驱动自动部署:
<plugin> <groupId>org.wildfly.plugins</groupId> <artifactId>wildfly-maven-plugin</artifactId> <version>${wildfly-plugin.version}</version> <configuration> <version>${wildfly.version}</version> <!-- 自动部署H2驱动 --> <deploy-artifacts> <artifact> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>2.1.214</version> </artifact> </deploy-artifacts> </configuration> </plugin>
- 创建Wildfly兼容的数据源配置文件:在
src/main/resources/META-INF下新建wildfly-ds.xml:
<?xml version="1.0" encoding="UTF-8"?> <datasources xmlns="http://www.jboss.org/ironjacamar/schema"> <datasource jndi-name="java:app/jdbc/embeddedDS" pool-name="embeddedConnPool" enabled="true" use-java-context="true"> <connection-url>jdbc:h2:mem:dataSource;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false</connection-url> <driver>h2</driver> <security> <user-name>root</user-name> <password>qwerty</password> </security> </datasource> <drivers> <driver name="h2" module="com.h2database.h2"> <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class> </driver> </drivers> </datasources>
- 修改persistence.xml的JTA平台:适配Wildfly的JTA实现:
<properties> <property name="jakarta.persistence.schema-generation.database.action" value="drop-and-create"/> <!-- 替换为Wildfly专用JTA平台 --> <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" /> </properties>
测试验证
- Payara启动:执行
mvn clean package cargo:run - Wildfly启动:执行
mvn clean package wildfly:dev - 访问接口:
curl.exe -X GET http://localhost:8080/myapp/rest/person/all/
内容的提问来源于stack exchange,提问作者Podbrushkin
相关产品推荐
相关产品推荐

