[m2.0.3] Embedder - no way to override the "localRepository", .start() and alignWithUserInstallation broken -----------------------------------------------------------------------------------------------------------
Key: MNG-2200 URL: http://jira.codehaus.org/browse/MNG-2200 Project: Maven 2 Type: Bug Components: Embedding Versions: 2.0.3 Environment: All Reporter: Dan Rollo There is no way to override the "localRepository" used by MavenEmbedder. Some code from MavenEmbedder.java: public void setLocalRepositoryDirectory( File localRepositoryDirectory ) { this.localRepositoryDirectory = localRepositoryDirectory; } ... public void start() throws MavenEmbedderException { detectUserInstallation(); ... private void detectUserInstallation() { if ( new File( userHome, ".m2" ).exists() ) { alignWithUserInstallation = true; } } /** * Create the Settings that will be used with the embedder. If we are aligning with the user * installation then we lookup the standard settings builder and use that to create our * settings. Otherwise we constructs a settings object and populate the information * ourselves. * * @throws MavenEmbedderException * @throws ComponentLookupException */ private void createMavenSettings() throws MavenEmbedderException, ComponentLookupException { if ( alignWithUserInstallation ) { // ---------------------------------------------------------------------- // We will use the standard method for creating the settings. This // method reproduces the method of building the settings from the CLI // mode of operation. // ---------------------------------------------------------------------- settingsBuilder = (MavenSettingsBuilder) embedder.lookup( MavenSettingsBuilder.ROLE ); ... } else { if ( localRepository == null ) { throw new IllegalArgumentException( "When not aligning with a user install you must specify a local repository location using the setLocalRepositoryDirectory( File ) method." ); } settings = new Settings(); settings.setLocalRepository( localRepositoryDirectory.getAbsolutePath() ); ... The detectUserInstallation() method will never allow me to override the localRepository if an ".m2" user directory exists (even if I call setAlignWithUserInstallation(false) and/or call setLocalRepositoryDirectory() before calling start() ). The current logic in the start() method always sets the field "alignWithUserInstallation" to true if ".m2" exists. Jason has confirmed this is a bug (on the maven user list), which he is working on, but on a major branch due to be merged at some point in the future. That said, I think this issue can easily be fixed quickly with the code change below applied to the method detectUserInstallation(): private void detectUserInstallation() { if ( new File( userHome, ".m2" ).exists() ) { alignWithUserInstallation = true; } } changed to (added another condition in the if): private void detectUserInstallation() { if ( new File( userHome, ".m2" ).exists() && localRepositoryDirectory == null ) { alignWithUserInstallation = true; } } If the next Embedder release will occur very soon and will include Jason's fixes, this bug is likely already fixed. However, if the merging of Jason's branch is a long way off, please consider fixing this bug for the next release. thanks Dan -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://jira.codehaus.org/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira