Enable running DependencyCheck on Maven 3.0

This commit is contained in:
Hans Aikema
2017-02-21 17:31:46 +01:00
parent ae21424a30
commit 72d7af5291
3 changed files with 49 additions and 43 deletions

View File

@@ -40,7 +40,7 @@ Copyright (c) 2013 Jeremy Long. All Rights Reserved.
<version.maven-plugin-plugin>3.5</version.maven-plugin-plugin> <version.maven-plugin-plugin>3.5</version.maven-plugin-plugin>
</properties> </properties>
<prerequisites> <prerequisites>
<maven>3.1</maven> <maven>3.0</maven>
</prerequisites> </prerequisites>
<build> <build>
<resources> <resources>
@@ -115,7 +115,7 @@ Copyright (c) 2013 Jeremy Long. All Rights Reserved.
<configuration> <configuration>
<rules> <rules>
<requireMavenVersion> <requireMavenVersion>
<version>[3.1,]</version> <version>[3.0,]</version>
</requireMavenVersion> </requireMavenVersion>
</rules> </rules>
<fail>true</fail> <fail>true</fail>
@@ -224,6 +224,11 @@ Copyright (c) 2013 Jeremy Long. All Rights Reserved.
<artifactId>maven-plugin-testing-harness</artifactId> <artifactId>maven-plugin-testing-harness</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.apache.maven.shared</groupId>
<artifactId>maven-artifact-transfer</artifactId>
<version>0.9.0</version>
</dependency>
</dependencies> </dependencies>
<profiles> <profiles>
<profile> <profile>

View File

