JBoss + WildFly 本地开发环境完全指南

JBoss + WildFly 本地开发环境完全指南

本篇笔记主要实现在本地通过 docker 创建 JBoss 和 WildFly 服务器这一功能,基于红帽的禁制 EAP 版本的重新分发,所以我这里没办法放 JBoss EAP 的 zip 文件。WildFly 是免费开源的版本,可以在红帽官网找到

Github 地址为:<https://github.com/GoldenaArcher/jboss-docker-template>

前言 - 为什么要折腾 JBoss

其实原因很简单,就是项目需求……

这两个月被 onboard 了一个新的老项目,原因大体是因为 InfoSec 发现了该项目里存在的一个安全隐患——通过 iframe 将 session id 传到了另一个 HTML 文件中,导致 session id 在 URL 上可见。这个项目本身也非常的老了——这个项目至少 17 年了,比 docker 的历史还久,因此之前修改了点内容,就得让后端的同时重新 deploy 到我们的测试环境去做测试

这样一来麻烦,二来同时如果忙于其他的事情,那么就卡在了这里,因此从上个礼拜就在想怎么样可以把 docker 给搞起来,这样至少自己本地就可以修改+测试了

至于为什么要部署才能测试……原因也很简单,因为不是 SPA 啊,代码本身还是 JSF。我之前信誓旦旦的改完了 xhtml/html,本地跑起来页面显示完全没有问题,就是因为缺乏 environment context,需要放在 JSF 上打开。结果一部署,崩的彻彻底底的……

一次是因为 angular 没办法转译成功,N 次是因为 JSF 在编译后默默地出现了问题,又没有报错,只是渲染空屏。好不容易完成了 JSF 渲染的问题,现在又回到了 angular 转译失败的问题……

不得已,只能靠自己,想办法把 JBoss 服务器启起来,这样才能够比较流畅地开展下一步的 debug 过程

需要的工具

具体列表如下:

  • JBoss EAP 6.4.0
    这个需要看一下自己项目的需求,从官网下载 EAP 需要 license
  • WildFly 8.2
    如果没有 license 我推荐 WildFly
    其实准确的说 JBoss EAP 6.4 对接的应该是 JBoss AS 7.5,不过我主要需要 fix 的地方在前端那里,后端的几近于无,WildFly 找起来容易一点
  • Java 8
  • Maven 3.6.3
  • Docker

这个版本的 JBoss EAP 和 WildFly 支持的应该还是 Java7,不过我们项目是用 Java8 跑的,我就下载 Java8 了,反正编译是没有错,能跑的

Docker Compose & Dockerfile

我这里不包括 zip 文件,下载就靠自己了……

Docker Compose

services:jboss:build:context: ./jbossdockerfile: Dockerfilecontainer_name: jboss-eapports:- "8080:8080"- "9990:9990"- "8787:8787"volumes:- ./deployments/jboss-mock:/opt/jboss/jboss-eap-6.4/standalone/deploymentsrestart: unless-stoppedwildfly:build:context: ./wildflydockerfile: Dockerfilecontainer_name: wildfly-8ports:- "8180:8080"- "9991:9990"- "8788:8787"volumes:- ./deployments/jboss-mock/webapp-1.0.0.war:/opt/wildfly/wildfly-8.2.0.Final/standalone/deployments/webapp-1.0.0.warrestart: unless-stopped

这一步也是卡我卡的比较久的地方了……理论上来说 JBoss 和 WildFly 应该都是可以打包 ear 文件的,不过我至少折腾了两个小时跑 mvn clean installdocker compose --build -d ,最终还是没有能够正常的运行 ear 文件。反而是直接跑 war 就成功了……至少 JBoss 成功了

EAP 版本支持这个地方就可以看出来了,在 volumes 下面,JBoss 的配置是这样的: ./deployments/jboss-mock:/opt/jboss/jboss-eap-6.4/standalone/deployments ,换句话说,EAP 可以直接找到 deployments 下面的 war 文件,然后自动完成部署。不过 WildFly 缺乏对应的支持,它可以找到对应的 war 文件,没有办法顺利匹配到自己的部署路径里,所以需要手动写死路径: ./deployments/jboss-mock/webapp-1.0.0.war:/opt/wildfly/wildfly-8.2.0.Final/standalone/deployments/webapp-1.0.0.war,才能正常运行

