[ 
https://jira.codehaus.org/browse/MNG-5250?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=292360#comment-292360
 ] 

Yoav Abrahami commented on MNG-5250:
------------------------------------

I did not submit a patch as I am not sure if this is the way you wanna fix this 
issue. However, I have tested my solution and it seems to work fine for large 
maven 2 projects with LATEST for both parent and dependencies
                
> DefaultVersionResolver.readVersions reads snapshot versions from release only 
> repositories
> ------------------------------------------------------------------------------------------
>
>                 Key: MNG-5250
>                 URL: https://jira.codehaus.org/browse/MNG-5250
>             Project: Maven 2 & 3
>          Issue Type: Bug
>          Components: Dependencies, Embedding
>    Affects Versions: 3.0.4
>         Environment: embedded maven
>            Reporter: Yoav Abrahami
>
> with the below repositories configuration in settings.xml [1]
> I get an error that a parent of a project is not found if the parent version 
> is marked as LATEST. 
> The actual error is 
> "Could not find artifact XXX in snapshots (URL of SNAPSHOT repository)"
> while debugging the reason, I have found that because the 
> DefaultVersionResolver.readVersions() method returns SNAPSHOT versions when 
> reading versions from a release only repository (repository with snapshot 
> policy not enabled).
> The fix I have in place is to add to the 
> DefaultVersionResolver.readVersions() method the following fragment:
> (see the full method below [2]
> {code}
> /*
>  * fix for LATEST - repository who does not support snapshots should not 
> return shapshot versions
>  */
> if (versioning != null && repository instanceof RemoteRepository) {
>   RemoteRepository remoteRepository = (RemoteRepository)repository;
>   if (!remoteRepository.getPolicy(true).isEnabled()) {
>     Versioning repaired = new Versioning();
>     repaired.setLastUpdated(versioning.getLastUpdated());
>     repaired.setRelease(versioning.getRelease());
>     repaired.setVersions(versioning.getVersions());
>     versioning = repaired;
>   }
> }
> {code}
> [1] : 
> {code}
> <repositories>
>         <repository>
>           <snapshots>
>             <enabled>false</enabled>
>           </snapshots>
>           <id>central</id>
>           <name>libs-releases</name>
>           <url>http://repo.dev.wix/artifactory/libs-releases</url>
>         </repository>
>         <repository>
>           <snapshots />
>           <id>snapshots</id>
>           <name>libs-snapshots</name>
>           <url>http://repo.dev.wix/artifactory/libs-snapshots</url>
>         </repository>
>       </repositories>
> {code}
> [2] : 
> {code}
>     private Versioning readVersions( RepositorySystemSession session, 
> RequestTrace trace, Metadata metadata,
>                                      ArtifactRepository repository, 
> VersionResult result )
>     {
>         Versioning versioning = null;
>         FileInputStream fis = null;
>         try
>         {
>             if ( metadata != null )
>             {
>                 SyncContext syncContext = syncContextFactory.newInstance( 
> session, true );
>                 try
>                 {
>                     syncContext.acquire( null, Collections.singleton( 
> metadata ) );
>                     if ( metadata.getFile() != null && 
> metadata.getFile().exists() )
>                     {
>                         fis = new FileInputStream( metadata.getFile() );
>                         
> org.apache.maven.artifact.repository.metadata.Metadata m =
>                             new MetadataXpp3Reader().read( fis, false );
>                         versioning = m.getVersioning();
>                         /*
>                          * NOTE: Users occasionally misuse the id "local" for 
> remote repos which screws up the metadata
>                          * of the local repository. This is especially 
> troublesome during snapshot resolution so we try
>                          * to handle that gracefully.
>                          */
>                         if ( versioning != null && repository instanceof 
> LocalRepository )
>                         {
>                             if ( versioning.getSnapshot() != null && 
> versioning.getSnapshot().getBuildNumber() > 0 )
>                             {
>                                 Versioning repaired = new Versioning();
>                                 repaired.setLastUpdated( 
> versioning.getLastUpdated() );
>                                 Snapshot snapshot = new Snapshot();
>                                 snapshot.setLocalCopy( true );
>                                 repaired.setSnapshot( snapshot );
>                                 versioning = repaired;
>                                 throw new IOException( "Snapshot information 
> corrupted with remote repository data"
>                                     + ", please verify that no remote 
> repository uses the id '" + repository.getId()
>                                     + "'" );
>                             }
>                         }
>                         /*
>                          * fix for LATEST - repository who does not support 
> snapshots should not return shapshot versions
>                          */
>                         if (versioning != null && repository instanceof 
> RemoteRepository) {
>                             RemoteRepository remoteRepository = 
> (RemoteRepository)repository;
>                             if 
> (!remoteRepository.getPolicy(true).isEnabled()) {
>                                 Versioning repaired = new Versioning();
>                                 
> repaired.setLastUpdated(versioning.getLastUpdated());
>                                 repaired.setRelease(versioning.getRelease());
>                                 
> repaired.setVersions(versioning.getVersions());
>                                 versioning = repaired;
>                             }
>                         }
>                     }
>                 }
>                 finally
>                 {
>                     syncContext.release();
>                 }
>             }
>         }
>         catch ( Exception e )
>         {
>             invalidMetadata( session, trace, metadata, repository, e );
>             result.addException( e );
>         }
>         finally
>         {
>             IOUtil.close( fis );
>         }
>         return ( versioning != null ) ? versioning : new Versioning();
>     }
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://jira.codehaus.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to