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)も見つかりませんでした。プラグインを使用する必要があると思われます。
ブライアンが言ったように、リモートデバッグを使用できます。
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にアタッチできます。
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での対処 を参照してください。
私は、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のドキュメントもご覧ください。たとえば、特定の例外がスローされた場合にのみ有効にできます。中断または実行中に起動できます。とにかく..私は脱線します。
これを行う簡単な方法を見つけました-
このようなコマンドを入力するだけです-
>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
Netbeansを使用している場合、これへの素敵なショートカットがあります。目標を定義するexec:Java
およびプロパティjpda.listen=maven
Netbeans 7.3でテスト済み
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を使用してプログラムをデバッグできます!=)
[〜#〜] jpda [〜#〜] を使用して、別のデバッガープロセスから起動プロセスにアタッチしないのはなぜですか。 Mavenで適切なオプションを指定して、デバッグフックを有効にしてプロセスを起動できる必要があります。 この記事 に詳細があります。
私はMAVEN_OPTSオプションを使用し、exec:Javaプログラムは小さなジェネレーターである傾向があるため、サスペンドを「suspend = y」に設定すると便利です。デバッガーをアタッチする前に終了します。デバッガーが接続されるのを待ってから処理します。