Using with Maven Invoker and Repositories
The aim here is to combine the usage of the mrm-maven-plugin with the maven-invoker-plugin to
allow the integration tests of a Maven Plugin to be run against a test local repository thereby ensuring that
the plugin does not get installed into the local repository until after the integration tests have been confirmed
as passing.
First we need to modify the pom.xml to reference both mrm-maven-plugin and the
maven-invoker-plugin
<project>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-invoker-plugin</artifactId>
<version>3.9.1</version>
<executions>
<execution>
<goals>
<goal>install</goal>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
<configuration>
<localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath>
<projectsDirectory>src/it/projects</projectsDirectory>
<settingsFile>src/it/mrm/settings.xml</settingsFile>
<filterProperties>
<mrm.repository.url>${mrm.repository.url}</mrm.repository.url>
</filterProperties>
...
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>mrm-maven-plugin</artifactId>
<version>1.7.0</version>
<executions>
<execution>
<goals>
<goal>start</goal>
<goal>stop</goal>
</goals>
</execution>
</executions>
<configuration>
<repositories>
<!-- serve content from mock repository -->
<mockRepo>
<source>src/it/mrm/repository</source>
<!-- cloneTo>target/mock-repo</cloneTo -->
<!-- cloneClean>true</cloneClean -->
<!-- lazyArchiver>false</lazyArchiver -->
</mockRepo>
<!-- serve content installed by maven-invoker-plugin -->
<localRepo>
<source>${project.build.directory}/local-repo</source>
</localRepo>
<!-- pass everything else to current Maven instance -->
<proxyRepo/>
</repositories>
</configuration>
</plugin>
...
</plugins>
...
</build>
...
</project>
This will result in the following mojos being executed during the lifecycle as follows:
| Phase | Goal(s) |
|---|---|
| pre-integration-test | mrm:start, invoker:install |
| integration-test | invoker:integration-test |
| post-integration-test | mrm:stop |
| verify | invoker:verify |
Additionally, when mrm:start is invoked, it will bind to an available port and set the property
repository.proxy.url to the URL on which the repository is being hosted, and the repository content
will be based on the mockRepo content generated from the following files in src/it/mrm/repository:
-
**/*.pom -
**/*-{classifier}.{type}as file, which will use the GAV of the correspondingpom- file (e.g.mojo-parent-10.pomwithmojo-parent-10-site.xml) -
**/*.{archiver extension}as directory, which will use the GAV of the correspondingpom- file. MRM will create an archive of this directory. -
**/*-{classifier}.{archiver extension}as directory, which will use the GAV of the correspondingpom- file. MRM will create an archive of this directory. -
archetype-catalog.xml -
{archiver extension}can be one of supported by plexus archiver, e.g.jar,zip,tar.gz,tgz,tar.xz, etc.
In additional content install by maven-invoker-plugin:install will be available by localRepo
Finally thanks to proxyRepo, all the repositories available to the current Maven instance will be available too.
We tell maven-invoker-plugin to use the settings.xml file from src/it/mrm/settings.xml
which will look something like:
<?xml version="1.0" encoding="UTF-8"?>
<settings>
<mirrors>
<mirror>
<id>mrm-maven-plugin</id>
<name>Mock Repository Manager</name>
<url>@mrm.repository.url@</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
<profiles>
<profile>
<id>it-repo</id>
<repositories>
<repository>
<id>snapshots</id>
<url>@mrm.repository.url@</url>
<releases>
<enabled>true</enabled>
<checksumPolicy>ignore</checksumPolicy>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<checksumPolicy>ignore</checksumPolicy>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>snapshots</id>
<url>@mrm.repository.url@</url>
<releases>
<enabled>true</enabled>
<checksumPolicy>ignore</checksumPolicy>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<checksumPolicy>ignore</checksumPolicy>
<updatePolicy>always</updatePolicy>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>it-repo</activeProfile>
</activeProfiles>
</settings>
And we also have instructed the maven-invoker-plugin to filter in the property value repository.proxy.url
Thus when the integration tests run, they will use the mock repository manager that we have provisioned.


