Hacking maven-eclipse-plugin with eclipse-ide
This article show you how you can fix bugs for maven-plugins (eclipse setup for hacking the code, debugging etc.) with a concrete project: maven-eclipse-plugin. Lets start …
At the moment one of my private todos is to fix a classpath-bug for mavens eclipse-plugin.
First of all: this maven-plugin is great! If you have a maven-project and you want edit the source inside the eclipse-ide all you have to do is „mvn eclipse:eclipse“ in the base-dir of the project. The plugin will generate all eclipse-files for you, e.g. „.project“, „.classpath“, the „.settings“-directory etc. And there is much more … e.g. pde-development with maven. Have a look at the plugin-homepage.
Ok. What’s the problem? I have a pom with more than one resources:
... <build> <resources> <resource> <filtering>true</filtering> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> </includes> </resource> <resource> <filtering>false</filtering> <directory>src/main/resources</directory> <excludes> <exclude>**/*.properties</exclude> </excludes> </resource> </resources> </build> ...
The resources directory contains a lot of resources. For all property-files i want activate filtering, meens maven should replace placeholders in the files before the result is copied into the target-directory.
If i now start „mvn eclipse:eclipse“ the plugin doesnt handle the different directories/includes/excludes correct. The result is a .classpath like this (i removed uninteresting entries).
<classpath> <classpathentry kind="src" path="src/main/resources" including="**/*.properties" excluding="**/*.java"/> </classpath>
The second resource (with disabled filtering and the exlude for *.properties) was not included in the classpath. If the resource-directory contains other „important“ files (e.g. spring-xmls for test or images or whatever) then the eclipse-environment is not complete.
The problem is now clear 🙂 So lets fix the .classpath-generation-code. The plugin-code is available, maven can be started in debug-mode with „mvnDebug eclipse:eclipse“ but then my first debug-session was not sucessful. I’m searching for the correct place to fix the code but where should i place a breakpoint? Mhhh … no sources for the maven-code … first of all i need a complete debugable maven-environment. To make a long story short … i got it 😀 Here is the todo-list:
- Use Eclipse and checkout maven-eclipse-plugin (Its a good idea to use the trunk – http://svn.apache.org/repos/asf/maven/plugins/trunk/maven-eclipse-plugin).
- Now install the plugin with „mvn install“. This will install the newest version in the local repository.
- Then use „mvn eclipse:eclipse“ to generate all eclipse-files for the maven-eclipse-plugin.
- Refresh the maven-eclipse-plugin project in the eclipse-ide. Now you are ready to debug a „mvn eclipse:eclipse“ session. But hold a second! Most of the maven code will not be available in the ide, the debugging is not fun. To handle this you must checkout the maven-code.
Use Eclipse and checkout the maven-sources (http://svn.apache.org/repos/asf/maven/components). There are many branches and tags available. Look into the pom.xml of the maven-eclipse-plugin to find out the right version. The plugin-api dependency is perfect for this:
<dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-plugin-api</artifactId> <version>2.0.8</version> </dependency>
So we have to checkout the 2.0.8 branch (http://svn.apache.org/repos/asf/maven/components/tags/maven-2.0.8).
- Now build maven with „mvn install“ and prepare the usage in eclipse with „mvn eclipse:eclipse“.
- Create a working-set „maven 2.0.8“ and import all subprojects from the maven-project. With eclipse this is very ease. Use the „Existing Projects into Workspace“ import. Select the base-directory of the maven-project and import all subprojects in the workspace. Important: you must delete the „.project“ file in the maven-project-directory to run the bulk-import successfully!
Now your workspace should look like this:
- Now the last step – call „mvn eclipse:eclipse“ for the maven-eclipse-pluigin project (second time). Then you will have a eclipse-project with project-dependencies to the maven-projects (e.g. maven-plugin-api).
The „eclipse-test“ project contains the above pom.xml with the two resources.
To debug the eclipse-plugin i have to
- Start „mvnDebug eclipse:eclipse“ in the eclipse-test project
- Start a „Remote Java Application“ debug-session (localhost:8000) with additional sources of „maven-eclipse-plugin-trunk“ project
NOW I’M READY TO FIX THE CODE 😀