还有一个问题就是,因为二者指向的 volume 是在一个路径,我本地上倒是发生过 JBoss deploy 了,但是 WildFly 没有。后面发现,可能是因为当 JBoss deploy 成功后,路径下面会出现一个 webapp-1.0.0.war.deployed 的文件,然后 WildFly 以为已经部署过了,就不会继续部署。暂时找到的解决方案是在要部署的文件夹中放一个 jboss-mock.ear.dodeploy 的空文件,目录如下:

这种情况下手动操作还是稍微烦了点,之后可能会写个 sh 脚本文件,搭配 mvn clean install 指令一起运行吧

运行后结果如下:

Dockerfile

二者从实现上基本上没有任何的差别,只有在 CMD 里面才有,运行的是不同的 sh

JBoss:

FROM openjdk:8-jdkWORKDIR /opt/jbossCOPY jboss-eap-6.4.0.zip ./RUN apt-get update && apt-get install -y unzip && \
unzip jboss-eap-6.4.0.zip && \
rm jboss-eap-6.4.0.zipENV JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8787"EXPOSE 8080 9990 8787CMD ["./jboss-eap-6.4/bin/standalone.sh", "-b", "0.0.0.0"]

WildFly:

FROM openjdk:8-jdkWORKDIR /opt/wildflyCOPY wildfly-8.2.0.Final.zip ./RUN apt-get update && apt-get install -y unzip && \
unzip wildfly-8.2.0.Final.zip && \
rm wildfly-8.2.0.Final.zipENV JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:8787"EXPOSE 8080 9990 8787CMD ["./wildfly-8.2.0.Final/bin/standalone.sh", "-b", "0.0.0.0"]

我另外加了个 debugger,就是 ENV JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:8787" 这里的内容,我在 VSCode 里倒是看到 debugger attach 了,不过我得下个礼拜和搞后端的同事一起看看,才能确定是不是能够正常的跑起来

辅助脚本

主要是启动和停止后清理的脚本

#!/bin/bashset -eecho "🔍 Checking if containers are already running..."
if docker ps -q --filter name=jboss | grep -q . || docker ps -q --filter name=wildfly | grep -q .; thenecho "⚠️  Containers already running. Skipping start."
elseecho "🚀 Starting JBoss and WildFly containers..."docker compose up --build -decho "✅ Services started!"echo "   - JBoss:    http://localhost:8080"echo "   - WildFly:  http://localhost:8180"
fi
#!/bin/bashset -eecho "🛑 Stopping containers if they are running..."
docker-compose down || echo "⚠️  No containers to stop."echo "🧽 Checking for images to delete..."
IMAGES=$(docker images -q --filter "reference=*jboss*" --filter "reference=*wildfly*" | sort -u)if [ -z "$IMAGES" ]; thenecho "✅ No matching images found to delete."
elseecho "🗑️  Removing matching images..."docker rmi $IMAGES -fecho "✅ Images deleted."
fi

不用也没啥差别,就是要 docker compose --builddocker compose down 加上用 docker rmi,写个辅助环境稍微方便点

Java 项目结构

这里大体贴一个结构,pom 文件具体的就不放了,具体的内容在 github 上,这个本身就是一个 empty boilerplate,目前来说里面没内容的

debugger

这里就是 vscode 的配置了:

{"version": "0.2.0","configurations":[{"type": "java","name": "Attach to JBoss (8787)","request": "attach","hostName": "localhost","port": 8787,"projectName": "jboss-mock","sourcePaths":["${workspaceFolder}/jboss-mock/webapp/src/main/java","${workspaceFolder}/jboss-mock/ejb/src/main/java",],},{"type": "java","name": "Attach to WildFly (8788)","request": "attach","hostName": "localhost","port": 8788,"projectName": "jboss-mock","sourcePaths":["${workspaceFolder}/jboss-mock/webapp/src/main/java","${workspaceFolder}/jboss-mock/ejb/src/main/java",],},],
}

