web-dev-qa-db-ja.com

Mavenでデバッグしますか?

Mavenからjdbなどのデバッガを起動することは可能ですか?プロジェクトを正常にコンパイルするpom.xmlファイルがあります。ただし、プログラムはどこかでハングし、jdbまたは同等のデバッガーを起動して、何が起こっているのかを確認したいと思います。

mvn compileを使用してコンパイルし、次を使用して起動します。

mvn exec:Java -Dexec.mainClass="com.mycompany.app.App"

私は次のようなものを期待していました:

mvn exec:jdb -Dexec.mainClass="com.mycompany.app.App"

デバッガを起動しますが、いつものように、私の期待はmavenの哲学と一致しません。

また、デバッグの仕組みを説明するドキュメント(MavenのWebサイトまたはgoogle)も見つかりませんでした。プラグインを使用する必要があると思われます。

60
aduric

ブライアンが言ったように、リモートデバッグを使用できます。

mvn exec:exec -Dexec.executable="Java" -Dexec.args="-classpath %classpath -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044 com.mycompany.app.App"

その後、Eclipseでリモートデバッグを使用して、デバッガーをlocalhost:1044にアタッチできます。

32
Samuel Yung

Maven 2.0.8+を使用している場合は、mvnDebugの代わりにmvnコマンドを実行し、デバッガーをポート8000​​に接続します。

Maven <2.0.8の場合、%M2_HOME%/bin/mvn.bat(そして変更されたバージョンをmvnDebug.bat):

@REM set MAVEN_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000

詳細については、 MNG-2105 および EclipseベースのIDEでの対処 を参照してください。

100
Pascal Thivent

私は、OSXとLinuxの人々のためにこれらの答えを拡張すると思った(彼らがそれを必要としているわけではない):

mvnDebugも使用したいです。しかし、OSX maverickが私のJava dev環境を破壊した後、私はゼロから始めてこの投稿を無精ひげにし、それに追加すると思いました。

$ mvnDebug vertx:runMod
-bash: mvnDebug: command not found

DOH!新しいSSDドライブやMaverickをインストールしたときのすべてのリセットJava)の後、このボックスに設定していません。

OSXとLinuxのパッケージマネージャーを使用しているので、mvnが実際にどこにあるのかわかりません。 (私は短期間知っている..醸造に感謝。私はこれを知らないことが好きです。)

どれどれ:

$ which mvn
/usr/local/bin/mvn

そこに...あなたは小さなb @ stardです。

さて、どこにインストールしましたか:

$ ls -l /usr/local/bin/mvn

lrwxr-xr-x  1 root  wheel  39 Oct 31 13:00 /
                  /usr/local/bin/mvn -> /usr/local/Cellar/maven30/3.0.5/bin/mvn

あぁ!したがって、/ usr/local/Cellar/maven30/3.0.5/bin/mvnにインストールされました。生意気な小さなビルドツール。自作で間違いない...

あなたの小さな仲間のmvnDebugを持っていますか?

$ ls /usr/local/Cellar/maven30/3.0.5/bin/mvnDebug 
/usr/local/Cellar/maven30/3.0.5/bin/mvnDebug

良い。良い。とても良い。すべて計画どおりに進んでいます。

さあ、彼のことをもっと簡単に思い出せる場所に小さなb @ stardを移動してください。

$ ln -s /usr/local/Cellar/maven30/3.0.5/bin/mvnDebug /usr/local/bin/mvnDebug
  ln: /usr/local/bin/mvnDebug: Permission denied

コンピューターをくそー...私の意志に提出します。私が誰だか知ってる?私は須藤です!弓!

$ Sudo ln -s /usr/local/Cellar/maven30/3.0.5/bin/mvnDebug /usr/local/bin/mvnDebug

