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>

Wrong buildpath

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:

  1. 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).
  2. Now install the plugin with „mvn install“. This will install the newest version in the local repository.
  3. Then use „mvn eclipse:eclipse“ to generate all eclipse-files for the maven-eclipse-plugin.
  4. 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.
  5. 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).

  6. Now build maven with „mvn install“ and prepare the usage in eclipse with „mvn eclipse:eclipse“.
  7. 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!
  8. Now your workspace should look like this:
    Ready to hack maven-eclipse-plugin
  9. 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

  1. Start „mvnDebug eclipse:eclipse“ in the eclipse-test project
  2. 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 😀