ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

WildFly应用服务器核心原理与企业级运维实战

WildFly应用服务器核心原理与企业级运维实战 1. 项目概述为什么今天还要聊 JBossWildFly如果你在某次系统迁移评审会上听到“老系统跑在 JBoss AS 7 上升级得切到 WildFly”或者在某家金融类企业的运维文档里看到“应用部署路径为/opt/wildfly/standalone/deployments/”又或者在排查一个 Java EE 应用的类加载异常时日志里反复出现org.jboss.modules.ModuleClassLoader—— 那么你正在直面一个被严重低估、却仍在关键生产环境中沉默运转的基础设施JBossWildFly应用服务器。它不是云原生时代最耀眼的新星也不是 Spring Boot 内嵌 Tomcat 那样轻量易上手的“默认选项”但它却是过去十五年里支撑大量政企核心业务系统如某省社保结算平台、某大型能源集团设备监控中台、某银行信贷审批后台稳定运行的底层脊梁。WildFly 不是“过时技术”而是一种经过高强度、长周期、多版本演进验证的 Java EE / Jakarta EE 全栈能力交付载体——它把事务管理、JNDI 查找、JMS 消息、安全域配置、集群会话复制、模块化类加载这些企业级刚需封装成一套可配置、可扩展、可审计的运行时契约。我从 2012 年开始接触 JBoss AS 7参与过三个跨年度的遗留系统现代化改造项目其中两个最终选择保留 WildFly 作为主运行容器而非全量迁移到 Spring Boot Kubernetes。原因很实在不是不想换而是换不起——那些深度耦合了 JTA 分布式事务、EJB 远程调用、JCA 连接器、以及自定义 Security Realm 的老模块重写成本远高于运维优化成本。WildFly 的价值恰恰藏在这种“不声张但不可替代”的场景里它不追求启动速度但保证事务一致性它配置略显繁复但提供极细粒度的资源隔离与行为控制它文档风格偏“手册感”但每个 XML 配置项背后都有明确的规范依据和压测数据支撑。这篇文章不讲“WildFly 是什么”也不堆砌官网介绍。我要带你拆开它的外壳看清楚它到底在解决哪一类问题哪些场景下它仍是不可替代的选择它的配置逻辑如何自洽当问题发生时你该盯住哪几行日志、哪几个指标、哪几处配置尤其是当你面对一份没有注释的standalone.xml、一个报错信息模糊的ClassNotFoundException、或是一个 CPU 持续 95% 却查不到热点线程的生产实例时这篇内容就是你打开 WildFly 黑箱的第一把钥匙。2. 核心设计哲学与架构选型逻辑2.1 它不是 Tomcat也不是 Spring Boot理解 WildFly 的存在前提很多初学者会困惑“既然 Spring Boot 内嵌 Tomcat 能跑 WAR为什么还要单独装 WildFly”这个问题本身就暴露了对 Java 企业级应用分层逻辑的误读。我们来做一个生活化类比把一个 Java Web 应用比作一栋住宅楼。Tomcat是“毛坯房基础水电接口”它提供 Servlet 容器、HTTP 接入、基础类加载但你得自己拉线、装开关、接热水器——比如事务要自己配 JTA 实现如 Atomikos消息要自己集成 ActiveMQ 客户端安全认证要自己写 Filter 或 Spring Security 配置。Spring Boot是“精装交付房智能家居中控”它把常见组件数据库连接池、缓存、消息中间件客户端都预装好、配好联动逻辑你只需填入住需求application.yml就能快速入住。但它默认不提供“整栋楼的消防系统审批资质”——即 Jakarta EE 规范的全栈合规性认证。WildFly则是“带全套市政验收文件的标准化工业厂房”它内置了通过 Jakarta EE TCK 认证的事务管理器Narayana、JMS 实现ActiveMQ Artemis、安全管理器PicketBox / Elytron、Web 服务引擎RESTEasy、甚至集群通信协议JGroups。你部署的 WAR/EAR不是“跑起来就行”而是承诺“按标准执行”——比如StatelessEJB 的事务边界、Resource注入的数据源连接、security-constraint定义的 URL 权限都会被 WildFly 的运行时严格校验与执行。所以 WildFly 的核心定位从来不是“更快更轻”而是“更全更稳更可审计”。它的架构选型逻辑围绕三个刚性需求展开规范契约优先必须 100% 兼容 Jakarta EE前身为 Java EE规范。这意味着它的模块加载机制、JNDI 命名空间结构、JTA 事务传播规则全部由 JSR 文档定义而非框架作者的个人偏好。某高校实验室曾用 WildFly 8 验证一个分布式事务论文模型正是因为其 Narayana 实现严格遵循 JTS 规范实验结果具备学术可复现性。运行时可治理性企业级运维要求“看得清、控得住、改得准”。WildFly 提供 CLI命令行接口、Management ConsoleWeb 控制台、HTTP Management API 三套统一管理入口所有操作启停服务、修改线程池、更新数据源、部署应用均生成可审计的操作日志并支持回滚快照。这比手动改server.xmlkill -9的 Tomcat 运维模式高出至少两个成熟度等级。模块化隔离能力WildFly 的jboss-modules.jar是其灵魂所在。它抛弃了传统的双亲委派类加载模型采用“模块依赖声明 显式导出/导入”的方式让每个部署单元WAR/EAR拥有独立的类路径视图。这直接解决了“Log4j 和 Logback 版本冲突”、“不同应用共用同一份 Jackson 配置导致 JSON 序列化异常”等经典难题。我曾处理过一个案例两个业务系统 A 和 B 同时部署在一台 WildFly 上A 依赖旧版 Hibernate Validator 5.x使用javax.validation.*包B 使用 Jakarta EE 9 的 Validator 3.xjakarta.validation.*包WildFly 的模块系统天然隔离二者零冲突。提示WildFly 的模块化不是“炫技”而是为了解决真实痛点。当你看到java.lang.ClassNotFoundException: org.jboss.resteasy.spi.ResteasyProviderFactory这类错误时第一反应不该是“加依赖”而应检查jboss-deployment-structure.xml中是否正确声明了resteasy-jaxrs模块依赖——这是 WildFly 的“游戏规则”。2.2 WildFly 与 JBoss AS 的血缘关系版本演进中的关键断点很多人混淆 JBoss AS、WildFly、JBoss EAP这里必须厘清JBoss ASApplication Server是 Red Hat 开源社区版的应用服务器最后稳定版本是AS 7.2.0.Final2013 年发布。它首次引入模块化架构jboss-modules和统一管理模型Unified Management Model奠定了现代 WildFly 的基础。WildFly是 JBoss AS 的直接继承者于 2013 年底以WildFly 8名义重启开源项目。命名变更标志着架构彻底转向 Jakarta EE当时还叫 Java EE最新规范并拥抱更激进的模块化与响应式设计。WildFly 10 是第一个完全支持 Java EE 7 Full Profile 的版本WildFly 26 是首个全面拥抱 Jakarta EE 9包名从javax.*迁移至jakarta.*的 LTS 版本WildFly 302024 年发布已原生支持 Jakarta EE 10 与 MicroProfile 6.0。JBoss EAPEnterprise Application Platform是 Red Hat 提供的商业支持版基于 WildFly 某个稳定分支如 EAP 7.x 基于 WildFly 10/11EAP 8.x 基于 WildFly 26/27增加企业级特性如 SSO 集成、高级监控代理、FIPS 140-2 加密合规、长期安全补丁。EAP ≠ WildFly 的“付费加强版”而是 WildFly 的“企业加固发行版”——它禁用部分实验性功能强化稳定性测试并提供 SLA 保障。为什么这个区分重要因为你在生产环境遇到的问题很可能与版本选择强相关。例如若你使用 WildFly 23 部署一个依赖javax.xml.bind.JAXBContext的老应用会直接抛NoClassDefFoundError因为 JAXB 在 Java 11 中已被移除而 WildFly 23 默认不包含java.xml.bind模块需手动添加--add-modulesjava.xml.bind启动参数但若你用的是 EAP 7.4基于 WildFly 18Red Hat 已在该发行版中预置了兼容模块无需额外配置。注意WildFly 官方只提供最新 3 个主版本的安全更新如当前是 WildFly 30/29/28旧版本漏洞需自行修复或升级。而 EAP 提供长达 10 年的生命周期支持LTS这是企业选型的关键决策点。2.3 为什么 WildFly 仍活跃于关键系统四个不可替代场景尽管云原生浪潮席卷WildFly 在以下四类场景中依然保持着难以撼动的地位强事务一致性要求的金融/政务系统某省级财政支付平台的核心账务模块需确保“预算扣减 支付指令下发 会计凭证生成”三步操作原子性。它采用 WildFly 内置的 Narayana JTA 实现配合 Oracle RAC 数据库的 XA DataSource实测在 2000 TPS 下事务成功率 99.999%。若换成 Spring Boot Atomikos需自行处理 XA Recovery 日志清理、两阶段提交超时策略、以及与 Oracle RAC 的特定驱动兼容性问题运维复杂度指数级上升。遗留 EJB 架构的平滑演进某大型制造企业的 MES 系统核心业务逻辑封装在无状态会话 BeanStateless Session Bean中已有 15 年代码资产。直接重写为 Spring Cloud 微服务预估成本超 800 人日。团队选择 WildFly 26 Jakarta EE 9 迁移路径仅将javax.ejb.*替换为jakarta.ejb.*调整ejb-jar.xml命名空间其余代码零修改。迁移后性能提升 12%且保留了 EJB 容器提供的自动线程池管理、远程调用负载均衡、以及方法级事务控制能力。高安全合规性审计场景某金融机构的反洗钱AML分析引擎需通过等保三级与 PCI DSS 认证。WildFly 的 Elytron 安全子系统提供 FIPS 140-2 认证的加密算法实现、基于角色的细粒度 Web 资源访问控制RBAC、以及完整的登录失败锁定与审计日志含 IP、时间、用户名、操作类型。这些能力在 Spring Security 中需大量定制开发才能达到同等审计要求。混合部署架构中的“粘合剂”角色某电信运营商的 OSS 系统前端为 Vue.js SPA后端由 WildFly承载传统 Java EE 服务、Node.js实时告警推送、PythonAI 异常检测三套运行时组成。WildFly 通过其内建的 Undertow Web 服务器直接代理/api/v1/请求到 Java 服务同时将/ws/路径转发给 Node.js WebSocket 服务。这种“一机多容器”的混合部署模式在 WildFly 的undertow子系统中仅需 5 行 XML 配置即可完成远比 Nginx 反向代理更轻量、更可控。这些场景共同指向一个事实WildFly 的价值不在于它有多“新”而在于它有多“稳”、多“全”、多“可预期”。当业务逻辑的复杂度远超基础设施的复杂度时选择一个经过十年以上生产验证、规范完备、问题有迹可循的运行时本身就是一种高效的技术决策。3. 核心配置体系与实操要点解析3.1 目录结构解剖从bin/到standalone/deployments/的每一寸土地WildFly 的目录结构设计极具工程理性理解它是避免“配置迷路”的第一步。以 WildFly 30 为例解剖其核心目录wildfly-30.0.0.Final/ ├── bin/ # 启动与管理脚本 │ ├── standalone.sh # Linux 启动脚本Windows 为 .bat │ ├── jboss-cli.sh # CLI 管理工具入口 │ └── add-user.sh # 创建管理用户/应用用户 ├── docs/ # 文档含 TCK 测试报告、规范兼容性说明 ├── modules/ # 所有模块定义jar 包 module.xml 描述文件 │ └── system/ # 系统模块如 org.jboss.as.server, org.wildfly.extension.undertow ├── standalone/ # 独立模式Standalone运行时根目录 │ ├── configuration/ # 核心配置文件 │ │ └── standalone.xml # 主配置文件相当于 Tomcat 的 server.xml │ ├── deployments/ # 应用部署目录放 WAR/EAR 文件自动热部署 │ ├── log/ # 日志文件server.log, boot.log │ ├── tmp/ # 临时工作目录编译 JSP、解压 WAR │ └── data/ # 运行时数据H2 数据库文件、缓存数据 └── welcome-content/ # 默认欢迎页面可替换为自定义首页关键要点解析standalone.xml是心脏但不是唯一它定义了整个服务器的运行时行为线程池、数据源、安全域、子系统配置。但 WildFly 支持“配置覆盖”机制你可以在standalone/configuration/下创建standalone-full.xml启用全部子系统或standalone-ha.xml启用高可用集群并通过启动参数-c standalone-ha.xml指定。不要试图在一个standalone.xml里塞满所有功能而应按环境职责拆分配置文件。deployments/目录的“魔法”与陷阱将myapp.war复制到此目录WildFly 会自动解压并部署。但注意其背后的“部署标记机制”WildFly 不是简单监听文件创建而是检查同名.dodeploy标记文件。正确流程是复制myapp.war到deployments/WildFly 自动创建myapp.war.dodeploy触发部署部署成功后重命名为myapp.war.deployed若部署失败则变为myapp.war.failed并记录详细错误到server.log实操心得若你发现应用没部署先检查deployments/下是否存在.dodeploy文件若想强制重新部署删除.deployed文件并重建.dodeploy即可。永远不要直接在deployments/中编辑 WAR 内部文件——它会被下次部署覆盖。modules/目录是 WildFly 的“操作系统内核”每个模块如org.hibernate:main是一个独立目录包含module.xml声明依赖与导出包和resources/jar 包。当你需要添加第三方库如 Oracle JDBC 驱动绝不能直接丢进lib/WildFly 没有lib/目录而应在modules/下创建路径com/oracle/jdbc/main/放入ojdbc8.jar和module.xml声明module namecom.oracle.jdbc /和resource-root pathojdbc8.jar/在standalone.xml的datasource中引用driveroracle并在drivers部分声明driver nameoracle modulecom.oracle.jdbc/这种“显式模块声明”机制是 WildFly 解决类冲突的根本保障。3.2standalone.xml配置精要读懂 80% 的生产问题standalone.xml是 WildFly 的“宪法”但其 XML 结构庞大默认超 2000 行。我们聚焦最常修改、最易出错的五个核心区块3.2.1management管理接口的“门禁系统”management security-realms security-realm nameManagementRealm authentication local default-user$local skip-group-loadingtrue/ properties pathmgmt-users.properties relative-tojboss.server.config.dir/ /authentication /security-realm /security-realms management-interfaces http-interface security-realmManagementRealm http-upgrade enabledtrue/ socket-binding httpmanagement-http/ /http-interface /management-interfaces /managementmgmt-users.properties是管理用户凭据文件add-user.sh脚本会自动在此文件中添加哈希密码。切勿手动编辑此文件的密码字段——哈希值需通过脚本生成否则会导致登录失败。http-interface绑定的management-httpsocket在socket-binding-group中定义默认端口9990。若需外网访问必须修改interface namemanagement的inet-address为0.0.0.0默认是127.0.0.1并确保防火墙放行。提示生产环境严禁开启local认证允许本地 Unix socket 登录应强制使用properties或 LDAP 认证并定期轮换管理员密码。3.2.2subsystem xmlnsurn:jboss:domain:undertow:14.0Web 服务器的“交通管制”subsystem xmlnsurn:jboss:domain:undertow:14.0 buffer-cache namedefault/ server namedefault-server http-listener namedefault socket-bindinghttp redirect-sockethttps enable-http2true/ https-listener namehttps socket-bindinghttps security-realmApplicationRealm enable-http2true/ host namedefault-host aliaslocalhost location name/ handlerwelcome-content/ filter-ref nameserver-header/ /host /server servlet-container namedefault jsp-config/ websockets/ /servlet-container /subsystemhttp-listener的redirect-sockethttps当 HTTP 请求到达时自动 301 重定向到 HTTPS。但注意此重定向发生在 Undertow 层不经过应用代码因此HttpServletRequest.getScheme()在应用中仍返回http。若应用需感知真实协议应配置反向代理如 Nginx并设置X-Forwarded-Proto头再在 WildFly 中启用proxy-address-forwardingtrue。servlet-container中的jsp-configWildFly 30 默认禁用 JSP 编译因 Jakarta EE 10 已移除 JSP 规范。若必须运行老 JSP 页面需显式启用并注意 JSP 编译器Eclipse JDT的内存限制否则大 JSP 文件会触发OutOfMemoryError。3.2.3subsystem xmlnsurn:jboss:domain:datasources:7.0数据源的“生命线”subsystem xmlnsurn:jboss:domain:datasources:7.0 datasources datasource jndi-namejava:jboss/datasources/ExampleDS pool-nameExampleDS enabledtrue use-java-contexttrue connection-urljdbc:h2:mem:test;DB_CLOSE_DELAY-1;DB_CLOSE_ON_EXITFALSE/connection-url driverh2/driver security user-namesa/user-name passwordsa/password /security /datasource drivers driver nameh2 modulecom.h2database.h2 xa-datasource-classorg.h2.jdbcx.JdbcDataSource/xa-datasource-class /driver /drivers /datasources /subsystemuse-java-contexttrue是关键它决定 JNDI 名称是否绑定到java:命名上下文应用内可直接Resource(lookupjava:jboss/datasources/ExampleDS)。若设为false则绑定到全局java:jboss/需用完整 JNDI 名查找极易出错。xa-datasource-classvsdriver-class对于 Oracle/DB2 等支持 XA 的数据库必须使用xa-datasource-class如oracle.jdbc.xa.client.OracleXADataSource否则无法参与 JTA 分布式事务。普通driver-class仅支持本地事务。3.2.4subsystem xmlnsurn:jboss:domain:logging:10.0日志的“黑匣子”subsystem xmlnsurn:jboss:domain:logging:10.0 console-handler nameCONSOLE level nameINFO/ formatter named-formatter nameCOLOR-PATTERN/ /formatter /console-handler periodic-rotating-file-handler nameFILE autoflushtrue formatter named-formatter namePATTERN/ /formatter file relative-tojboss.server.log.dir pathserver.log/ suffix value.yyyy-MM-dd/ append valuetrue/ /periodic-rotating-file-handler root-logger level nameINFO/ handlers handler nameCONSOLE/ handler nameFILE/ /handlers /root-logger /subsystemperiodic-rotating-file-handler的suffix.yyyy-MM-dd表示按天滚动但 WildFly 30 默认使用SizeRotatingFileHandler按大小滚动。若需日期滚动必须显式指定PeriodicSizeRotatingFileHandler并配置rotate-size和max-backup-index。root-logger的level是总开关设为WARN则所有INFO级别日志包括应用log.info()均被屏蔽。调试时可临时改为DEBUG但生产环境严禁TRACE级别——它会使日志量暴增 10 倍以上。3.2.5subsystem xmlnsurn:jboss:domain:elytron:15.0安全子系统的“新国标”subsystem xmlnsurn:jboss:domain:elytron:15.0 security-domains security-domain nameApplicationDomain default-realmApplicationRealm permission-mapperdefault-permission-mapper security-realm nameApplicationRealm/ /security-domain /security-domains security-realms identity-realm nameApplicationRealm identitypath/to/application-users.properties/ /security-realms /subsystemElytron 取代了旧版 PicketBoxWildFly 11 默认启用 Elytron。application-users.properties存储应用级用户非管理用户格式为usernameHEX(sha256(password))。密码哈希需用elytron-tool.sh生成而非add-user.sh。permission-mapper是权限映射核心它将用户角色映射到具体操作权限。默认default-permission-mapper仅做简单角色匹配。若需精细控制如“财务角色只能访问/api/v1/invoice”需自定义constant-permission-mapper或regex-permission-mapper。注意修改standalone.xml后必须重启 WildFly 生效CLI 的reload命令也可但部分子系统修改仍需 full restart。切勿在生产环境随意 reload可能中断长连接。3.3 CLI命令行接口比 Web Console 更强大的“手术刀”WildFly CLIjboss-cli.sh是运维 WildFly 的终极武器。它比 Web Console 更精准、更可脚本化、更少出错。掌握以下高频命令效率提升 50%3.3.1 连接与基础操作# 连接到本地 WildFly默认端口 9990 $ ./jboss-cli.sh --connect # 连接到远程 WildFly指定 host:port $ ./jboss-cli.sh --connect controller192.168.1.100:9990 # 查看当前节点状态 [standalonelocalhost:9990 /] :read-attribute(nameserver-state) { outcome success, result running } # 查看所有已部署应用 [standalonelocalhost:9990 /] /deployment:read-resource3.3.2 数据源动态配置无需重启# 添加一个 MySQL 数据源假设已安装 mysql module [standalonelocalhost:9990 /] /subsystemdatasources/jdbc-drivermysql:add(driver-namemysql,driver-module-namecom.mysql,driver-xa-datasource-class-namecom.mysql.cj.jdbc.MysqlXADataSource) # 创建数据源 [standalonelocalhost:9990 /]># 查看 undertow 线程池状态 [standalonelocalhost:9990 /] /subsystemundertow/serverdefault-server/http-listenerdefault:read-resource(include-runtimetrue) # 输出包含 active-count, max-active, queue-size 等实时指标 # 动态修改线程池最大线程数立即生效 [standalonelocalhost:9990 /] /subsystemundertow/serverdefault-server/http-listenerdefault:write-attribute(namemax-connections,value500) # 查看 JVM 启动参数 [standalonelocalhost:9990 /] :read-attribute(namejava-vm-arguments) # 修改 JVM 堆内存需 reload [standalonelocalhost:9990 /] /system-propertyJAVA_OPTS:add(value-Xms2g -Xmx2g -XX:UseG1GC)3.3.4 批量脚本化部署jboss-cli.sh --filedeploy.cli创建deploy.cli文件# 连接控制器 connect localhost:9990 # 部署应用 deploy /path/to/myapp.war --force # 设置 JVM 参数 /system-propertyJAVA_OPTS:add(value-Dmyapp.envprod) # 重载服务器 :reload执行./jboss-cli.sh --filedeploy.cli提示CLI 脚本是 CI/CD 流水线部署 WildFly 应用的标准方式比手动复制 WAR 更可靠、更可追溯。4. 实操全流程从零部署一个 Jakarta EE 10 应用4.1 环境准备WildFly 30 JDK 17 Maven步骤 1下载与安装JDK 17LTShttps://adoptium.net/下载 Temurin 17WildFly 30https://www.wildfly.org/downloads/下载wildfly-30.0.0.Final.zip解压到/opt/wildfly设置环境变量export JAVA_HOME/opt/jdk-17 export WILDFLY_HOME/opt/wildfly步骤 2启动与验证# 启动 WildFly前台运行便于查看日志 $ $WILDFLY_HOME/bin/standalone.sh -b 0.0.0.0 -bmanagement 0.0.0.0 # 验证访问 http://localhost:9990 Management Console # 访问 http://localhost:8080 Welcome Page注意-b 0.0.0.0绑定所有网卡-bmanagement 0.0.0.0允许远程管理。生产环境应限制为内网 IP。4.2 开发一个 Jakarta EE 10 REST 服务我们构建一个极简的BookService演示 WildFly 原生能力pom.xml关键依赖dependencies !-- Jakarta EE 10 API -- dependency groupIdjakarta.platform/groupId artifactIdjakarta.jakartaee-api/artifactId version10.0.0/version scopeprovided/scope /dependency !-- CDI 支持 -- dependency groupIdjakarta.enterprise/groupId artifactIdjakarta.enterprise.cdi-api/artifactId version4.0.1/version scopeprovided/scope /dependency /dependenciesBookResource.javaREST 端点Path(/books) Produces(MediaType.APPLICATION_JSON) Consumes(MediaType.APPLICATION_JSON) public class BookResource { GET public ListBook getAll() { return Arrays.asList( new Book(1L, WildFly Deep Dive, John Doe), new Book(2L, Jakarta EE 10 Cookbook, Jane Smith) ); } POST public Response create(Book book) { // 模拟保存 System.out.println(Creating book: book.getTitle()); return Response.status(CREATED).entity(book).build(); } }Book.javaJAX-RS Entitypublic class Book { private Long id; private String title; private String author; // 构造函数、getter、setter省略 }web.xml可选WildFly 30 默认启用 Servlet 6.0?xml version1.0 encodingUTF-8? web-app xmlnshttps://jakarta.ee/xml/ns/jakartaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttps://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd version6.0 display-nameBookService/display-name /web-app构建 WARmvn clean package # 生成 target/bookservice.war4.3 部署与验证五步走通步骤 1检查 WAR 结构unzip -l target/bookservice.war | head -20 # 确认包含WEB-INF/classes/, WEB-INF/web.xml, META-INF/MANIFEST.MF步骤 2部署到 WildFly# 方法一复制到 deployments/ cp target/bookservice.war $WILDFLY_HOME/standalone/deployments/ # 方法二使用 CLI推荐可获反馈 $ $WILDFLY_HOME/bin/jboss-cli.sh --connect [standalonelocalhost:9990 /] deploy /path/to/bookservice.war步骤 3验证部署状态查看server.logINFO [org.jboss.as.server] (management-handler-thread - 2) WFLYSRV0010: Deployed bookservice.war (runtime-name : bookservice.war)CLI 查询[standalonelocalhost:9990 /] /deploymentbookservice.war:read-resource {outcome success, result {enabled true, status OK}}步骤 4调用 REST API# 获取所有图书 curl -v http://localhost:8080/bookservice/rest/books # 创建新图书
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表