IntelliJ IDEA 13 отладчик не останавливается на контрольной точке в java для проекта maven
У меня есть точка останова на строке, где находится команда System.out.println("test")
.
Я считаю, что команда выполняется путем выполнения, потому что я вижу напечатанную строку "test".
Но точка останова игнорируется.
Точка останова - красный круг все время, без тика или креста.
Я думаю, что это проблема, когда IDEA считает, что класс не загружен, а он есть, потому что команда выполнена.
Я могу воспроизвести его в различных обстоятельствах:
-
Когда я нажимаю debug (с конфигурацией maven install exec:exec -DforkMode=never
)
-
Удаленная отладка - я запускаю команду 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
- Транспорт: Socket
- Режим отладки: Прикрепить
- Хост: localhost
- Порт: 8000
В обоих случаях отладчик только печатает "Подключен к целевой VM, адрес:" localhost: 8000 ", транспорт:" сокет "
Я также пробовал 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
Название ОС: "linux", версия: "3.11.0-17-generic", arch: "amd64", family: "unix"
EDIT:
соответствующая часть 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>
Ответы
Ответ 1
Мое решение:
Учитывая, что у вас есть программа, которая зависит от свойств системы:
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"
С помощью некоторой "начальной магии" мы можем отладить процесс, запущенный Maven exec:exec
.
Maven
Измените цель exec:exec
, чтобы включить удаленную отладку. Я использую suspend=y
и server=n
, но не стесняйтесь настраивать JDWP Agent, как вам угодно:
-agentlib:jdwp=transport=dt_socket,server=n,address=127.0.0.1:8000,suspend=y
Это будет не передаваться непосредственно в mVN maven, вместо этого он будет передан в 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. Вы должны настроить ее в соответствии с вашими настройками процесса):
![введите описание изображения здесь]()
Теперь переключите свои точки останова и Отладка удаленной конфигурации. Используя приведенные выше настройки, он будет ждать, пока ваш процесс не запустится:
![введите описание изображения здесь]()
Наконец, запустите строку exec:exec
выше и отлаживайте приложение по своему усмотрению:
![введите описание изображения здесь]()
Итак, в основном вам нужны две конфигурации "Run/Debug" для этого:
-
Конфигурация Maven для exec:exec
с системными свойствами и конфигурацией агента JDWP:
![введите описание изображения здесь]()
-
Удаленная конфигурация, действующая как клиент.
Ответ 2
Цель exec
будет выполнять вашу программу в отдельном процессе, поэтому отладчик может не подключаться к правой JVM. Вместо этого попробуйте использовать цель java
, например:
mvnDebug install exec:java
Это приведет к выполнению вашей программы в том же процессе и, надеюсь, вы попадете в точку останова.
Ответ 3
Чтобы отлаживать веб-приложения в проектах maven с помощью Intellij Community Edition, вы можете добавить плагин tomcat или пристань к вашему WAR-помпу, например:
<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 или любого другого сервера и полностью развернуть приложение, при этом отладка и горячее развертывание обрабатываются прозрачно.
Существует 30-дневная пробная версия, где вы можете оценить эту функцию и другие.