001 package org.apache.maven.artifact.deployer; 002 003 /* 004 * Licensed to the Apache Software Foundation (ASF) under one 005 * or more contributor license agreements. See the NOTICE file 006 * distributed with this work for additional information 007 * regarding copyright ownership. The ASF licenses this file 008 * to you under the Apache License, Version 2.0 (the 009 * "License"); you may not use this file except in compliance 010 * with the License. You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, 015 * software distributed under the License is distributed on an 016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 017 * KIND, either express or implied. See the License for the 018 * specific language governing permissions and limitations 019 * under the License. 020 */ 021 022 import java.io.File; 023 import java.util.Map; 024 import java.util.concurrent.ConcurrentHashMap; 025 026 import org.apache.maven.RepositoryUtils; 027 import org.apache.maven.artifact.Artifact; 028 import org.apache.maven.artifact.metadata.ArtifactMetadata; 029 import org.apache.maven.artifact.repository.ArtifactRepository; 030 import org.apache.maven.artifact.repository.DefaultArtifactRepository; 031 import org.apache.maven.artifact.repository.LegacyLocalRepositoryManager; 032 import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata; 033 import org.apache.maven.artifact.repository.metadata.MetadataBridge; 034 import org.apache.maven.artifact.repository.metadata.SnapshotArtifactRepositoryMetadata; 035 import org.apache.maven.plugin.LegacySupport; 036 import org.apache.maven.project.artifact.ProjectArtifactMetadata; 037 import org.codehaus.plexus.component.annotations.Component; 038 import org.codehaus.plexus.component.annotations.Requirement; 039 import org.codehaus.plexus.logging.AbstractLogEnabled; 040 import org.eclipse.aether.RepositorySystem; 041 import org.eclipse.aether.RepositorySystemSession; 042 import org.eclipse.aether.RequestTrace; 043 import org.eclipse.aether.deployment.DeployRequest; 044 import org.eclipse.aether.deployment.DeployResult; 045 import org.eclipse.aether.deployment.DeploymentException; 046 import org.eclipse.aether.metadata.MergeableMetadata; 047 import org.eclipse.aether.repository.RemoteRepository; 048 import org.eclipse.aether.util.artifact.SubArtifact; 049 050 @Component( role = ArtifactDeployer.class, instantiationStrategy = "per-lookup" ) 051 public class DefaultArtifactDeployer 052 extends AbstractLogEnabled 053 implements ArtifactDeployer 054 { 055 056 @Requirement 057 private RepositorySystem repoSystem; 058 059 @Requirement 060 private LegacySupport legacySupport; 061 062 private Map<Object, MergeableMetadata> relatedMetadata = new ConcurrentHashMap<Object, MergeableMetadata>(); 063 064 /** 065 * @deprecated we want to use the artifact method only, and ensure artifact.file is set 066 * correctly. 067 */ 068 @Deprecated 069 public void deploy( String basedir, String finalName, Artifact artifact, ArtifactRepository deploymentRepository, 070 ArtifactRepository localRepository ) 071 throws ArtifactDeploymentException 072 { 073 String extension = artifact.getArtifactHandler().getExtension(); 074 File source = new File( basedir, finalName + "." + extension ); 075 deploy( source, artifact, deploymentRepository, localRepository ); 076 } 077 078 public void deploy( File source, Artifact artifact, ArtifactRepository deploymentRepository, 079 ArtifactRepository localRepository ) 080 throws ArtifactDeploymentException 081 { 082 RepositorySystemSession session = 083 LegacyLocalRepositoryManager.overlay( localRepository, legacySupport.getRepositorySession(), repoSystem ); 084 085 DeployRequest request = new DeployRequest(); 086 087 request.setTrace( RequestTrace.newChild( null, legacySupport.getSession().getCurrentProject() ) ); 088 089 org.eclipse.aether.artifact.Artifact mainArtifact = RepositoryUtils.toArtifact( artifact ); 090 mainArtifact = mainArtifact.setFile( source ); 091 request.addArtifact( mainArtifact ); 092 093 String versionKey = artifact.getGroupId() + ':' + artifact.getArtifactId(); 094 String snapshotKey = null; 095 if ( artifact.isSnapshot() ) 096 { 097 snapshotKey = versionKey + ':' + artifact.getBaseVersion(); 098 request.addMetadata( relatedMetadata.get( snapshotKey ) ); 099 } 100 request.addMetadata( relatedMetadata.get( versionKey ) ); 101 102 for ( ArtifactMetadata metadata : artifact.getMetadataList() ) 103 { 104 if ( metadata instanceof ProjectArtifactMetadata ) 105 { 106 org.eclipse.aether.artifact.Artifact pomArtifact = new SubArtifact( mainArtifact, "", "pom" ); 107 pomArtifact = pomArtifact.setFile( ( (ProjectArtifactMetadata) metadata ).getFile() ); 108 request.addArtifact( pomArtifact ); 109 } 110 else if ( metadata instanceof SnapshotArtifactRepositoryMetadata 111 || metadata instanceof ArtifactRepositoryMetadata ) 112 { 113 // eaten, handled by repo system 114 } 115 else 116 { 117 request.addMetadata( new MetadataBridge( metadata ) ); 118 } 119 } 120 121 RemoteRepository remoteRepo = RepositoryUtils.toRepo( deploymentRepository ); 122 /* 123 * NOTE: This provides backward-compat with maven-deploy-plugin:2.4 which bypasses the repository factory when 124 * using an alternative deployment location. 125 */ 126 if ( deploymentRepository instanceof DefaultArtifactRepository 127 && deploymentRepository.getAuthentication() == null ) 128 { 129 RemoteRepository.Builder builder = new RemoteRepository.Builder( remoteRepo ); 130 builder.setAuthentication( session.getAuthenticationSelector().getAuthentication( remoteRepo ) ); 131 builder.setProxy( session.getProxySelector().getProxy( remoteRepo ) ); 132 remoteRepo = builder.build(); 133 } 134 request.setRepository( remoteRepo ); 135 136 DeployResult result; 137 try 138 { 139 result = repoSystem.deploy( session, request ); 140 } 141 catch ( DeploymentException e ) 142 { 143 throw new ArtifactDeploymentException( e.getMessage(), e ); 144 } 145 146 for ( Object metadata : result.getMetadata() ) 147 { 148 if ( metadata.getClass().getName().endsWith( ".internal.VersionsMetadata" ) ) 149 { 150 relatedMetadata.put( versionKey, (MergeableMetadata) metadata ); 151 } 152 if ( snapshotKey != null && metadata.getClass().getName().endsWith( ".internal.RemoteSnapshotMetadata" ) ) 153 { 154 relatedMetadata.put( snapshotKey, (MergeableMetadata) metadata ); 155 } 156 } 157 158 artifact.setResolvedVersion( result.getArtifacts().iterator().next().getVersion() ); 159 } 160 161 }