现在整体上来说是能连上,但是就像前面提到的,具体效果怎么样还需要测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/48076.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA使用jclasslib Bytecode Viewer查看jvm字节码

学习jvm的时候&#xff0c;想查看字节码和局部变量表&#xff0c;可以使用idea安装jclasslib Bytecode View插件查看。 &#xff08;1&#xff09;安装工具&#xff1a; 安装完成后需要重启idea. &#xff08;2&#xff09;准备一段代码&#xff0c;编译运行 package com.te…

STM32控制DRV8825驱动42BYGH34步进电机

最近想玩一下人工智能&#xff0c;然后买了个步进电机想玩一下&#xff0c;刚到了一脸懵逼&#xff0c;发现驱动器20多块&#xff0c;有点超预算&#xff0c;然后整了个驱动板&#xff0c;方便自己画线路板&#xff0c;经过各种搜索&#xff0c;终于转起来了&#xff0c;记录一…

第十四节:实战场景-何实现全局状态管理?

React.createElement调用示例 Babel插件对JSX的转换逻辑 React 全局状态管理实战与 JSX 转换原理深度解析 一、React 全局状态管理实现方案 1. Context API useReducer 方案&#xff08;轻量级首选&#xff09; // 创建全局 Context 对象 const GlobalContext createConte…

QT网络拓扑图绘制实验

前言 在网络通讯中&#xff0c;我qt常用的是TCP或者UDP协议&#xff0c;就比方说TCP吧&#xff0c;一台服务器有时可能会和多台客户端相连接&#xff0c;我之前都是处理单链接情况&#xff0c;最近研究图结构的时候&#xff0c;突然就想到了这个问题。那么如何解决这个问题呢&…

【深度学习—李宏毅教程笔记】各式各样的 Attention

目录 一、普通 Self-Attention 的痛点 二、对 Self-Attention 的优化方式 1、Local Attention / Truncated Attention 2、Stride Attention 3、Global Attention 4、知名的 Self-Attention 的变形的应用 &#xff08;1&#xff09;Longformer &#xff08;2&#xff09…

OceanBases数据库单机社区版保姆级安装

目录 背景 简介 安装 OceanBase 下载地址 上传解压安装包 ​编辑 执行安装命令 ​编辑 应用环境配置 执行以下命令&#xff0c;快速部署 OceanBase 数据库(仅用于简单使用&#xff0c;不应用于生产)。 查看一下数据库状态 ​编辑连接数据库 用户创建 使用工具Navi…

Linux守护进程

一、相关概念 QQ邮箱关于三种协议的解释&#xff1a;SMTP/IMAP服务 1.SMTP协议 SMTP&#xff08;​​Simple Mail Transfer Protocol​​&#xff0c;简单邮件传输协议&#xff09;是一种用于发送电子邮件的互联网标准。它在TCP/IP协议族中&#xff0c;通常使用25端口进行通…

Java【网络原理】(4)HTTP协议

目录 1.前言 2.正文 2.1自定义协议 2.2HTTP协议 2.2.1抓包工具 2.2.2请求响应格式 2.2.2.1URL 2.2.2.2urlencode 2.2.3认识方法 2.2.3.1GET与POST 2.2.3.2PUT与DELETE 2.2.4请求头关键属性 3.小结 1.前言 哈喽大家好啊&#xff0c;今天来继续给大家带来Java中网络…

【版本控制】idea中使用git

大家好&#xff0c;我是jstart千语。接下来继续对git的内容进行讲解。也是在开发中最常使用&#xff0c;最重要的部分&#xff0c;在idea中操作git。目录在右侧哦。 如果需要git命令的详解&#xff1a; 【版本控制】git命令使用大全-CSDN博客 一、配置git 要先关闭项目&#xf…

【中间件】redis使用

一、redis介绍 redis是一种NoSQL类型的数据库&#xff0c;其数据存储在内存中&#xff0c;因此其数据查询效率很高&#xff0c;很快。常被用作数据缓存&#xff0c;分布式锁 等。SpringBoot集成了Redis&#xff0c;可查看开发文档Redis开发文档。Redis有自己的可视化工具Redis …