@@ -26,28 +26,29 @@ import java.io.InputStream;
import java.io.ObjectOutputStream; import java.io.ObjectOutputStream;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import org.eclipse.aether.artifact.Artifact; import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.doxia.sink.Sink; import org.apache.maven.doxia.sink.Sink;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Component; import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.DefaultProjectBuildingRequest;
import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuildingRequest;
import org.apache.maven.reporting.MavenReport; import org.apache.maven.reporting.MavenReport;
import org.apache.maven.reporting.MavenReportException; import org.apache.maven.reporting.MavenReportException;
import org.apache.maven.settings.Proxy; import org.apache.maven.settings.Proxy;
import org.apache.maven.settings.Server; import org.apache.maven.settings.Server;
import org.apache.maven.shared.artifact.ArtifactCoordinate;
import org.apache.maven.shared.artifact.TransferUtils;
import org.apache.maven.shared.artifact.resolve.ArtifactResolver;
import org.apache.maven.shared.artifact.resolve.ArtifactResolverException;
import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder; import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException; import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException;
import org.apache.maven.shared.dependency.graph.DependencyNode; import org.apache.maven.shared.dependency.graph.DependencyNode;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.resolution.ArtifactRequest;
import org.eclipse.aether.resolution.ArtifactResolutionException;
import org.eclipse.aether.resolution.ArtifactResult;
import org.owasp.dependencycheck.Engine; import org.owasp.dependencycheck.Engine;
import org.owasp.dependencycheck.data.nexus.MavenArtifact; import org.owasp.dependencycheck.data.nexus.MavenArtifact;
import org.owasp.dependencycheck.data.nvdcve.CveDB; import org.owasp.dependencycheck.data.nvdcve.CveDB;
@@ -108,23 +109,19 @@ public abstract class BaseDependencyCheckMojo extends AbstractMojo implements Ma
@Parameter(readonly = true, required = true, property = "reactorProjects") @Parameter(readonly = true, required = true, property = "reactorProjects")
private List<MavenProject> reactorProjects; private List<MavenProject> reactorProjects;
/** /**
* The entry point to Aether, i.e. the component doing all the work. * The entry point towards a Maven version independent way of resolving artifacts (handles both Maven 3.0 sonatype and Maven 3.1+ eclipse Aether implementations).
*/ */
@Component @Component
private RepositorySystem repoSystem; private ArtifactResolver artifactResolver;
@Parameter( defaultValue = "${session}", readonly = true, required = true )
protected MavenSession session;
/** /**
* The current repository/network configuration of Maven. * Remote repositories which will be searched for artifacts.
*/ */
@Parameter(defaultValue = "${repositorySystemSession}", readonly = true) @Parameter( defaultValue = "${project.remoteArtifactRepositories}", readonly = true, required = true )
private RepositorySystemSession repoSession; private List<ArtifactRepository> remoteRepositories;
/**
* The project's remote repositories to use for the resolution of plug-ins
* and their dependencies.
*/
@Parameter(defaultValue = "${project.remotePluginRepositories}", readonly = true)
private List<RemoteRepository> remoteRepos;
/** /**
* Component within Maven to build the dependency graph. * Component within Maven to build the dependency graph.
@@ -629,7 +626,8 @@ public abstract class BaseDependencyCheckMojo extends AbstractMojo implements Ma
protected ExceptionCollection scanArtifacts(MavenProject project, Engine engine) { protected ExceptionCollection scanArtifacts(MavenProject project, Engine engine) {
try { try {
final DependencyNode dn = dependencyGraphBuilder.buildDependencyGraph(project, null, reactorProjects); final DependencyNode dn = dependencyGraphBuilder.buildDependencyGraph(project, null, reactorProjects);
return collectDependencies(engine, project, dn.getChildren()); final ProjectBuildingRequest buildingRequest = newResolveArtifactProjectBuildingRequest();
return collectDependencies(engine, project, dn.getChildren(), buildingRequest);
} catch (DependencyGraphBuilderException ex) { } catch (DependencyGraphBuilderException ex) {
final String msg = String.format("Unable to build dependency graph on project %s", project.getName()); final String msg = String.format("Unable to build dependency graph on project %s", project.getName());
getLog().debug(msg, ex); getLog().debug(msg, ex);
@@ -648,29 +646,24 @@ public abstract class BaseDependencyCheckMojo extends AbstractMojo implements Ma
* @return a collection of exceptions that may have occurred while resolving * @return a collection of exceptions that may have occurred while resolving
* and scanning the dependencies * and scanning the dependencies
*/ */
private ExceptionCollection collectDependencies(Engine engine, MavenProject project, List<DependencyNode> nodes) { private ExceptionCollection collectDependencies(Engine engine, MavenProject project, List<DependencyNode> nodes, ProjectBuildingRequest buildingRequest) {
ExceptionCollection exCol = null; ExceptionCollection exCol = null;
for (DependencyNode dependencyNode : nodes) { for (DependencyNode dependencyNode : nodes) {
exCol = collectDependencies(engine, project, dependencyNode.getChildren()); exCol = collectDependencies(engine, project, dependencyNode.getChildren(), buildingRequest);
if (excludeFromScan(dependencyNode.getArtifact().getScope())) { if (excludeFromScan(dependencyNode.getArtifact().getScope())) {
continue; continue;
} }
try { try {
//an alternative request method is documented here final ArtifactCoordinate coordinate = TransferUtils.toArtifactCoordinate(dependencyNode.getArtifact());
// https://www.mirkosertic.de/wordpress/2015/12/how-to-download-maven-artifacts-with-maven-3-1-and-eclipse-aether/ final Artifact result = artifactResolver.resolveArtifact( buildingRequest, coordinate ).getArtifact();
final ArtifactRequest request = new ArtifactRequest(); if (result.isResolved() && result.getFile()!= null) {
request.setArtifact(new DefaultArtifact(dependencyNode.getArtifact().getId())); final List<Dependency> deps = engine.scan(result.getFile().getAbsoluteFile(),
request.setRepositories(remoteRepos);
final ArtifactResult result = repoSystem.resolveArtifact(repoSession, request);
if (result.isResolved() && result.getArtifact() != null && result.getArtifact().getFile() != null) {
final List<Dependency> deps = engine.scan(result.getArtifact().getFile().getAbsoluteFile(),
project.getName() + ":" + dependencyNode.getArtifact().getScope()); project.getName() + ":" + dependencyNode.getArtifact().getScope());
if (deps != null) { if (deps != null) {
if (deps.size() == 1) { if (deps.size() == 1) {
final Dependency d = deps.get(0); final Dependency d = deps.get(0);
if (d != null) { if (d != null) {
final Artifact a = result.getArtifact(); final MavenArtifact ma = new MavenArtifact(result.getGroupId(), result.getArtifactId(), result.getVersion());
final MavenArtifact ma = new MavenArtifact(a.getGroupId(), a.getArtifactId(), a.getVersion());
d.addAsEvidence("pom", ma, Confidence.HIGHEST); d.addAsEvidence("pom", ma, Confidence.HIGHEST);
if (getLog().isDebugEnabled()) { if (getLog().isDebugEnabled()) {
getLog().debug(String.format("Adding project reference %s on dependency %s", getLog().debug(String.format("Adding project reference %s on dependency %s",
@@ -689,9 +682,6 @@ public abstract class BaseDependencyCheckMojo extends AbstractMojo implements Ma
exCol = new ExceptionCollection(); exCol = new ExceptionCollection();
} }
getLog().error(msg); getLog().error(msg);
for (Exception ex : result.getExceptions()) {
exCol.addException(ex);
}
} }
} else { } else {
final String msg = String.format("Unable to resolve '%s' in project %s", final String msg = String.format("Unable to resolve '%s' in project %s",
@@ -700,11 +690,8 @@ public abstract class BaseDependencyCheckMojo extends AbstractMojo implements Ma
if (exCol == null) { if (exCol == null) {
exCol = new ExceptionCollection(); exCol = new ExceptionCollection();
} }
for (Exception ex : result.getExceptions()) {
exCol.addException(ex);
} }
} } catch (ArtifactResolverException ex) {
} catch (ArtifactResolutionException ex) {
if (exCol == null) { if (exCol == null) {
exCol = new ExceptionCollection(); exCol = new ExceptionCollection();
} }
@@ -714,6 +701,20 @@ public abstract class BaseDependencyCheckMojo extends AbstractMojo implements Ma
return exCol; return exCol;
} }
/**
* @return Returns a new ProjectBuildingRequest populated from the current session and the current project remote
* repositories, used to resolve artifacts.
*/
public ProjectBuildingRequest newResolveArtifactProjectBuildingRequest()
{
ProjectBuildingRequest buildingRequest =
new DefaultProjectBuildingRequest( session.getProjectBuildingRequest() );
buildingRequest.setRemoteRepositories( remoteRepositories );
return buildingRequest;
}
/** /**
* Executes the dependency-check scan and generates the necassary report. * Executes the dependency-check scan and generates the necassary report.
* *

View File

@@ -130,7 +130,7 @@ Copyright (c) 2012 - Jeremy Long
<slf4j.version>1.7.23</slf4j.version> <slf4j.version>1.7.23</slf4j.version>
<logback.version>1.1.9</logback.version> <logback.version>1.1.9</logback.version>
<!-- Note that Maven will use classes from the distro, ignoring declared dependencies for Maven core... --> <!-- Note that Maven will use classes from the distro, ignoring declared dependencies for Maven core... -->
<maven.api.version>3.3.9</maven.api.version> <maven.api.version>3.0</maven.api.version>
<reporting.checkstyle-plugin.version>2.17</reporting.checkstyle-plugin.version> <reporting.checkstyle-plugin.version>2.17</reporting.checkstyle-plugin.version>
<reporting.cobertura-plugin.version>2.7</reporting.cobertura-plugin.version> <reporting.cobertura-plugin.version>2.7</reporting.cobertura-plugin.version>
<reporting.pmd-plugin.version>3.6</reporting.pmd-plugin.version> <reporting.pmd-plugin.version>3.6</reporting.pmd-plugin.version>