javamavenversions-maven-pluginmaven-wagon-plugin

Maven versions plugin: reference a rule.xml from a maven dependency?


I am using the mvn versions:display-dependency-updates versions:display-plugin-updates goals to check for dependencies or plugins updates.

My maven project is a multi module one, which looks like this:

moduleA
 |- moduleB1
 |    |- moduleC  
 |- moduleB2
 |- build-config/rules.xml

Since there is some unwanted updates, like betas I don't want, I've made a filter (which works). I use it like that:

<profile>
  <id>maven-version-plugin-1</id>
  <activation>
    <property>
      <name>version.rules.uri</name>
    </property>
  </activation>
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>versions-maven-plugin</artifactId>
        <configuration>
          <rulesUri>${version.rules.uri}</rulesUri>
        </configuration>
      </plugin>
    </plugins>
  </build>
</profile>

I am forced to use a profile and a property version.rules.uri because it must refer to an existing file (by default it points to ./build-config/rules.xml, but it is also in my settings.xml with an absolute path).

I'd like to avoid that by:

Now the question: is there an implementation of Maven Wagon Plugin (which is used by maven versions plugin) that allow for reading a repository entry such as a jar ?


Solution

  • Based upon the documentation for the plugin this is possible:

    You can provide your ruleset xml file also within a jar, if you want to distribute your ruleset xml as Maven artifact. Therefore you have to declare the containing jar as direct dependency of the versions-maven-plugin and to use classpath as protocol.

    I just tried it out and got it to work.

    Create a new folder for the new version-rules artifact, as so:

    version-rules
      |- files
           \- version-rules.xml
      \- pom.xml
    

    The pom.xml is pretty basic:

        ...
        <artifactId>my-version-rules</artifactId>
        <packaging>jar</packaging>
    
        <build>
            <defaultGoal>package</defaultGoal>
            <resources>
                <resource>
                    <directory>files</directory>
                    <filtering>false</filtering>
                    <includes>
                        <include>**/*</include>
                    </includes>
                </resource>
            </resources>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
        ...
    
    

    run a mvn install to install this artifact.

    Then, in the other pom, you configure the versions plugin as follows:

        ...
        <build>
            ...
            <pluginManagement>
                ...
                <plugins>
                    ...
                    <plugin>
                        <groupId>org.codehaus.mojo</groupId>
                        <artifactId>versions-maven-plugin</artifactId>
                        <version>2.7</version>
                        <configuration>
                            <rulesUri>classpath:///version-rules.xml</rulesUri>
                        </configuration>
                        <dependencies>
                            <dependency>
                                <groupId>com.mycompany</groupId>
                                <artifactId>my-version-rules</artifactId>
                                <version>1.0-SNAPSHOT</version>
                            </dependency>
                        </dependencies>
                    </plugin>
                    ...
                </plugins>
                ...
            </pluginManagement>
            ...
        </build>
        ...