一文粗通 Celery 分布式任务队列

目录 简介什么是 CeleryCelery 的基本组成Celery 的应用场景快速开始 设置热重载开发脚本基本任务管理绑定任务本身设置任务的执行超时时间允许任务重试自定义任务名称实现任务优先级 高级任务管理任务延迟执行指定时间执行任务超时自动取消任务优先级重试任务 任务链与工作流简…

知识了解03——怎么解决使用npm包下载慢的问题?

1、为什么使用npm下载包会下载的慢 因为使用npm下载包时&#xff0c;默认使用国外服务器进行下载&#xff0c;此时的网络传输需要经过漫长的海底电缆&#xff0c;因此下载速度会变慢 2、怎么解决&#xff1f;&#xff08;切换镜像源&#xff09; &#xff08;1&#xff09;方…

系统思考与理性决策

汉诺贝克在《逆向投资心理学&#xff1a;引发市场波动的非技术因素分析》书中提到&#xff1a;“心理造就90%的行情。投资者利用别人的愚蠢所获得的利益&#xff0c;往往比靠自己得到智慧来得多。避免跟风&#xff0c;我觉得可以降低或者识别绝大部分的陷阱和风险。”这一观点深…

IP数据报

IP数据报组成 IP数据报&#xff08;IP Datagram&#xff09;是网络中传输数据的基本单位。 IP数据报头部 版本&#xff08;Version&#xff09; 4bit 告诉我们使用的是哪种IP协议。IPv4版本是“4”&#xff0c;IPv6版本是“6”。 头部长度&#xff08;IHL&#xff0c;Intern…

卡洛诗以“中式西餐”为锚点

意大利的浪漫与中国的烟火气&#xff0c;看似相隔万里&#xff0c;却在卡洛诗的餐桌上碰撞出令人惊艳的火花。 西餐曾是中国餐饮市场的“奢侈品”——复杂的工艺、高昂的定价&#xff0c;让它与普通人的日常餐桌格格不入。卡洛诗创始人敏锐地捕捉到这一矛盾&#xff1a;“西餐…

前端与传统接口的桥梁:JSONP解决方案

1.JSONP原理 1.1.动态脚本注入 说明&#xff1a;通过创建 <script> 标签绕过浏览器同源策略 1.2.回调约定 说明&#xff1a;服务端返回 函数名(JSON数据) 格式的JS代码 1.3.自动执行 说明&#xff1a;浏览器加载脚本后立即触发前端预定义的回调函数&#xff08;现代开…

STM32---外部中断EXTI

目录 一、中断向量表 二、EXTI工作原理图 三、NVIC模块 四、GPIO设置为EXTI的结构 五、C语言示例代码 在STM32中&#xff0c;中断是一个非常重要的结构&#xff0c;他能让我们在执行主函数的时候&#xff0c;由硬件检测一些外部或内部产生的中断信号&#xff0c;跳转到中断…

SQL注入 01

0x01 用户、脚本、数据库之间的关系 首先客户端发出了ID36的请求&#xff0c;脚本引擎收到后将ID36的请求先代入脚本的sql查询语句Select * from A where id 36 &#xff0c; 然后将此代入到数据库中进行查询&#xff0c;查到后将返回查询到的所有记录给脚本引擎&#xff0c;接…

Retinex系列图像/视频增强算法介绍

Retinex 系列原理基础 一、核心原理与理论 Retinex算法基于人类视觉系统特性,认为观测到的图像由光照分量(L)与反射分量( R )乘积构成,即: S ( x , y ) = L ( x , y

在 Visual Studio Code 中安装通义灵码 - 智能编码助手

高效的编码工具对于提升开发效率和代码质量至关重要。 通义灵码作为一款智能编码助手&#xff0c;为开发者提供了全方位的支持。 本文将详细介绍如何在 Visual Studio Code&#xff08;简称 VSCode&#xff09;中安装通义灵码&#xff0c;以及如何进行相关配置以开启智能编码…