web-dev-qa-db-ja.com

IntelliJ IDEA 13デバッガーはJava for Mavenプロジェクトのブレークポイントで停止しません

System.out.println("test")コマンドがある行にブレークポイントがあります。印刷された文字列 "test"が表示されるため、コマンドは実行によって到達すると考えています。ただし、ブレークポイントは無視されます。

ブレークポイントは常に赤い丸で、目盛りや十字はありません。 IDEA=は、コマンドが実行されるため、クラスがロードされていないと考えている場合、これは問題だと思います。

私はさまざまな状況でそれを再現できます:

  1. デバッグを押すと(Maven構成install exec:exec -DforkMode=never

  2. リモートデバッグ-コンソールでデバッグモードでmavenゴールを実行します。

    mvnDebug install exec:exec -DforkMode=never

    または

    mvnDebug install exec:exec

    iDEAのリモートデバッグ構成:

    • リモートJVMを実行するための引数:
      -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
    • JDK 1.4.Xの場合:
      -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
    • トランスポート:ソケット
    • デバッガーモード:接続
    • ホスト:localhost
    • ポート:8000

どちらの場合も、デバッガーは「ターゲットVMに接続済み、アドレス: 'localhost:8000'、トランスポート: 'socket'」のみを出力します

私も試してみましたFile > Invalidate Caches / Restartおよびクリーンビルドですが、ブレークポイントは引き続き無視されます。

構成:

Ubuntu 13.10
IntelliJ IDEA Ultimate build 133.944
Apache Maven 3.0.4
Javaバージョン:1.7.0_51、ベンダー:Oracle Corporation
OS名:「linux」、バージョン:「3.11.0-17-generic」、Arch:「AMD64」、family:「unix」

編集:pom.xmlの関連部分:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <version>1.2.1</version>
  <configuration>
    <executable>Java</executable>
      <arguments>
        <argument>-D--secret--.server.configuration=/usr/local/etc</argument>
        <argument>-classpath</argument><classpath/>
        <argument>com.--secret--.Server</argument>
      </arguments>
  </configuration>
</plugin>
17
mirelon

私の解決策:

システムプロパティに依存するプログラムがあることを考慮してください。

package com.mycompany.app;


public class App {

    private static final String GREETING = System.getProperty("greeting", "Hi");

    public static void main(String[] args) {
        int x = 10;
        System.out.println(GREETING);
    }
}

そして、あなたはexec:execでそれを実行しています:

mvn exec:exec -Dexec.executable=Java "-Dexec.args=-classpath %classpath -Dgreeting=\"Hello\" com.mycompany.app.App"

「インセプションマジック」を使用すると、Mavenexec:execによって開始されたプロセスをデバッグできます。

メイヴン

exec:exec目標を変更して、リモートデバッグを有効にします。 suspend=yserver=nを使用していますが、自由に JDWPエージェント を設定してください:

-agentlib:jdwp=transport=dt_socket,server=n,address=127.0.0.1:8000,suspend=y

これはnotmaven JVMに直接渡され、代わりにexec.argsに渡され、exec:execによって使用されます:

mvn exec:exec -Dexec.executable=Java "-Dexec.args=-classpath %classpath -agentlib:jdwp=transport=dt_socket,server=n,address=127.0.0.1:8000,suspend=y -Dgreeting=\"Hello\" com.mycompany.app.App"

IntelliJ IDEA

Remote構成を作成します(ここでもListen戦略を使用しています。プロセス設定に従って調整する必要があります)。

enter image description here

次に、ブレークポイントを切り替えて、リモート構成をDebugします。上記の設定を使用すると、プロセスが開始するまで待機します。

enter image description here

最後に、上記のexec:exec行を実行し、アプリケーションを自由にデバッグします。

enter image description here


基本的に、これを機能させるには2つの「実行/デバッグ」構成が必要です。

  1. システムプロパティとJDWPエージェント構成を含むexec:execのMaven構成:

    enter image description here

  2. clientとして機能するリモート構成。

8
Anthony Accioly

Intellij Community Editionを使用してMavenプロジェクトのWebアプリケーションをデバッグするには、次のようにTomcatまたはjettyプラグインをWAR pomに追加できます。

<build>
    <plugins>
        <plugin>
            <groupId>org.Apache.Tomcat.maven</groupId>
            <artifactId>Tomcat7-maven-plugin</artifactId>
            <configuration>
                <port>8080</port>
                <path>/yourapp</path>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>maven-jetty-plugin</artifactId>
        </plugin>
    </plugins>
</build>

次のようなデータベースドライバーを追加する必要がある場合は可能です。

<plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>maven-jetty-plugin</artifactId>
    <dependencies>
        <dependency>
           ... your database driver groupId and artifactId ...
        </dependency>
    </dependencies>
</plugin>

次に、これらのプラグインを使用して、アプリケーションをコマンドラインで(pomディレクトリから)起動できます。

mvnDebug clean install Tomcat7:run-war

または桟橋の場合:

mvnDebug clean install jetty:run-war

コマンドラインからデバッグモードで実行しているアプリケーション(Intellijから実行する必要はありません)で、ポストしたものと同様のリモートデバッグ構成を行い、ブレークポイントにヒットする必要があります。

Intellij Ultimate Editionを使用する場合、Tomcatまたは他のサーバーのサーバー構成を作成し、完全に統合された方法でアプリケーションをデプロイでき、デバッグとホットデプロイメントを透過的に処理できるため、これは必要ありません。

日間トライアル があり、この機能や他の機能を評価できます。

1

execゴールは、プログラムを別のプロセスで実行するため、デバッガーが適切なJVMに接続していない可能性があります。代わりに、Javaゴールを使用してみてください。例:

mvnDebug install exec:Java 

これにより、同じプロセスでプログラムが実行され、ブレークポイントに到達することが期待されます。

1
Jonathan