diff --git a/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/ClassPathResult.java b/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/ClassPathResult.java index 77fdd68e26..7445167d9d 100644 --- a/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/ClassPathResult.java +++ b/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/ClassPathResult.java @@ -16,7 +16,6 @@ package com.google.cloud.tools.opensource.classpath; -import static com.google.common.base.Preconditions.checkArgument; import com.google.cloud.tools.opensource.dependencies.Artifacts; import com.google.cloud.tools.opensource.dependencies.DependencyPath; @@ -24,10 +23,12 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import java.io.IOException; +import java.util.logging.Logger; import org.eclipse.aether.artifact.Artifact; /** Result of class path resolution with {@link UnresolvableArtifactProblem}s if any. */ public final class ClassPathResult { + private static final Logger logger = Logger.getLogger(ClassPathResult.class.getName()); private final ImmutableList classPath; @@ -65,7 +66,11 @@ public String formatDependencyPaths(Iterable entries) { StringBuilder message = new StringBuilder(); for (ClassPathEntry entry : entries) { ImmutableList dependencyPaths = getDependencyPaths(entry); - checkArgument(dependencyPaths.size() >= 1, "%s is not in the class path", entry); + + if (dependencyPaths.isEmpty()) { + logger.warning(entry + " is not in the class path"); + continue; + } message.append(entry + " is at:\n"); diff --git a/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/ClassPathResultTest.java b/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/ClassPathResultTest.java index acd740b1fd..2c021624e6 100644 --- a/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/ClassPathResultTest.java +++ b/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/ClassPathResultTest.java @@ -17,7 +17,6 @@ package com.google.cloud.tools.opensource.classpath; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; import com.google.cloud.tools.opensource.dependencies.DependencyPath; import com.google.common.collect.ImmutableList; @@ -115,21 +114,6 @@ public void testFormatDependencyPaths_threePathsForA() { actual); } - @Test - public void testFormatDependencyPaths_irrelevantJar() { - AnnotatedClassPath annotatedClassPath = - AnnotatedClassPath.fromMultimap(ImmutableListMultimap.of(jarA, dependencyPath_A)); - - ClassPathResult classPathResult = new ClassPathResult(annotatedClassPath, ImmutableSet.of()); - - try { - classPathResult.formatDependencyPaths(ImmutableList.of(jarB)); - fail("The irrelevant JAR file should be invalidated."); - } catch (IllegalArgumentException expected) { - assertEquals("com.google:b:1 is not in the class path", expected.getMessage()); - } - } - @Test public void testGetClassPathEntries() { AnnotatedClassPath annotatedClassPath = diff --git a/gradle-plugin/src/functionalTest/groovy/com/google/cloud/tools/dependencies/gradle/BuildStatusFunctionalTest.groovy b/gradle-plugin/src/functionalTest/groovy/com/google/cloud/tools/dependencies/gradle/BuildStatusFunctionalTest.groovy index bb401b4ebf..a25ecc7593 100644 --- a/gradle-plugin/src/functionalTest/groovy/com/google/cloud/tools/dependencies/gradle/BuildStatusFunctionalTest.groovy +++ b/gradle-plugin/src/functionalTest/groovy/com/google/cloud/tools/dependencies/gradle/BuildStatusFunctionalTest.groovy @@ -181,6 +181,7 @@ class BuildStatusFunctionalTest extends Specification { | com.google.cloud.ServiceOptionsTest (com.google.cloud:google-cloud-core:jar:tests:1.95.4) | com.google.cloud.BatchResultTest (com.google.cloud:google-cloud-core:jar:tests:1.95.4) | """.stripMargin()) + !result.output.contains("StackOverflowError") result.task(":linkageCheck").outcome == TaskOutcome.FAILED } } diff --git a/gradle-plugin/src/main/java/com/google/cloud/tools/dependencies/gradle/LinkageCheckTask.java b/gradle-plugin/src/main/java/com/google/cloud/tools/dependencies/gradle/LinkageCheckTask.java index 4bc6a0bb73..e83eb39a87 100644 --- a/gradle-plugin/src/main/java/com/google/cloud/tools/dependencies/gradle/LinkageCheckTask.java +++ b/gradle-plugin/src/main/java/com/google/cloud/tools/dependencies/gradle/LinkageCheckTask.java @@ -216,8 +216,18 @@ private void recordDependencyPaths( ResolvedDependencyResult resolvedDependencyResult = (ResolvedDependencyResult) dependencyResult; ResolvedComponentResult child = resolvedDependencyResult.getSelected(); - stack.add(child); - recordDependencyPaths(output, stack, targetCoordinates); + + if (stack.contains(child)) { + // Circular dependency check + getLogger() + .error( + "Circular dependency for: " + + resolvedDependencyResult + + "\n The stack is: " + stack); + } else { + stack.add(child); + recordDependencyPaths(output, stack, targetCoordinates); + } } else if (dependencyResult instanceof UnresolvedDependencyResult) { UnresolvedDependencyResult unresolvedResult = (UnresolvedDependencyResult) dependencyResult; getLogger() @@ -225,7 +235,7 @@ private void recordDependencyPaths( "Could not resolve dependency: " + unresolvedResult.getAttempted().getDisplayName()); } else { - throw new IllegalStateException("Unexpected dependency result type: " + dependencyResult); + getLogger().error("Unexpected dependency result type: " + dependencyResult); } }