From 3b92601563916707a2f57a254e5927bdf38a907b Mon Sep 17 00:00:00 2001 From: Carter Kozak Date: Tue, 23 Nov 2021 11:48:27 -0500 Subject: [PATCH] BaselineJavaVersions handles the lazy 'nebula.maven-publish' plugin (#1986) BaselineJavaVersions handles the lazy 'nebula.maven-publish' plugin --- changelog/@unreleased/pr-1986.v2.yml | 5 ++ .../plugins/BaselineJavaVersions.java | 47 +++++++++++-------- .../BaselineJavaVersionIntegrationTest.groovy | 40 ++++++++++++++++ 3 files changed, 72 insertions(+), 20 deletions(-) create mode 100644 changelog/@unreleased/pr-1986.v2.yml diff --git a/changelog/@unreleased/pr-1986.v2.yml b/changelog/@unreleased/pr-1986.v2.yml new file mode 100644 index 000000000..1ee5f165c --- /dev/null +++ b/changelog/@unreleased/pr-1986.v2.yml @@ -0,0 +1,5 @@ +type: fix +fix: + description: BaselineJavaVersions handles the lazy 'nebula.maven-publish' plugin + links: + - https://github.com/palantir/gradle-baseline/pull/1986 diff --git a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineJavaVersions.java b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineJavaVersions.java index ba335d8b2..18c06e946 100644 --- a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineJavaVersions.java +++ b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineJavaVersions.java @@ -29,9 +29,12 @@ import org.gradle.api.publish.ivy.IvyPublication; import org.gradle.api.publish.maven.MavenPublication; import org.gradle.util.GradleVersion; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public final class BaselineJavaVersions implements Plugin { + private static final Logger log = LoggerFactory.getLogger(BaselineJavaVersions.class); public static final String EXTENSION_NAME = "javaVersions"; public static final GradleVersion MIN_GRADLE_VERSION = GradleVersion.version("7.0"); @@ -62,13 +65,20 @@ public void apply(Project project) { } private static boolean isLibrary(Project project) { + if (project.getPluginManager().hasPlugin("nebula.maven-publish")) { + // 'nebula.maven-publish' creates publications lazily which causes inconsistencies based + // on ordering. + log.debug( + "Project '{}' is considered a library because the 'nebula.maven-publish' plugin is applied", + project.getDisplayName()); + return true; + } PublishingExtension publishing = project.getExtensions().findByType(PublishingExtension.class); if (publishing == null) { - project.getLogger() - .debug( - "Project '{}' is considered a distribution, not a library, because " - + "it doesn't define any publishing extensions", - project.getDisplayName()); + log.debug( + "Project '{}' is considered a distribution, not a library, because " + + "it doesn't define any publishing extensions", + project.getDisplayName()); return false; } ImmutableList jarPublications = publishing.getPublications().stream() @@ -76,17 +86,15 @@ private static boolean isLibrary(Project project) { .map(Named::getName) .collect(ImmutableList.toImmutableList()); if (jarPublications.isEmpty()) { - project.getLogger() - .debug( - "Project '{}' is considered a distribution because it does not publish jars", - project.getDisplayName()); + log.debug( + "Project '{}' is considered a distribution because it does not publish jars", + project.getDisplayName()); return false; } - project.getLogger() - .debug( - "Project '{}' is considered a library because it publishes jars: {}", - project.getDisplayName(), - jarPublications); + log.debug( + "Project '{}' is considered a library because it publishes jars: {}", + project.getDisplayName(), + jarPublications); return true; } @@ -100,12 +108,11 @@ private static boolean isLibraryPublication(Project project, Publication publica return ivyPublication.getArtifacts().stream().anyMatch(artifact -> "jar".equals(artifact.getExtension())); } // Default to true for unknown publication types to avoid setting higher jvm targets than necessary - project.getLogger() - .warn( - "Unknown publication '{}' of type '{}'. Assuming project {} is a library", - publication, - publication.getClass().getName(), - project.getName()); + log.warn( + "Unknown publication '{}' of type '{}'. Assuming project {} is a library", + publication, + publication.getClass().getName(), + project.getName()); return true; } } diff --git a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineJavaVersionIntegrationTest.groovy b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineJavaVersionIntegrationTest.groovy index 0a58e6b7e..524ce0ae8 100644 --- a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineJavaVersionIntegrationTest.groovy +++ b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineJavaVersionIntegrationTest.groovy @@ -24,8 +24,15 @@ import spock.lang.Unroll class BaselineJavaVersionIntegrationTest extends IntegrationSpec { private static final int JAVA_8_BYTECODE = 52 private static final int JAVA_11_BYTECODE = 55 + private static final int JAVA_17_BYTECODE = 61 def standardBuildFile = ''' + buildscript { + repositories { mavenCentral() } + dependencies { + classpath 'com.netflix.nebula:nebula-publishing-plugin:17.0.0' + } + } plugins { id 'java-library' id 'application' @@ -80,6 +87,39 @@ class BaselineJavaVersionIntegrationTest extends IntegrationSpec { runTasksWithFailure('compileJava') } + def 'distribution target is used when no artifacts are published'() { + when: + buildFile << ''' + javaVersions { + libraryTarget = 11 + distributionTarget = 17 + } + '''.stripIndent(true) + file('src/main/java/Main.java') << java11CompatibleCode + File compiledClass = new File(projectDir, "build/classes/java/main/Main.class") + + then: + runTasksSuccessfully('compileJava') + getBytecodeVersion(compiledClass) == JAVA_17_BYTECODE + } + + def 'library target is used when nebula maven publishing plugin is applied'() { + when: + buildFile << ''' + apply plugin: 'nebula.maven-publish' + javaVersions { + libraryTarget = 11 + distributionTarget = 17 + } + '''.stripIndent(true) + file('src/main/java/Main.java') << java11CompatibleCode + File compiledClass = new File(projectDir, "build/classes/java/main/Main.class") + + then: + runTasksSuccessfully('compileJava') + getBytecodeVersion(compiledClass) == JAVA_11_BYTECODE + } + def 'java 11 compilation succeeds targeting java 11'() { when: buildFile << '''