无法通过Docked WebLogic(不使用intelliJ或Studio代码)将调试设置为适用于Java
我想将调试器附加到停靠WebLogic 12c中已部署的WAR。 我使用WebLogic的官方图像(它是一个Linux容器) 我使用docker命令启动容器:无法通过Docked WebLogic(不使用intelliJ或Studio代码)将调试设置为适用于Java,java,docker,debugging,yaml,weblogic12c,Java,Docker,Debugging,Yaml,Weblogic12c,我想将调试器附加到停靠WebLogic 12c中已部署的WAR。 我使用WebLogic的官方图像(它是一个Linux容器) 我使用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_
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
docker run -d --name weblogic -p 7001:7001 -p 9002:9002 -p 55195:55195
-v c:/my-path:/u01/oracle/properties
-e ADMINISTRATION_PORT_ENABLED=true -e DOMAIN_NAME=base_domain
-e debugFlag=true -e DEBUG_PORT=55195
store/oracle/weblogic:12.2.1.3
weblogic控制台在运行时激活,但在尝试运行调试器时,我的IDE显示:
无法打开调试器端口(localhost:4002):java.io.IOException
“握手失败-连接提前关闭”
我的操作系统是Windows10。我尝试了Visual Studio代码和IntelliJ,得到了相同的输出。战争运行得很好,当我使用portman攻击一些服务端点时,它们会做出响应
看起来容器中的weblogic启动脚本尝试应用Java选项参数两次!请参见以下容器输出的相关部分:
域主页是:/u01/oracle/user\u projects/domains/docker\u Domain
选择了JAVA工具选项:“-agentlib:jdwp=transport=dt\u socket,address=localhost:4002,server=y,suspend=n”
正在侦听地址为4002的传输dt_套接字
正在初始化WebLogic脚本工具(WLST)。。。
欢迎使用WebLogic服务器管理脚本Shell
[…](我在下面的日志中看到:)
以行开始WLS:
/usr/java/jdk-8/bin/java-server-Djava.security.egd=file:/dev//uradom-cp/u01/oracle/wlserver/server/lib/weblogic-launcher.jar-Dlaunch.use.env.classpath=true-Dweblogic.Name=AdminServer-Djava.security.policy=/u01/oracle/wlserver/server/server/lib/weblogic.policy-Djava.system.class.loader=com.oracle.classloader.weblogic.LaunchClassLoader=com-javaagent:/u01/oracle/wlserver/server/lib/debugpatch-agent.jar-da-Dwls.home=/u01/oracle/wlserver/server-Dweblogic.home=/u01/oracle/wlserver/server-weblogic.server
选择JAVA工具选项:“-agentlib:jdwp=transport=dt\u socket,address=localhost:4002,server=y,suspend=n”
错误:传输错误202:绑定失败:地址已在使用中
错误:JDWP传输dt_套接字初始化失败,传输初始化(510)
JDWP exit error AGENT_error_TRANSPORT_INIT(197):未初始化任何传输[debugInit.c:750]
正在停止Derby服务器。。。
Derby服务器已停止
然后我尝试与docker compose合作,创建一个.yaml文件,在那里添加我的环境道具,试图防止这些道具运行两次。我也有同样的行为。无论我使用哪个端口,都会发现它已在使用中
这是我的.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
不知道还有什么我应该试试 尝试添加
地址=*:4002
而不是地址=4002
您尝试过使用端口号+3(4005)吗?为容器化应用程序提供单独的调试端口是一种常见做法JAVA\u OPTS
是一个特定于Tomcat的环境变量
在Java 8中,JDK支持Java\u工具\u选项
环境变量,以便启用调试器。尝试将JAVA\u选项
替换为JAVA\u工具选项
您还必须像这样设置地址:
address=*:8000
,address=localhost:4002
或address=0.0.0.0:4002
我在附加内存监视工具(JVisualVM)时遇到了类似的问题。
我可以远程登录服务器,但这还不是全部
据我所知,阻碍我前进的是在引擎盖下使用的RMI连接。缺少的是客户端(调试器运行的地方)和主机(应用程序运行的地方)之间的“隧道”
在windows中,您将打开cmd并给出:
putty.exe -ssh <username>@<remote-host> -L <port>:<remote-host>:<same_port_again>
putty.exe-ssh@-L::
这将打开一个腻子窗口,该窗口在登录后应保持打开状态,以便隧道保持打开状态
有关这方面的更多信息,您可以查看@freedev提供的解决方案的第二步
我不确定它是否适用于您,但我怀疑它可能与我的情况相同。问题是容器中的WebLogic服务器配置为在生产模式下运行(脚本setDomainEnv.sh中的生产模式变量的值设置为“true”) 要禁用此功能,需要打开文件setDomainEnv.sh,找到
PRODUCTION\u MODE=“true”
并将其更改为PRODUCTION\u MODE=“false”
您也不需要设置JAVA_TOOL_OPTIONS变量,setDomainEnv.sh脚本已经可以在调试模式下启动。
要启用调试模式,需要在执行脚本之前将环境变量“debugFlag”设置为true
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
docker run -d --name weblogic -p 7001:7001 -p 9002:9002 -p 55195:55195
-v c:/my-path:/u01/oracle/properties
-e ADMINISTRATION_PORT_ENABLED=true -e DOMAIN_NAME=base_domain
-e debugFlag=true -e DEBUG_PORT=55195
store/oracle/weblogic:12.2.1.3
注意,我还将调试端口更改为55195。Thx以获取答案。相同的行为:java.io.IOException“握手失败-连接提前关闭”端口4002在映像中公开,您可以远程登录到主机上的端口4002吗?是的,4002和9002都是打开的,因此您可以访问从主机监听端口的调试器?@Thorbjørnravandersen yeap。。telnet和tcping的响应方式完全相同我很抱歉是的,我尝试了所有address=localhost:4002、address=*:4002和address=4002我已经编辑了我的答案,这可能会解决您在更新时遇到的问题@JohnPanThanks。它仍然无法连接,但我将用新发现更新我的问题。我做了更新。请注意,不接受任何多点地址语法。所以我坚持用
address=4002
@JohnPan,你试过用docker run-d-p 9002:9002运行docker吗