I must confess that, sadly enough, Maven has never been a strength of mine so that it was no surprise that my plugin didn't immediately function properly. The problem I faced was in the passing of the parameters to my Mojo during execution of my newly created plugin.
When converted to Java 5 annotation, the class "outputDirectory" attribute, in the default created Mojo, was always null even though I had the proper configuration in my host project's pom.xml
<configuration>
<outputDirectory>C:\Users\wnpr\Downloads</outputDirectory>
</configuration>
To make sure that we all have the same starting point let me begin, by showing how I used the Maven Integration for Eclipse plugin, M2E, to create a new Maven project as shown below.
Then I selected the "maven-archetype-mojo" as a temple for my new project,
and finally gave my plugin a groupId and artefactId.
Every plugin needs a plugin.xml file, which is generated by the maven-plugin-plugin and which can be found the the META-INF\maven folder of the generated jar file. By default, maven-plugin-plugin generates the plugin.xml file from the Mojo Javadoc Tags found in the Java code. These tags look like this:
/**
* Goal which touches a timestamp file.
*
* @goal touch
*
* @phase process-sources
*/
If you, as I did, would rather use Java 5 annotations, such as:
@Mojo( name = "touch" )
public class MyMojo
extends AbstractMojo {
@Parameter(defaultValue = "c:\\", required=true)
public File outputDirectory;
@Parameter(defaultValue = "Hello World!!!!", required=true)
public String greeting;
.
}
for you plugin.xml generation, then you will have to rely on another plugin; namely: maven-plugin-annotations.
To do this you will have to add an additional dependency, to your plugin project's pom.xml.
<!-- dependencies to annotations -->
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.4</version>
<scope>provided</scope>
</dependency>
and override Maven core's default-descriptor execution phase to process-classes as follows:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.4</version>
<executions>
<execution>
<id>default-descriptor</id>
<phase>process-classes</phase>
</execution>
<!-- if you want to generate help goal -->
<!--
<execution>
<id>help-goal</id>
<goals>
<goal>helpmojo</goal>
</goals>
</execution>
-->
</executions>
</plugin>
</plugins>
</build>
It wasn't until this last change that the @Parameter annotated attributes of my Mojo were finally set properly during execution of my plugin. Both of these additions are well described here; however, when I read them for the first time, I wasn't smart enough to understand them; as often is the case, and needed to waste a day before I finally came to my senses.
If you get a message like this:
Error extracting plugin descriptor: 'Goal: touch already exists in the plugin descriptor for prefix: junk
[ERROR] Existing implementation is: org.wmmnpr.junk_maven_plugin.MyMojo
then be sure to delete the old Javadoc Tags.
Good luck!
No comments:
Post a Comment