Skip to content

Commit

Permalink
Added a new mojo that resolves plugins transitively.
Browse files Browse the repository at this point in the history
  • Loading branch information
kohsuke committed Nov 1, 2013
1 parent ec82697 commit 22985e3
Show file tree
Hide file tree
Showing 4 changed files with 139 additions and 9 deletions.
6 changes: 6 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,12 @@
<artifactId>sezpoz</artifactId>
<version>1.9</version>
</dependency>
<!-- for copy-dependency-plugins -->
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
</dependency>
<!-- for the create goal -->
<dependency>
<groupId>org.apache.maven.plugins</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -258,15 +258,6 @@ public abstract class AbstractHpiMojo extends AbstractJenkinsMojo {
*/
ScopeArtifactFilter scopeFilter = new ScopeArtifactFilter("runtime");

/**
* @component
*/
protected MavenProjectBuilder projectBuilder;

/**
* @parameter expression="${localRepository}"
*/
protected ArtifactRepository localRepository;

private static final String[] EMPTY_STRING_ARRAY = {};

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package org.jenkinsci.maven.plugins.hpi;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.model.Dependency;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectBuilder;

import java.util.List;

Expand Down Expand Up @@ -32,6 +37,37 @@ public abstract class AbstractJenkinsMojo extends AbstractMojo {
*/
protected String jenkinsCoreId;


/**
* List of Remote Repositories used by the resolver
*
* @parameter expression="${project.remoteArtifactRepositories}"
* @required
*/
protected List<ArtifactRepository> remoteRepos;

/**
* @parameter expression="${localRepository}"
* @required
*/
protected ArtifactRepository localRepository;

/**
* @component
*/
protected ArtifactMetadataSource artifactMetadataSource;

/**
* @component
*/
protected ArtifactFactory artifactFactory;

/**
* @component
*/
protected MavenProjectBuilder projectBuilder;


protected String findJenkinsVersion() throws MojoExecutionException {
for(Dependency a : (List<Dependency>)project.getDependencies()) {
boolean match;
Expand All @@ -46,4 +82,8 @@ protected String findJenkinsVersion() throws MojoExecutionException {
}
throw new MojoExecutionException("Failed to determine Jenkins version this plugin depends on.");
}

protected MavenArtifact wrap(Artifact a) {
return new MavenArtifact(a,projectBuilder,remoteRepos,localRepository);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package org.jenkinsci.maven.plugins.hpi;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.resolver.ArtifactCollector;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
import org.apache.maven.artifact.resolver.ArtifactResolver;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.dependency.fromConfiguration.ArtifactItem;
import org.codehaus.plexus.util.FileUtils;

import java.io.File;
import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import static org.apache.maven.artifact.Artifact.*;

/**
* Resolve plugin dependencies transitively and copy them all into a specific directory.
*
* @author Kohsuke Kawaguchi
* @goal copy-plugins-with-dependencies
*/
public class CopyPluginsWithDependenciesMojo extends AbstractJenkinsMojo {
/**
* Collection of plugins to copy from
*
* @parameter
*/
private List<ArtifactItem> artifactItems;

/**
* Where to copy plugins into.
*
* @parameter
*/
private File outputDirectory;

/**
* @component
*/
protected ArtifactResolver resolver;

/**
* @component
*/
protected ArtifactCollector artifactCollector;


public void execute() throws MojoExecutionException, MojoFailureException {
try {
Set<Artifact> all = new HashSet<Artifact>();

for (ArtifactItem ai : artifactItems) {
all.add(toArtifact(ai));
}

ArtifactResolutionResult r = resolver.resolveTransitively(all, project.getArtifact(), remoteRepos, localRepository, artifactMetadataSource);
for (Artifact o : (Set<Artifact>)r.getArtifacts()) {
if (wrap(o).isPlugin()) {
getLog().debug("Copying "+o.getFile());

Artifact hpi = artifactFactory.createArtifact(o.getGroupId(),o.getArtifactId(),o.getVersion(),SCOPE_COMPILE,"hpi");
resolver.resolve(hpi,remoteRepos,localRepository);

FileUtils.copyFile(hpi.getFile(), new File(outputDirectory,hpi.getArtifactId()+".hpi"));
}
}

} catch (InvalidVersionSpecificationException e) {
throw new MojoExecutionException("Failed to resolve plugin dependencies",e);
} catch (ArtifactResolutionException e) {
throw new MojoExecutionException("Failed to resolve plugin dependencies",e);
} catch (ArtifactNotFoundException e) {
throw new MojoExecutionException("Failed to resolve plugin dependencies",e);
} catch (IOException e) {
throw new MojoExecutionException("Failed to resolve plugin dependencies",e);
}
}

private Artifact toArtifact(ArtifactItem ai) throws InvalidVersionSpecificationException {
VersionRange vr = VersionRange.createFromVersionSpec(ai.getVersion());

return artifactFactory.createDependencyArtifact(ai.getGroupId(), ai.getArtifactId(), vr,
"hpi", ai.getClassifier(), SCOPE_COMPILE);
}
}

0 comments on commit 22985e3

Please sign in to comment.