programing tip

Maven에서 디버깅?

itbloger 2020. 11. 26. 07:58
반응형

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 웹 사이트 또는 Google)를 찾을 수 없습니다. 플러그인을 사용해야한다고 생각합니다.


Brian이 말했듯이 원격 디버깅을 사용할 수 있습니다.

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"

그런 다음 이클립스에서 원격 디버깅을 사용하고 디버거를 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-2105Eclipse 기반 IDE 다루기 에서 자세한 내용을 확인하십시오 .


나는 OSX 및 Linux 사람들을 위해 다음 답변을 확장 할 것이라고 생각했습니다 (필요하지 않음).

mvnDebug사용하는 것을 선호합니다 . 하지만 OSX 매버릭이 내 Java 개발 환경을 파괴 한 후 처음부터 시작하여이 게시물을 살펴보고 추가 할 것이라고 생각했습니다.

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

DOH! Maverick을 설치할 때 새 SSD 드라이브 및 / 또는 모든 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입니다! 활!

$ 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

Ditto 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는 JVMTI (Java Virtual Machine Tools Interface)에서 사용하는 JVM에서 디버깅 기능을 활성화합니다. JVMTI는 디버거 및 프로파일 링 도구에서 사용하는 하위 수준 디버깅 인터페이스입니다.이를 통해 상태를 검사하고 실행을 제어 할 수 있습니다. JVM에서 실행되는 응용 프로그램. "

"The subset of JVMTI that is most typically used by profilers is always available. However, the functionality used by debuggers to be able to step through the code and set breakpoints has some overhead associated with it and is not always available. To enable this functionality you must use the -Xdebug option."

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

Check out the docs on -Xrunjdwp too. You can enable it only when a certain exception is thrown for example. You can start it up suspended or running. Anyway.. I digress.


I found an easy way to do this -

Just enter a command like this -

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

It will start listening to 5005 port. Now just create a remote debugging in Eclipse through Debug Configurations for localhost(any host) and port 5005.

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


If you are using Netbeans, there is a nice shortcut to this. Just define a goal exec:java and add the property jpda.listen=maven Netbeans screenshot

Tested on Netbeans 7.3


If you don't want to be IDE dependent and want to work directly with the command line, you can use 'jdb' (Java Debugger)

As mentioned by Samuel with small modification (set suspend=y instead of suspend=n, y means yes which suspends the program and not run it so you that can set breakpoints to debug it, if suspend=n means it may run the program to completion before you can even debug it)

On the directory which contains your pom.xml, execute:

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"

Then, open up a new terminal and execute:

jdb -attach 1044

You can then use jdb to debug your program!=)

Sources: Java jdb remote debugging command line tool


Why not use the JPDA and attach to the launched process from a separate debugger process ? You should be able to specify the appropriate options in Maven to launch your process with the debugging hooks enabled. This article has more information.


I use the MAVEN_OPTS option, and find it useful to set suspend to "suspend=y" as my exec:java programs tend to be small generators which are finished before I have manage to attach a debugger.... :) With suspend on it will wait for a debugger to attach before proceding.

참고URL : https://stackoverflow.com/questions/2935375/debugging-in-maven

반응형