无法通过Dockerized WebLogic将Debug设置为适用于Java,而不能使用intelliJ或Studio Code

eh57zj3b  于 2023-06-22  发布在  Docker
关注(0)|答案(6)|浏览(112)

我想将调试器附加到我的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 CodeIntelliJ进行了尝试,得到了相同的输出。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
不知道我还应该尝试什么!

exdqitrt

exdqitrt1#

尝试添加address=*:4002而不是address=4002

9njqaruj

9njqaruj2#

JAVA_OPTS是Tomcat特定的环境变量
在Java 8中,JDK支持JAVA_TOOL_OPTIONS环境变量,以便启用调试器。尝试将JAVA_OPTS替换为JAVA_TOOL_OPTIONS
您还需要设置如下地址:address=*:8000address=localhost:4002address=0.0.0.0:4002

dkqlctbz

dkqlctbz3#

我在附加内存监控工具(JVisualVM)时遇到了类似的问题。我可以telnet到服务器,但这不是故事的全部。
据我所知,什么是阻止我的是RMI连接下使用的引擎盖。缺少的是客户机(调试器运行的地方)和主机(应用程序运行的地方)之间的“隧道”。
在windows中,你会打开一个cmd并给予:

putty.exe -ssh <username>@<remote-host> -L <port>:<remote-host>:<same_port_again>

这将打开一个油灰窗口,该窗口在登录后应保持打开状态,以便隧道保持打开状态。
有关此方面的更多信息,您可以查看@freedev提供的解决方案的第二步中的here
我不确定它是否对你有效,但我怀疑它可能和我的情况一样。

46scxncf

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命令:

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。

rdrgkggo

rdrgkggo5#

您是否尝试使用端口号+ 3(4005)来代替?为容器化应用程序提供单独的调试端口是一种常见的做法

h4cxqtbf

h4cxqtbf6#

使用-Xrunjdwp:transport代替-agentlib:jdwp=transport

-Xdebug -Xrunjdwp:transport=dt_socket,address=*:8787,server=y,suspend=n

相关问题