As per the documentation, the Maven release:perform goal checks out the project and then forks a new Maven instance to build it. For some reason the forked instance appears to ignore the user's settings.xml
, which causes an error in my case because that file has the definition of a property that is used to compose the repository's URL in the parent pom.
User's settings.xml
Definition of a property in a "nexus" profile which is always active.<profiles> <profile> <id>nexus</id> <properties> <dist.url>http://host.com/nexus/content/repositories</dist.url> </properties> </profile> </profiles> <activeProfiles> <activeProfile>nexus</activeProfile> </activeProfiles>
Parent's pom.xml
Usage of the defined property to compose the repository's URL.<distributionManagement> <repository> <id>nexus</id> <url>${dist.url}/releases</url> </repository> </distributionManagement>
Command executed:
mvn release:perform
Output (after it indicates having successfully checked out, built, tested and packaged the project):
[INFO] Uploading: ${dist.url}/releases/com/acme/access/my-project/1.0/my-project-1.0.jar [INFO] [INFO] ------------------------------------------------------------------------ [INFO] [INFO] BUILD FAILURE [INFO] [INFO] ------------------------------------------------------------------------ [INFO] [INFO] Total time: 3.659s [INFO] [INFO] Finished at: Wed Aug 01 14:40:23 EDT 2012 [INFO] [INFO] Final Memory: 21M/307M [INFO] [INFO] ------------------------------------------------------------------------ [INFO] [WARNING] The requested profile "nexus" could not be activated because it does not exist. [INFO] [ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project my-project: Failed to deploy artifacts: Could not transfer artifact com.acme.access:my-project:jar:1.0 from/to nexus (${dist.url}/releases): Error transferring file: no protocol: ${dist.url}/releases/com/acme/access/my-project/1.0/my-project-1.0.jar -> [Help 1]
Notice how the forked Maven instance is trying to upload to ${dist.url}, which indicates that the property defined in settings.xml was not read. Also, the warning message informs that profile "nexus" was not found. I'm assuming that the main Maven instance passed the profile information down to the forked instance so it knew to look for it, but since it ignored (or did not find) the user's settings.xml, it could not find that profile.
The only way I have found to circumvent this is to manually specify the location of the settings.xml
file through the use of Maven's command line -s
argument "wrapped" by the plugin's arguments
argument, as in
mvn release:perform -Darguments="-s C:\Users\theuser\.m2\settings.xml"
Is the plugin behaving in an expected/correct way? Is there a way to keep the property definition inside the user's settings.xml
without having to specify the location of the file as I have done above?
More information:
The problem seems to be specifically with the plugin not finding the user's
settings.xml
, as copying the profile information into the globalsettings.xml
does cause it to work.The user's
settings.xml
is properly named/created because runninghelp:active-profiles
indicates that the profile is active. Manually building and deploying withmvn clean deploy
also works correctly (ie, the repository URL is correctly calculated and the artifact is uploaded).