我想将调试器附加到我的dockerized WebLogic 12c中部署的WAR。我使用WebLogic的官方镜像(这是一个Linux容器)https://hub.docker.com/_/oracle-weblogic-server-12c,并使用docker命令启动容器:
docker run -d -p 4002:4002 -p 9002:9002
-v c:/my-path-to-shared-volume:/u01/oracle/properties
-e ADMINISTRATION_PORT_ENABLED=true -e DOMAIN_NAME=docker_domain
-e JAVA_TOOL_OPTIONS=\"-agentlib:jdwp=transport=dt_socket,address=4002,server=y,suspend=n\"
--name weblogic store/oracle/weblogic:12.2.1.3-dev-200109
weblogic控制台在https://localhost:9002/console/上是活跃的,但是当试图运行调试器时,我的IDE说:
无法打开调试器端口(localhost:4002):java. io. IOException "握手失败-连接过早关闭"
我的操作系统是Windows10。我用Visual Studio Code和IntelliJ进行了尝试,得到了相同的输出。WAR运行得很好,当我使用portman访问一些服务端点时,它们会做出响应。
似乎发生的是容器内的weblogic启动脚本试图应用Java Options参数两次!请参见以下容器输出的相关部分:
Domain Home是:/u01/oracle/user_projects/domains/docker_domain拾取JAVA_TOOL_OPTIONS:"-agentlib:jdwp = transport = dt_socket,address = localhost:4002,server = y,suspend = n"* 侦听地址为:4002 * 正在初始化WebLogic脚本工具(WLST)...欢迎使用WebLogic Server管理脚本 shell
[...]* (在日志中,我得到了:)*
使用行启动WLS:/usr/java/jdk-8/bin/java-server-Djava。安全egd =文件:/dev/。/urandom-cp/u01/oracle/wlserver/server/lib/weblogic-launcher.jar-Dlaunch。使用. env。classpath = true-Dweblogic。名称= AdminServer-Djava。安全。policy =/u01/oracle/wlserver/server/lib/weblogic。策略-Djava。系统。班级。loader = com.Oracleclassloader weblogic LaunchClassLoader-javaagent:/u01/oracle/wlserver/server/lib/debugpatch-agent.jar-da-Dwls。home =/u01/oracle/wlserver/server-Dweblogic。home =/u01/oracle/wlserver/server weblogic。服务器拾取JAVA_TOOL_OPTIONS:"-agentlib:jdwp = transport = dt_socket,address = localhost:4002,server = y,suspend = n"错误:传输错误202:* * 绑定失败:地址已在使用中**错误:JDWP传输dt_socket无法初始化,TRANSPORT_INIT(510)JDWP退出错误AGENT_ERROR_TRANSPORT_INIT(197):未初始化传输[debugInit. c:750]正在停止Derby服务器... Derby服务器停止。
然后,我尝试使用docker-compose,创建一个. yaml文件来添加我的环境 prop ,试图防止它们运行两次。我也有同样的行为。无论我使用哪个端口,都发现 * 已在使用中 *。
这是我的。yaml文件
version: '2'
services:
weblogic:
container_name: weblogic_yamled
image: store/oracle/weblogic:12.2.1.3-dev-200109
ports:
- "7001:7001"
- "7002:7002"
- "4002:4002"
- "4003:4003"
- "9002:9002"
volumes:
- c:/my-path-to-shared-volume:/u01/oracle/properties
environment:
- ADMINISTRATION_PORT_ENABLED=true
- DOMAIN_NAME=docker_domain
- JAVA_TOOL_OPTIONS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=localhost:4002"
最后,我尝试了transport=dt_shmem
,但我得到了不同的错误:
错误:找不到传输库:dt_shmem
不知道我还应该尝试什么!
6条答案
按热度按时间exdqitrt1#
尝试添加
address=*:4002
而不是address=4002
9njqaruj2#
JAVA_OPTS
是Tomcat特定的环境变量在Java 8中,JDK支持
JAVA_TOOL_OPTIONS
环境变量,以便启用调试器。尝试将JAVA_OPTS
替换为JAVA_TOOL_OPTIONS
您还需要设置如下地址:
address=*:8000
、address=localhost:4002
或address=0.0.0.0:4002
dkqlctbz3#
我在附加内存监控工具(JVisualVM)时遇到了类似的问题。我可以telnet到服务器,但这不是故事的全部。
据我所知,什么是阻止我的是RMI连接下使用的引擎盖。缺少的是客户机(调试器运行的地方)和主机(应用程序运行的地方)之间的“隧道”。
在windows中,你会打开一个cmd并给予:
这将打开一个油灰窗口,该窗口在登录后应保持打开状态,以便隧道保持打开状态。
有关此方面的更多信息,您可以查看@freedev提供的解决方案的第二步中的here。
我不确定它是否对你有效,但我怀疑它可能和我的情况一样。
46scxncf4#
问题是容器中的WebLogic服务器被配置为在生产模式下运行(脚本www.example.com中的PRODUCTION_MODE变量的值setDomainEnv.sh被设置为“true”)。
要禁用此功能,您需要打开文件setDomainEnv.sh,找到
PRODUCTION_MODE="true"
并将其更改为PRODUCTION_MODE="false"
。您也不需要设置JAVA_TOOL_OPTIONS变量,setDomainEnv.sh脚本已经可以在调试模式下启动。要启用调试模式,需要在执行脚本之前将环境变量“debugFlag”设置为true。
Docker命令:
注意,我还将调试端口更改为55195。
rdrgkggo5#
您是否尝试使用端口号+ 3(4005)来代替?为容器化应用程序提供单独的调试端口是一种常见的做法
h4cxqtbf6#
使用
-Xrunjdwp:transport
代替-agentlib:jdwp=transport