TL;DR;

Um ein Maven Goal zu debuggen, kann Maven einfach mit dem Befehl mvndebug anstelle von mvn aufgerufen werden. Danach kann man sich ganz einfach mit einem remote Debugger verbinden. Alternativ kann das Plugin auch als Module in IntelliJ importiert werden. Dann können Goals sogar über die Maven Toolbar im Debug Modus gestartet werden.

In komplexeren Projekte kommt es durchaus mal vor, dass man gezwungen ist ein Maven Plugin zu debuggen. Und sei es nur um herauszufinden warum eines der Standard-Plugins sich nicht so verhält wie man es erwartet, oder um tatsächlich einen Bug in einem selbst entwickelten Plugin zu beheben.

Da mir genau das neulich mal wieder passiert ist, dachte ich mir ich könnte mal kurz erklären welche Möglichkeiten es dafür gibt.

 

Voraussetzungen

Egal wie wir die Sache angehen wollen, damit wir ein Plugin debuggen können, benötigen wir auf jeden Fall den Source Code des Plugins. Dabei solltet Ihr darauf achten, dass Ihr auch die richtige Version verwendet.

In diesem Beispiel werde ich das Spring Boot Maven Plugin als Beispiel verwenden. Das entsprechende Repository habe ich dafür geklont.

Um nun ein Goal des Plugins zu debuggen, muss ich dieses irgendwie mit Maven ausführen. Dafür habe ich zwei Möglichkeiten.

 

Über die Kommandozeile

Die Meisten wissen bestimmt wie wir ein Maven Goal über die Kommandozeile ausführen können. Um beispielsweise das Goal „build-info“ auszuführen, würden wir den folgenden Befehl verwenden:

mvn org.springframework.boot:spring-boot-maven-plugin:build-info

Es gibt allerdings noch ein zweites, weniger bekanntes Kommando, welches wir zum Debuggen verwenden können. Dafür ersetzen wir einfach mvn durch mvndebug:

mvndebug org.springframework.boot:spring-boot-maven-plugin:build-info

Wenn wir das Kommando jetzt ausführen, sehen wir dass Maven direkt nach dem Start darauf wartet, dass ein Debugger verbunden wird:

Listening for transport dtsocket at address: 8000

Jetzt können wir einfach unser Plugin Projekt in einer beliebigen IDE öffnen und uns per Remote Debugger mit Maven verbinden. In IntelliJ würden wir dafür eine Run Configuration vom Typ „Remote“ mit den folgenden Einstellungen anlegen und starten:

Sobald der Debugger verbunden ist, läuft Maven weiter. Zum Testen könnt Ihr einfach mal einen Breakpoint in der execute() Methode setzen.

 

Direkt in IntelliJ

Das Debuggen über mvndebug ist eigentlich schon recht komfortabel. Das einzige was mich daran gestört hat, ist dass ich ständig zwischen zwei Instanzen meiner IDE hin und her springen muss. Das wird vor allem auf einem Laptop Monitor nach einiger Zeit echt nervig. Deshalb habe ich nach einer Möglichkeit gesucht, alles in der gleichen IntelliJ Instanz zu machen.

Um zu verhindern, dass wir immer zwei Instanzen der IDE benutzen müssen, können wir das Plugin-Projekt in unseren IntelliJ Workspace importieren. Dafür öffnen wir die Module Settings unseres Projekts und Importieren unter Modules das Plugin-Projekt.

Jetzt können wir ganz einfach über eine Rechtsklick Maven Goals in unserem Projekt ausführen. IntelliJ kümmert sich automatisch darum den Debugger zu verbinden. Ob alles funktioniert hat, sehen wir wenn der Breakpoint in der execute() Methode erreicht wird.

Technisch funktionieren die beiden Methoden über das Java Debug Wire Protocol (JDWP), also das Standardverfahren zum remote Debugging in Java. Der einzige Unterschied ist die Integration in die IDE.