diff --git a/src/main/java/org/codehaus/mojo/license/AddThirdPartyMojo.java b/src/main/java/org/codehaus/mojo/license/AddThirdPartyMojo.java index 1e5bec0d5..091bc3068 100644 --- a/src/main/java/org/codehaus/mojo/license/AddThirdPartyMojo.java +++ b/src/main/java/org/codehaus/mojo/license/AddThirdPartyMojo.java @@ -67,7 +67,7 @@ */ // CHECKSTYLE_ON: LineLength @Mojo( name = "add-third-party", requiresDependencyResolution = ResolutionScope.TEST, - defaultPhase = LifecyclePhase.GENERATE_RESOURCES ) + defaultPhase = LifecyclePhase.GENERATE_RESOURCES, threadSafe = true ) public class AddThirdPartyMojo extends AbstractAddThirdPartyMojo implements MavenProjectDependenciesConfigurator { private static final Logger LOG = LoggerFactory.getLogger( AddThirdPartyMojo.class ); diff --git a/src/main/java/org/codehaus/mojo/license/api/DefaultThirdPartyHelper.java b/src/main/java/org/codehaus/mojo/license/api/DefaultThirdPartyHelper.java index a0c5ec70b..6c8ecbf77 100644 --- a/src/main/java/org/codehaus/mojo/license/api/DefaultThirdPartyHelper.java +++ b/src/main/java/org/codehaus/mojo/license/api/DefaultThirdPartyHelper.java @@ -36,6 +36,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -101,7 +102,10 @@ public class DefaultThirdPartyHelper /** * Cache of dependencies (as maven project) loaded. */ - private static SortedMap artifactCache; + private static volatile SortedMap artifactCache; + + // Mutex to guard lazy initialization of artifactCache + private static final Object ARTIFACT_CACHE_MUTEX = new Object(); /** * Constructor of the helper. @@ -138,7 +142,13 @@ public SortedMap getArtifactCache() { if ( artifactCache == null ) { - artifactCache = new TreeMap<>(); + synchronized ( ARTIFACT_CACHE_MUTEX ) + { + if ( artifactCache == null ) + { + artifactCache = Collections.synchronizedSortedMap( new TreeMap() ); + } + } } return artifactCache; } @@ -185,9 +195,12 @@ public LicenseMap createLicenseMap( SortedMap dependencies LicenseMap licenseMap = new LicenseMap(); - for ( MavenProject project : dependencies.values() ) + synchronized ( dependencies ) { - thirdPartyTool.addLicense( licenseMap, project, project.getLicenses() ); + for ( MavenProject project : dependencies.values() ) + { + thirdPartyTool.addLicense( licenseMap, project, project.getLicenses() ); + } } return licenseMap; } @@ -234,7 +247,11 @@ public SortedProperties createUnsafeMapping( LicenseMap licenseMap, File missing // try to load missing third party files from dependencies - Collection projects = new ArrayList<>( projectDependencies.values() ); + Collection projects; + synchronized ( projectDependencies ) + { + projects = new ArrayList<>( projectDependencies.values() ); + } projects.remove( project ); projects.removeAll( unsafeDependencies ); diff --git a/src/main/java/org/codehaus/mojo/license/api/DefaultThirdPartyTool.java b/src/main/java/org/codehaus/mojo/license/api/DefaultThirdPartyTool.java index f3af9624e..24a7e47ca 100644 --- a/src/main/java/org/codehaus/mojo/license/api/DefaultThirdPartyTool.java +++ b/src/main/java/org/codehaus/mojo/license/api/DefaultThirdPartyTool.java @@ -458,13 +458,16 @@ public SortedProperties loadUnsafeMapping( LicenseMap licenseMap, { Map snapshots = new HashMap<>(); - //find snapshot dependencies - for ( Map.Entry entry : artifactCache.entrySet() ) + synchronized ( artifactCache ) { - MavenProject mavenProject = entry.getValue(); - if ( mavenProject.getVersion().endsWith( Artifact.SNAPSHOT_VERSION ) ) + //find snapshot dependencies + for ( Map.Entry entry : artifactCache.entrySet() ) { - snapshots.put( entry.getKey(), mavenProject ); + MavenProject mavenProject = entry.getValue(); + if ( mavenProject.getVersion().endsWith( Artifact.SNAPSHOT_VERSION ) ) + { + snapshots.put( entry.getKey(), mavenProject ); + } } } diff --git a/src/main/java/org/codehaus/mojo/license/api/DependenciesTool.java b/src/main/java/org/codehaus/mojo/license/api/DependenciesTool.java index d8a4715df..be93a3a4f 100644 --- a/src/main/java/org/codehaus/mojo/license/api/DependenciesTool.java +++ b/src/main/java/org/codehaus/mojo/license/api/DependenciesTool.java @@ -117,7 +117,10 @@ public SortedMap loadProjectDependencies( ResolvedProjectD SortedMap localCache = new TreeMap<>(); if ( cache != null ) { - localCache.putAll( cache ); + synchronized ( cache ) + { + localCache.putAll( cache ); + } } ProjectBuildingRequest projectBuildingRequest = new DefaultProjectBuildingRequest( mavenSession.getProjectBuildingRequest() )