今、私はEclipseからそれを使用することができます(が、IntelliJを持っているときになぜそうするのですか!!!!

$ mvnDebug vertx:runMod
Preparing to Execute Maven in Debug Mode
Listening for transport dt_socket at address: 8000

内部的にmvnDebugはこれを使用します:

MAVEN_DEBUG_OPTS="-Xdebug -Xnoagent -Djava.compiler=NONE  \
-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000"

そのため、変更できます(通常、ポート9090でデバッグします)。

このブログでは、Eclipseリモートデバッグのセットアップ方法について説明しています(震え)

http://javarevisited.blogspot.com/2011/02/how-to-setup-remote-debugging-in.html

同じNetbeans

https://blogs.Oracle.com/atishay/entry/use_netbeans_to_debug_a

Ditto IntelliJ http://www.jetbrains.com/idea/webhelp/run-debug-configuration-remote.html

一般的な-Xdebugコマンドに関する優れたドキュメントを次に示します。

http://docs.Oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html

「-Xdebugは、Java Virtual Machine Tools Interface(JVMTI)によって使用されるJVMのデバッグ機能を有効にします。JVMTIは、デバッガーおよびプロファイリングツールによって使用される低レベルのデバッグインターフェイスです。 JVMで実行されているアプリケーションの状態を検査し、実行を制御できます。」

「プロファイラで最も一般的に使用されるJVMTIのサブセットは常に使用可能です。ただし、デバッガーがコードをステップ実行してブレークポイントを設定できる機能には、それに関連するオーバーヘッドがあり、常に使用できるとは限りません。 -Xdebugオプションを使用する必要があります。」

-Xrunjdwp:transport=dt_socket,server=y,suspend=n myApp

-Xrunjdwpのドキュメントもご覧ください。たとえば、特定の例外がスローされた場合にのみ有効にできます。中断または実行中に起動できます。とにかく..私は脱線します。

21
RickHigh

これを行う簡単な方法を見つけました-

このようなコマンドを入力するだけです-

>mvn -Dtest=TestClassName#methodname -Dmaven.surefire.debug test

5005ポートのリッスンを開始します。次に、localhost(任意のホスト)およびポート5005のデバッグ構成を使用して、Eclipseでリモートデバッグを作成します。

ソース- https://doc.nuxeo.com/display/CORG/How+to+Debug+a+Test+Run+with+Maven

13
abhihello123

Netbeansを使用している場合、これへの素敵なショートカットがあります。目標を定義するexec:Javaおよびプロパティjpda.listen=maven Netbeans screenshot

Netbeans 7.3でテスト済み

8

IDEに依存せず、コマンドラインで直接作業したい場合は、 'jdb'(Java Debugger)を使用できます。

サミュエルが少し修正して述べたように(suspend = nの代わりにsuspend = yを設定すると、yはyesを意味し、プログラムを中断して実行しないので、ブレークポイントを設定してデバッグできます。suspend= nでプログラムを実行できる場合デバッグする前に完了する必要があります)

Pom.xmlを含むディレクトリで、次を実行します。

mvn exec:exec -Dexec.executable="Java" -Dexec.args="-classpath %classpath -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=1044 com.mycompany.app.App"

次に、新しいターミナルを開き、次を実行します。

jdb -attach 1044

その後、jdbを使用してプログラムをデバッグできます!=)

ソース: Java jdbリモートデバッグコマンドラインツール

4
Chee Loong Soon

[〜#〜] jpda [〜#〜] を使用して、別のデバッガープロセスから起動プロセスにアタッチしないのはなぜですか。 Mavenで適切なオプションを指定して、デバッグフックを有効にしてプロセスを起動できる必要があります。 この記事 に詳細があります。

3
Brian Agnew

私はMAVEN_OPTSオプションを使用し、exec:Javaプログラムは小さなジェネレーターである傾向があるため、サスペンドを「suspend = y」に設定すると便利です。デバッガーをアタッチする前に終了します。デバッガーが接続されるのを待ってから処理します。

3
flurdy