You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用嵌入式服务器运行Jakarta EE应用?部署故障求助

单命令启动Jakarta EE应用(嵌入式服务器+H2数据库)问题排查

我需要创建一个基于嵌入式Web服务器和嵌入式H2数据库的Jakarta EE Web应用,实现单命令启动。该应用部署到独立Glassfish实例时运行正常,但使用嵌入式服务器时失败,已尝试cargo-maven3-plugin和wildfly-maven-plugin两种插件。

故障详情

  1. Payara(cargo插件):执行mvn clean package cargo:run后,服务器启动后随即停止,部署失败,报错包含org/hibernate/bytecode/enhance/spi/EnhancementContextWrapper类找不到的信息。
  2. Wildfly(wildfly插件):执行mvn clean package wildfly:dev后,服务器启动失败,提示glassfish-resources.xml路径不符合配置要求。

解决方案

一、修复Payara+cargo插件问题

问题根源

Payara内置了兼容Jakarta EE的Hibernate版本,项目中自行引入的Hibernate Core与内置版本冲突,导致字节码增强相关类加载异常;同时不必要的连接池依赖也会引发兼容性问题。

修改步骤

  1. 调整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>
  1. 修改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原生的数据源配置方式。

修改步骤

  1. 调整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>
  1. 创建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>
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:45:54