web-dev-qa-db-ja.com

Java for Dockerized WebLogicを介して、intelliJもStudio Codeも使用せずに動作するようにデバッグを設定できません

ドッキングしたWebLogic 12cでデプロイしたWARにデバッガーを接続したい。私はこのLinux(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 "ハンドシェイクに失敗しました-接続が早期に閉じられました"

私のOSはWindows10です。 Visual Studio CodeIntelliJと同じ出力を得ました。 WARは問題なく動作し、portmanを使用していくつかのサービスエンドポイントにアクセスすると応答します。

コンテナ内のweblogic起動スクリプトがJava Options paramを2回適用しようとしています!以下のコンテナ出力の相対的な部分を参照してください。

ドメインホームは/ u01/Oracle/user_projects/domains/docker_domainPicked up Java_TOOL_OPTIONS: "-agentlib:jdwp = transport = dt_socket、address = localhost: 4002、server = y、suspend = n "次のアドレスでトランスポートdt_socketをリッスンしています:4002WebLogic Sc​​ripting Tool(WLST)を初期化しています... WebLogic Server管理スクリプトシェルへようこそ

[...](さらに、ログのさらに下に表示されます:)

次の行でWLSを開始:/ usr/Java/jdk-8/bin/Java -server -Djava.security.egd = file:/ dev /./ urandom -cp/u01/Oracle/wlserver/server/lib/weblogic-launcher .jar -Dlaunch.use.env.classpath = true -Dweblogic.Name = AdminServer -Djava.security.policy =/u01/Oracle/wlserver/server/lib/weblogic.policy -Djava.system.class.loader = com。 Oracle.classloader.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.ServerPicked up 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ファイルを作成して環境プロップを追加し、これらが2回実行されないようにしました。私はまったく同じ動作をしました。どちらのポートを使用しても、すでに使用されています

これは私の.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

他に何を試すべきかわからない!

3
JohnPan

address=*:4002の代わりにaddress=4002を追加してみてください

1
Akshay Shah

Java_OPTSはTomcat固有の環境変数です

Java 8では、JDKはJava_TOOL_OPTIONSデバッガーを有効にするための環境変数。置き換えてみてくださいJava_OPTSJava_TOOL_OPTIONS

次のようにアドレスを設定する必要もあります:address=*:8000address=localhost:4002またはaddress=0.0.0.0:4002

1
Vargan

メモリ監視ツール(JVisualVM)の接続に関しても同様の問題がありました。サーバーにtelnetで接続できましたが、それだけではありませんでした。

私が何をブロックしていたかを理解したところ、内部で使用されているRMI接続でした。欠けていたのは、クライアント(デバッガーが実行される場所)とホスト(アプリケーションが実行される場所)のマシン間の「トンネル」でした。

Windowsでは、cmdを開いて次のように指定します。

PuTTY.exe -ssh <username>@<remote-Host> -L <port>:<remote-Host>:<same_port_again>

これにより、PuTTYウィンドウが開きます。トンネルは開いたままにするために、ログイン後も開いたままにする必要があります。

これの詳細については、@ freedevが提供するソリューションの2番目のステップで here を確認できます。

うまくいくかどうかはわかりませんが、私の場合と同じかもしれません。

1
Lucky Luke

代わりにポート番号+ 3(4005)を使用してみましたか?これは、コンテナー化されたアプリケーション用に個別のデバッグポートを用意するのが一般的です

0