Maven 3 - Distribute custom plugin in a .jar?

2019-05-07 09:41发布

问题:

Complete Maven newb here, so forgive any abused terminology, etc.

I've built a custom plugin in Maven 3 (one that defines goals for git rebase). I'm able to:

mvn install

No problem. I can then invoke the goal from the command line:

mvn edu.clemson.cs.rsrg:git-plugin:rebase

Everything's golden. I have this lovely git-plugin-XXX.jar file sitting in my target directory.

I'd like to make my custom goals available to another project such that when other members of the dev team pull down that project's source, they get my plugin for free (or at least, after a mvn build).

My understanding is that the purist solution is to set up a maven repo for the group and load my plugin there, but that seems overkill for a single hacky plugin.

Thoughts?


I've played with doing it via three different plugins so far:

  • addjars-maven-plugin:add-jars

    <plugin>
       <groupId>com.googlecode.addjars-maven-plugin</groupId>
       <artifactId>addjars-maven-plugin</artifactId>
       <version>1.0.4</version>
       <executions>
          <execution>
             <goals>
                <goal>add-jars</goal>
             </goals>
             <configuration>
                <resources>
                   <resource>
                      <directory>${basedir}/plugins</directory>
                   </resource>
                </resources>
             </configuration>
          </execution>
       </executions>
    </plugin>
    

Gives me this error during mvn build:

[ERROR] Error resolving version for plugin 'edu.clemson.cs.rsrg:git-plugin' from the repositories [local (/home/hamptos/.m2/repository), central (http://repo.maven.apache.org/maven2)]: Plugin not found in any plugin repository

It also causes my later formatting plugin to fail. (Clearly it's read the jar and determined the group name/plugin name, but then it goes and looks for it in my local repo? Of course it's not there--I'm trying to install it.)

  • build-helper:attach-artifacts

    <plugin>
       <groupId>org.codehaus.mojo</groupId>
       <artifactId>build-helper-maven-plugin</artifactId>
       <version>1.7</version>
       <executions>
          <execution>
             <id>attach-artifacts</id>
             <phase>install</phase>
             <goals>
                <goal>attach-artifact</goal>
             </goals>
             <configuration>
                <artifacts>
                   <artifact>
                      <file>${basedir}/plugins/git-plugin-0.1.0a.jar</file>
                      <type>jar</type>
                   </artifact>
                </artifacts>
             </configuration>
          </execution>
       </executions>
    </plugin>
    

Gives me this error during mvn build:

[ERROR] Failed to execute goal org.codehaus.mojo:build-helper-maven-plugin:1.7:attach-artifact (attach-artifacts) on project RESOLVE: Execution attach-artifacts of goal org.codehaus.mojo:build-helper-maven-plugin:1.7:attach-artifact failed: For artifact {edu.clemson.cs.rsrg:RESOLVE:12.09.01a:jar}: An attached artifact must have a different ID than its corresponding main artifact.

(RESOLVE:12.09.01a being the main project. Clearly something's gone awry here because the plugin and main project definitely have different artifactIDs. Trying to attach the project on top of itself maybe?)

  • maven-install-plugin:install-file

    <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-install-plugin</artifactId>
       <version>2.3.1</version>
       <executions>
          <execution>
             <id>install-git-plugin</id>
             <phase>initialize</phase>
             <goals>
                <goal>install-file</goal>
             </goals>
             <configuration>
                <file>${basedir}/plugins/git-plugin-0.1.0a.jar</file>
                <packaging>jar</packaging>
                <groupId>edu.clemson.cs.rsrg</groupId>
                <artifactId>git-plugin</artifactId>
                <version>0.1.0a</version>
             </configuration>
          </execution>
       </executions>
    </plugin>
    

Seems to work fine until I try to invoke one of the goals like mvn edu.clemson.cs.rsrg:git-plugin:rebase, at which point it gives me this error:

[ERROR] Failed to execute goal edu.clemson.cs.rsrg:git-plugin:0.1.0a:rebase (default-cli) on project RESOLVE: Execution default-cli of goal edu.clemson.cs.rsrg:git-plugin:0.1.0a:rebase failed: Unable to load the mojo 'rebase' (or one of its required components) from the plugin 'edu.clemson.cs.rsrg:git-plugin:0.1.0a': com.google.inject.ProvisionException: Guice provision errors: [ERROR] [ERROR] 1) Error in ComponentFactory:ant-mojo [ERROR] at ClassRealm[plugin>edu.clemson.cs.rsrg:git-plugin:0.1.0a, parent: sun.misc.Launcher$AppClassLoader@e776f7] [ERROR] while locating org.apache.maven.plugin.Mojo annotated with @com.google.inject.name.Named(value=edu.clemson.cs.rsrg:git-plugin:0.1.0a:rebase)

回答1:

You may think it is hacky, but it is the maven way. It needs to be deployed to a maven repo.

If you keep it in a groupId that you can demonstrably own and it's open source you can publish it to central



标签: maven maven-3