diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/jvm/Jvm.java b/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/jvm/Jvm.java index 8a80ca3173d2..9c2276423d0d 100644 --- a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/jvm/Jvm.java +++ b/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/jvm/Jvm.java @@ -371,4 +371,13 @@ public boolean isIbmJvm() { return false; } + @Nullable + public String getVendor() { + for (String vendorProperty : VENDOR_PROPERTIES) { + if (System.getProperties().containsKey(vendorProperty) && !System.getProperty(vendorProperty).isEmpty()) { + return System.getProperty(vendorProperty); + } + } + return null; + } } diff --git a/platforms/core-runtime/build-configuration/src/integTest/groovy/org/gradle/interal/buildconfiguration/tasks/UpdateDaemonJvmIntegrationTest.groovy b/platforms/core-runtime/build-configuration/src/integTest/groovy/org/gradle/interal/buildconfiguration/tasks/UpdateDaemonJvmIntegrationTest.groovy index 936091144738..af23509c7b91 100644 --- a/platforms/core-runtime/build-configuration/src/integTest/groovy/org/gradle/interal/buildconfiguration/tasks/UpdateDaemonJvmIntegrationTest.groovy +++ b/platforms/core-runtime/build-configuration/src/integTest/groovy/org/gradle/interal/buildconfiguration/tasks/UpdateDaemonJvmIntegrationTest.groovy @@ -21,13 +21,14 @@ import org.gradle.api.JavaVersion import org.gradle.buildconfiguration.tasks.UpdateDaemonJvm import org.gradle.integtests.fixtures.AbstractIntegrationSpec import org.gradle.integtests.fixtures.AvailableJavaHomes +import org.gradle.integtests.fixtures.jvm.JavaToolchainFixture import org.gradle.internal.buildconfiguration.DaemonJvmPropertiesDefaults import org.gradle.internal.buildconfiguration.fixture.DaemonJvmPropertiesFixture import org.gradle.internal.jvm.Jvm import org.gradle.test.precondition.Requires import org.gradle.test.preconditions.IntegTestPreconditions -class UpdateDaemonJvmIntegrationTest extends AbstractIntegrationSpec implements DaemonJvmPropertiesFixture { +class UpdateDaemonJvmIntegrationTest extends AbstractIntegrationSpec implements DaemonJvmPropertiesFixture, JavaToolchainFixture { def "root project has an updateDaemonJvm task only"() { buildFile << """ @@ -104,10 +105,9 @@ class UpdateDaemonJvmIntegrationTest extends AbstractIntegrationSpec implements succeeds( "updateDaemonJvm", "--jvm-version=10000") } - @NotYetImplemented def "When execute updateDaemonJvm for valid vendor option Then build properties are populated with expected values"() { when: - run "updateDaemonJvm", "--toolchain-vendor=$vendor" + run "updateDaemonJvm", "--jvm-vendor=$vendor" then: assertJvmCriteria(DaemonJvmPropertiesDefaults.TOOLCHAIN_VERSION, vendor) @@ -128,33 +128,29 @@ class UpdateDaemonJvmIntegrationTest extends AbstractIntegrationSpec implements implementation << ["VENDOR_SPECIFIC", "J9"] } - @NotYetImplemented def "When execute updateDaemonJvm specifying different options Then build properties are populated with expected values"() { when: - run "updateDaemonJvm", "--jvm-version=17", "--toolchain-vendor=IBM", "--toolchain-implementation=J9" + run "updateDaemonJvm", "--jvm-version=17", "--jvm-vendor=IBM" then: - assertJvmCriteria(JavaVersion.VERSION_17, "IBM", "J9") + assertJvmCriteria(JavaVersion.VERSION_17, "IBM") } - @NotYetImplemented def "When execute updateDaemonJvm specifying different options in lower case Then build properties are populated with expected values"() { when: - run "updateDaemonJvm", "--jvm-version=17", "--toolchain-vendor=ibm", "--toolchain-implementation=j9" + run "updateDaemonJvm", "--jvm-version=17", "--jvm-vendor=ibm" then: - assertJvmCriteria(JavaVersion.VERSION_17, "IBM", "J9") + assertJvmCriteria(JavaVersion.VERSION_17, "IBM") } - @NotYetImplemented - def "When execute updateDaemonJvm with unexpected --toolchain-vendor option Then fails with expected exception message"() { + def "When execute updateDaemonJvm with unexpected --jvm-vendor option Then fails with expected exception message"() { when: - fails "updateDaemonJvm", "--toolchain-vendor=unknown-vendor" + fails "updateDaemonJvm", "--jvm-vendor=unknown-vendor" then: - failureDescriptionContains("Problem configuring option 'toolchain-vendor' on task ':updateDaemonJvm' from command line.") - failureHasCause("Cannot convert string value 'unknown-vendor' to an enum value of type 'org.gradle.internal.jvm.inspection.JvmVendor\$KnownJvmVendor' " + - "(valid case insensitive values: ADOPTIUM, ADOPTOPENJDK, AMAZON, APPLE, AZUL, BELLSOFT, GRAAL_VM, HEWLETT_PACKARD, IBM, JETBRAINS, MICROSOFT, ORACLE, SAP, TENCENT, UNKNOWN)") + failureDescriptionContains("Value 'unknown-vendor' given for toolchainVendor is an invalid Java vendor. " + + "Possible values are [ADOPTIUM, ADOPTOPENJDK, AMAZON, APPLE, AZUL, BELLSOFT, GRAAL_VM, HEWLETT_PACKARD, IBM, JETBRAINS, MICROSOFT, ORACLE, SAP, TENCENT, UNKNOWN]") } @NotYetImplemented @@ -180,19 +176,19 @@ class UpdateDaemonJvmIntegrationTest extends AbstractIntegrationSpec implements assertJvmCriteria(otherJvm.javaVersion) } - @NotYetImplemented def "Given defined invalid criteria When execute updateDaemonJvm with different criteria Then criteria get modified using java home"() { def currentJvm = JavaVersion.current() given: writeJvmCriteria(currentJvm, "invalidVendor") + captureJavaHome() expect: - succeeds("updateDaemonJvm", "--jvm-version=20", "--toolchain-vendor=AZUL") + succeeds("updateDaemonJvm", "--jvm-version=20", "--jvm-vendor=AZUL") assertJvmCriteria(JavaVersion.VERSION_20, "AZUL") + assertDaemonUsedJvm(Jvm.current()) } - @NotYetImplemented @Requires(IntegTestPreconditions.JavaHomeWithDifferentVersionAvailable) def "Given defined valid criteria matching with local toolchain When execute updateDaemonJvm with different criteria Then criteria get modified using the expected local toolchain"() { def otherJvm = AvailableJavaHomes.differentVersion @@ -200,9 +196,11 @@ class UpdateDaemonJvmIntegrationTest extends AbstractIntegrationSpec implements given: writeJvmCriteria(otherJvm.javaVersion, otherMetadata.vendor.knownVendor.name()) + captureJavaHome() expect: - succeeds("updateDaemonJvm", "--jvm-version=20", "--toolchain-vendor=AZUL") + withInstallations(otherJvm).succeeds("updateDaemonJvm", "--jvm-version=20", "--jvm-vendor=AZUL") assertJvmCriteria(JavaVersion.VERSION_20, "AZUL") + assertDaemonUsedJvm(otherJvm) } } diff --git a/platforms/core-runtime/build-configuration/src/main/java/org/gradle/buildconfiguration/tasks/UpdateDaemonJvm.java b/platforms/core-runtime/build-configuration/src/main/java/org/gradle/buildconfiguration/tasks/UpdateDaemonJvm.java index d43580a55d5c..c65b666a0f85 100644 --- a/platforms/core-runtime/build-configuration/src/main/java/org/gradle/buildconfiguration/tasks/UpdateDaemonJvm.java +++ b/platforms/core-runtime/build-configuration/src/main/java/org/gradle/buildconfiguration/tasks/UpdateDaemonJvm.java @@ -28,10 +28,15 @@ import org.gradle.api.tasks.options.Option; import org.gradle.internal.buildconfiguration.DaemonJvmPropertiesDefaults; import org.gradle.internal.buildconfiguration.tasks.UpdateDaemonJvmModifier; +import org.gradle.internal.jvm.inspection.JvmVendor; +import org.gradle.jvm.toolchain.JvmVendorSpec; +import org.gradle.jvm.toolchain.internal.DefaultJvmVendorSpec; +import org.gradle.util.internal.GUtil; import org.gradle.util.internal.IncubationLogger; import org.gradle.work.DisableCachingByDefault; import javax.inject.Inject; +import java.util.Arrays; /** * Generates or updates the Gradle Daemon JVM criteria. @@ -43,6 +48,9 @@ @DisableCachingByDefault(because = "Not worth caching") @Incubating public abstract class UpdateDaemonJvm extends DefaultTask { + + private final Property jvmVendorSpec = getProject().getObjects().property(JvmVendorSpec.class); + /** * Constructor. * @@ -56,10 +64,15 @@ public UpdateDaemonJvm() { @TaskAction void generate() { IncubationLogger.incubatingFeatureUsed("Daemon JVM criteria"); + + JvmVendor jvmVendor = null; + if (jvmVendorSpec.isPresent()) { + jvmVendor = JvmVendor.KnownJvmVendor.valueOf(jvmVendorSpec.get().toString()).asJvmVendor(); + } UpdateDaemonJvmModifier.updateJvmCriteria( getPropertiesFile().get().getAsFile(), getJvmVersion().get(), - null, + jvmVendor, null ); } @@ -85,4 +98,32 @@ void generate() { @Option(option = "jvm-version", description = "The version of the JVM required to run the Gradle Daemon.") @Incubating public abstract Property getJvmVersion(); + + /** + * The vendor of Java required to run the Gradle Daemon. + * + * @since 8.9 + */ + @Input + @Optional + @Incubating + public Property getJvmVendor() { + return jvmVendorSpec; + } + + /** + * The vendor of Java required to run the Gradle Daemon. + * + * @since 8.9 + */ + @Option(option = "jvm-vendor", description = "The vendor of Java required to run the Gradle Daemon.") + @Incubating + public void setJvmVendor(String vendor) { + try { + JvmVendor.KnownJvmVendor jvmVendor = GUtil.toEnum(JvmVendor.KnownJvmVendor.class, vendor); + jvmVendorSpec.set(DefaultJvmVendorSpec.of(jvmVendor)); + } catch (Exception e) { + throw new IllegalArgumentException(String.format("Value '%s' given for %s is an invalid Java vendor. Possible values are %s", vendor, DaemonJvmPropertiesDefaults.TOOLCHAIN_VENDOR_PROPERTY, Arrays.toString(JvmVendor.KnownJvmVendor.values()))); + } + } } diff --git a/platforms/core-runtime/launcher/src/integTest/groovy/org/gradle/launcher/daemon/DaemonToolchainIntegrationTest.groovy b/platforms/core-runtime/launcher/src/integTest/groovy/org/gradle/launcher/daemon/DaemonToolchainIntegrationTest.groovy index 503a185aa87b..add9b55eb6cd 100644 --- a/platforms/core-runtime/launcher/src/integTest/groovy/org/gradle/launcher/daemon/DaemonToolchainIntegrationTest.groovy +++ b/platforms/core-runtime/launcher/src/integTest/groovy/org/gradle/launcher/daemon/DaemonToolchainIntegrationTest.groovy @@ -22,6 +22,7 @@ import org.gradle.integtests.fixtures.AvailableJavaHomes import org.gradle.integtests.fixtures.jvm.JavaToolchainFixture import org.gradle.internal.buildconfiguration.fixture.DaemonJvmPropertiesFixture import org.gradle.internal.jvm.Jvm +import org.gradle.internal.os.OperatingSystem import org.gradle.test.precondition.Requires import org.gradle.test.preconditions.IntegTestPreconditions import org.junit.Assume @@ -47,7 +48,7 @@ class DaemonToolchainIntegrationTest extends AbstractIntegrationSpec implements def "Given other daemon toolchain version When executing any task Then daemon jvm was set up with expected configuration"() { given: def otherJvm = AvailableJavaHomes.differentVersion - writeJvmCriteria(otherJvm) + writeJvmCriteria(otherJvm.javaVersion) captureJavaHome() expect: @@ -55,7 +56,21 @@ class DaemonToolchainIntegrationTest extends AbstractIntegrationSpec implements assertDaemonUsedJvm(otherJvm) } - def "Given daemon toolchain criteria that doesn't match installed ones When executing any task Then fails with the expected message"() { + @Requires(IntegTestPreconditions.JavaHomeWithDifferentVersionAvailable) + def "Given other daemon toolchain version and vendor When executing any task Then daemon jvm was set up with expected configuration"() { + given: + def otherJvm = AvailableJavaHomes.differentVersion + def otherMetadata = AvailableJavaHomes.getJvmInstallationMetadata(otherJvm) + + writeJvmCriteria(otherJvm.javaVersion, otherMetadata.vendor.knownVendor.name()) + captureJavaHome() + + expect: + withInstallations(otherJvm).succeeds("help") + assertDaemonUsedJvm(otherJvm) + } + + def "Given daemon toolchain criteria with version that doesn't match installed ones When executing any task Then fails with the expected message"() { given: // Java 10 is not available def java10 = AvailableJavaHomes.getAvailableJdks(JavaVersion.VERSION_1_10) @@ -65,6 +80,19 @@ class DaemonToolchainIntegrationTest extends AbstractIntegrationSpec implements expect: fails("help") - failure.assertHasDescription("Cannot find a Java installation on your machine") + failure.assertHasDescription("Cannot find a Java installation on your machine (${OperatingSystem.current()}) matching the Daemon JVM defined requirements: JVM version '10' vendor 'any'") + } + + def "Given daemon toolchain criteria with version and vendor that doesn't match installed ones When executing any task Then fails with the expected message"() { + given: + // Java 10 is not available + def java10 = AvailableJavaHomes.getAvailableJdks(JavaVersion.VERSION_1_10) + Assume.assumeTrue(java10.isEmpty()) + writeJvmCriteria(JavaVersion.VERSION_1_10, "ibm") + captureJavaHome() + + expect: + fails("help") + failure.assertHasDescription("Cannot find a Java installation on your machine (${OperatingSystem.current()}) matching the Daemon JVM defined requirements: JVM version '10' vendor 'IBM'") } } diff --git a/platforms/core-runtime/launcher/src/integTest/groovy/org/gradle/launcher/daemon/DaemonToolchainInvalidCriteriaIntegrationTest.groovy b/platforms/core-runtime/launcher/src/integTest/groovy/org/gradle/launcher/daemon/DaemonToolchainInvalidCriteriaIntegrationTest.groovy index e56b2fff574b..cc6c8fb59ffd 100644 --- a/platforms/core-runtime/launcher/src/integTest/groovy/org/gradle/launcher/daemon/DaemonToolchainInvalidCriteriaIntegrationTest.groovy +++ b/platforms/core-runtime/launcher/src/integTest/groovy/org/gradle/launcher/daemon/DaemonToolchainInvalidCriteriaIntegrationTest.groovy @@ -53,7 +53,6 @@ class DaemonToolchainInvalidCriteriaIntegrationTest extends AbstractIntegrationS failure.assertHasDescription("Value '-1' given for toolchainVersion is an invalid Java version") } - @NotYetImplemented def "Given unexpected toolchain vendor When execute any task Then fails with expected exception message"() { given: writeJvmCriteria(JavaVersion.VERSION_17, "unexpectedVendor") @@ -62,7 +61,7 @@ class DaemonToolchainInvalidCriteriaIntegrationTest extends AbstractIntegrationS fails 'help' then: - failureDescriptionContains("Option toolchainVendor doesn't accept value 'unexpectedVendor'. Possible values are " + + failureDescriptionContains("Value 'unexpectedVendor' given for toolchainVendor is an invalid Java vendor. Possible values are " + "[ADOPTIUM, ADOPTOPENJDK, AMAZON, APPLE, AZUL, BELLSOFT, GRAAL_VM, HEWLETT_PACKARD, IBM, JETBRAINS, MICROSOFT, ORACLE, SAP, TENCENT, UNKNOWN]") } diff --git a/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/cli/BuildActionsFactory.java b/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/cli/BuildActionsFactory.java index 9d7fa4c92721..e64a4319fb68 100644 --- a/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/cli/BuildActionsFactory.java +++ b/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/cli/BuildActionsFactory.java @@ -36,6 +36,7 @@ import org.gradle.internal.concurrent.CompositeStoppable; import org.gradle.internal.concurrent.Stoppable; import org.gradle.internal.jvm.Jvm; +import org.gradle.internal.jvm.inspection.JvmVendor; import org.gradle.internal.jvm.inspection.JvmVersionDetector; import org.gradle.internal.logging.console.GlobalUserInputReceiver; import org.gradle.internal.nativeintegration.services.NativeServices; @@ -193,6 +194,7 @@ static DaemonContext buildDaemonContextForCurrentProcess(DaemonRequestContext re UUID.randomUUID().toString(), currentProcess.getJvm().getJavaHome(), JavaVersion.current(), + JvmVendor.KnownJvmVendor.parse(Jvm.current().getVendor()), null, 0L, 0, // The gradle options aren't being properly checked. requestContext.getDaemonOpts(), diff --git a/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/cli/BuildEnvironmentConfigurationConverter.java b/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/cli/BuildEnvironmentConfigurationConverter.java index 503a5f70c821..2af0009b5bda 100644 --- a/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/cli/BuildEnvironmentConfigurationConverter.java +++ b/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/cli/BuildEnvironmentConfigurationConverter.java @@ -16,12 +16,15 @@ package org.gradle.launcher.cli; +import org.gradle.StartParameter; +import org.gradle.TaskExecutionRequest; import org.gradle.api.internal.StartParameterInternal; import org.gradle.api.internal.file.FileCollectionFactory; import org.gradle.cli.CommandLineArgumentException; import org.gradle.cli.CommandLineParser; import org.gradle.cli.ParsedCommandLine; import org.gradle.initialization.layout.BuildLayoutFactory; +import org.gradle.internal.buildconfiguration.DaemonJvmPropertiesConfigurator; import org.gradle.jvm.toolchain.internal.ToolchainConfiguration; import org.gradle.launcher.cli.converter.BuildLayoutConverter; import org.gradle.launcher.cli.converter.BuildOptionBackedConverter; @@ -38,6 +41,7 @@ import javax.annotation.Nullable; import java.io.File; import java.util.HashMap; +import java.util.List; import java.util.Map; public class BuildEnvironmentConfigurationConverter { @@ -87,13 +91,21 @@ public Parameters convertParameters(ParsedCommandLine args, @Nullable File curre DaemonParameters daemonParameters = new DaemonParameters(buildLayout, fileCollectionFactory, properties.getRequestedSystemProperties()); daemonParametersConverter.convert(args, properties.getProperties(), daemonParameters); - // This is a workaround to maintain existing behavior that allowed - // toolchain-specific properties to be specified with -P instead of -D - Map gradlePropertiesAsSeenByToolchains = new HashMap<>(); - gradlePropertiesAsSeenByToolchains.putAll(properties.getProperties()); - gradlePropertiesAsSeenByToolchains.putAll(startParameter.getProjectProperties()); - toolchainConfigurationBuildOptionBackedConverter.convert(args, gradlePropertiesAsSeenByToolchains, daemonParameters.getToolchainConfiguration()); - daemonParameters.setRequestedJvmCriteria(properties.getDaemonJvmProperties()); + try { + // This is a workaround to maintain existing behavior that allowed + // toolchain-specific properties to be specified with -P instead of -D + Map gradlePropertiesAsSeenByToolchains = new HashMap<>(); + gradlePropertiesAsSeenByToolchains.putAll(properties.getProperties()); + gradlePropertiesAsSeenByToolchains.putAll(startParameter.getProjectProperties()); + toolchainConfigurationBuildOptionBackedConverter.convert(args, gradlePropertiesAsSeenByToolchains, daemonParameters.getToolchainConfiguration()); + daemonParameters.setRequestedJvmCriteria(properties.getDaemonJvmProperties()); + } catch (Exception exception) { + // When executing updateDaemonJvm with an invalid jvm criteria the validation will be ignored + // and instead the JAVA_HOME will be used to update the daemon-jvm.properties + if (!isExecutingUpdateDaemonJvmTask(startParameter)) { + throw exception; + } + } return new Parameters(startParameter, daemonParameters, properties); } @@ -104,4 +116,9 @@ public void configure(CommandLineParser parser) { startParameterConverter.configure(parser); daemonParametersConverter.configure(parser); } + + private boolean isExecutingUpdateDaemonJvmTask(StartParameter startParameters) { + List taskExecutionRequests = startParameters.getTaskRequests(); + return taskExecutionRequests.size() == 1 && taskExecutionRequests.get(0).getArgs().contains(DaemonJvmPropertiesConfigurator.TASK_NAME); + } } diff --git a/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/configuration/DaemonParameters.java b/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/configuration/DaemonParameters.java index 716c2d676247..45b92427b395 100644 --- a/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/configuration/DaemonParameters.java +++ b/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/configuration/DaemonParameters.java @@ -21,8 +21,9 @@ import org.gradle.internal.buildconfiguration.DaemonJvmPropertiesDefaults; import org.gradle.internal.jvm.JavaInfo; import org.gradle.internal.jvm.JpmsConfiguration; +import org.gradle.internal.jvm.inspection.JvmVendor; import org.gradle.internal.nativeintegration.services.NativeServices.NativeServicesMode; -import org.gradle.jvm.toolchain.JvmImplementation; +import org.gradle.jvm.toolchain.JvmVendorSpec; import org.gradle.jvm.toolchain.internal.DefaultJvmVendorSpec; import org.gradle.jvm.toolchain.internal.DefaultToolchainConfiguration; import org.gradle.jvm.toolchain.internal.ToolchainConfiguration; @@ -32,6 +33,7 @@ import javax.annotation.Nullable; import java.io.File; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashSet; @@ -39,6 +41,8 @@ import java.util.Map; import java.util.Set; +import static org.gradle.util.internal.GUtil.toEnum; + public class DaemonParameters { static final int DEFAULT_IDLE_TIMEOUT = 3 * 60 * 60 * 1000; public static final int DEFAULT_PERIODIC_CHECK_INTERVAL_MILLIS = 10 * 1000; @@ -131,13 +135,27 @@ public DaemonJvmCriteria getRequestedJvmCriteria() { public void setRequestedJvmCriteria(@Nullable Map buildProperties) { String requestedVersion = buildProperties.get(DaemonJvmPropertiesDefaults.TOOLCHAIN_VERSION_PROPERTY); if (requestedVersion != null) { + JavaVersion javaVersion; try { - JavaVersion javaVersion = JavaVersion.toVersion(requestedVersion); - this.requestedJvmCriteria = new DaemonJvmCriteria(javaVersion, DefaultJvmVendorSpec.any(), JvmImplementation.VENDOR_SPECIFIC); + javaVersion = JavaVersion.toVersion(requestedVersion); } catch (Exception e) { // TODO: This should be pushed somewhere else so we consistently report this message in the right context. throw new IllegalArgumentException(String.format("Value '%s' given for %s is an invalid Java version", requestedVersion, DaemonJvmPropertiesDefaults.TOOLCHAIN_VERSION_PROPERTY)); } + + JvmVendorSpec javaVendor = DefaultJvmVendorSpec.any(); + String requestedVendor = buildProperties.get(DaemonJvmPropertiesDefaults.TOOLCHAIN_VENDOR_PROPERTY); + try { + if (requestedVendor != null) { + JvmVendor.KnownJvmVendor knownJvmVendor = toEnum(JvmVendor.KnownJvmVendor.class, requestedVendor); + javaVendor = DefaultJvmVendorSpec.of(knownJvmVendor); + } + } catch (Exception e) { + // TODO: This should be pushed somewhere else so we consistently report this message in the right context. + throw new IllegalArgumentException(String.format("Value '%s' given for %s is an invalid Java vendor. Possible values are %s", requestedVendor, DaemonJvmPropertiesDefaults.TOOLCHAIN_VENDOR_PROPERTY, Arrays.toString(JvmVendor.KnownJvmVendor.values()))); + } + + this.requestedJvmCriteria = new DaemonJvmCriteria(javaVersion, javaVendor); } } diff --git a/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/context/DaemonCompatibilitySpec.java b/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/context/DaemonCompatibilitySpec.java index e1037f9ff6e6..c80b2aa14255 100644 --- a/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/context/DaemonCompatibilitySpec.java +++ b/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/context/DaemonCompatibilitySpec.java @@ -63,7 +63,7 @@ private boolean daemonOptsMatch(DaemonContext potentialContext) { private boolean jvmCompatible(DaemonContext potentialContext) { if (desiredContext.getJvmCriteria() != null) { - return desiredContext.getJvmCriteria().isCompatibleWith(potentialContext.getJavaVersion()); + return desiredContext.getJvmCriteria().isCompatibleWith(potentialContext.getJavaVersion(), potentialContext.getJavaVendor()); } else { try { File potentialJavaHome = potentialContext.getJavaHome(); diff --git a/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/context/DaemonContext.java b/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/context/DaemonContext.java index 207350273a53..9023de4a3be2 100644 --- a/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/context/DaemonContext.java +++ b/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/context/DaemonContext.java @@ -16,6 +16,7 @@ package org.gradle.launcher.daemon.context; import org.gradle.api.JavaVersion; +import org.gradle.internal.jvm.inspection.JvmVendor; import org.gradle.internal.nativeintegration.services.NativeServices.NativeServicesMode; import org.gradle.launcher.daemon.configuration.DaemonParameters; @@ -50,6 +51,8 @@ public interface DaemonContext { JavaVersion getJavaVersion(); + JvmVendor getJavaVendor(); + /** * The directory that should be used for daemon storage (not including the gradle version number). */ diff --git a/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/context/DefaultDaemonContext.java b/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/context/DefaultDaemonContext.java index c60b478db7c8..356ca0b9e12d 100644 --- a/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/context/DefaultDaemonContext.java +++ b/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/context/DefaultDaemonContext.java @@ -18,6 +18,7 @@ import com.google.common.base.Joiner; import org.gradle.api.JavaVersion; import org.gradle.internal.jvm.Jvm; +import org.gradle.internal.jvm.inspection.JvmVendor; import org.gradle.internal.nativeintegration.services.NativeServices.NativeServicesMode; import org.gradle.internal.serialize.Decoder; import org.gradle.internal.serialize.Encoder; @@ -45,11 +46,13 @@ public class DefaultDaemonContext implements DaemonContext { private final DaemonParameters.Priority priority; private final NativeServicesMode nativeServicesMode; private final JavaVersion javaVersion; + private final JvmVendor.KnownJvmVendor javaVendor; public DefaultDaemonContext( String uid, File javaHome, JavaVersion javaVersion, + JvmVendor.KnownJvmVendor javaVendor, File daemonRegistryDir, Long pid, Integer idleTimeout, @@ -68,13 +71,14 @@ public DefaultDaemonContext( this.applyInstrumentationAgent = applyInstrumentationAgent; this.priority = priority; this.nativeServicesMode = nativeServicesMode; + this.javaVendor = javaVendor; } @Override public String toString() { // Changes to this also affect org.gradle.integtests.fixtures.daemon.DaemonContextParser - return String.format("DefaultDaemonContext[uid=%s,javaHome=%s,javaVersion=%s,daemonRegistryDir=%s,pid=%s,idleTimeout=%s,priority=%s,applyInstrumentationAgent=%s,nativeServicesMode=%s,daemonOpts=%s]", - uid, javaHome, javaVersion, daemonRegistryDir, pid, idleTimeout, priority, applyInstrumentationAgent, nativeServicesMode, Joiner.on(',').join(daemonOpts)); + return String.format("DefaultDaemonContext[uid=%s,javaHome=%s,javaVersion=%s,javaVendor=%s,daemonRegistryDir=%s,pid=%s,idleTimeout=%s,priority=%s,applyInstrumentationAgent=%s,nativeServicesMode=%s,daemonOpts=%s]", + uid, javaHome, javaVersion, javaVendor, daemonRegistryDir, pid, idleTimeout, priority, applyInstrumentationAgent, nativeServicesMode, Joiner.on(',').join(daemonOpts)); } @Override @@ -92,6 +96,11 @@ public JavaVersion getJavaVersion() { return javaVersion; } + @Override + public JvmVendor getJavaVendor() { + return javaVendor.asJvmVendor(); + } + @Override public File getDaemonRegistryDir() { return daemonRegistryDir; @@ -140,6 +149,7 @@ public DefaultDaemonContext read(Decoder decoder) throws Exception { String pathname = decoder.readString(); File javaHome = new File(pathname); JavaVersion javaVersion = JavaVersion.valueOf(decoder.readString()); + JvmVendor.KnownJvmVendor javaVendor = JvmVendor.KnownJvmVendor.values()[decoder.readInt()]; File registryDir = new File(decoder.readString()); Long pid = decoder.readBoolean() ? decoder.readLong() : null; Integer idle = decoder.readBoolean() ? decoder.readInt() : null; @@ -152,7 +162,7 @@ public DefaultDaemonContext read(Decoder decoder) throws Exception { NativeServicesMode nativeServicesMode = NativeServicesMode.values()[decoder.readSmallInt()]; DaemonParameters.Priority priority = decoder.readBoolean() ? DaemonParameters.Priority.values()[decoder.readInt()] : null; - return new DefaultDaemonContext(uid, javaHome, javaVersion, registryDir, pid, idle, daemonOpts, applyInstrumentationAgent, nativeServicesMode, priority); + return new DefaultDaemonContext(uid, javaHome, javaVersion, javaVendor, registryDir, pid, idle, daemonOpts, applyInstrumentationAgent, nativeServicesMode, priority); } @Override @@ -160,6 +170,7 @@ public void write(Encoder encoder, DefaultDaemonContext context) throws Exceptio encoder.writeNullableString(context.uid); encoder.writeString(context.javaHome.getPath()); encoder.writeString(context.javaVersion.name()); + encoder.writeInt(context.javaVendor.ordinal()); encoder.writeString(context.daemonRegistryDir.getPath()); encoder.writeBoolean(context.pid != null); if (context.pid != null) { diff --git a/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/server/DaemonServices.java b/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/server/DaemonServices.java index 40a1f3533476..6d287e87d8bb 100644 --- a/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/server/DaemonServices.java +++ b/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/server/DaemonServices.java @@ -26,6 +26,7 @@ import org.gradle.internal.event.ListenerManager; import org.gradle.internal.invocation.BuildAction; import org.gradle.internal.jvm.Jvm; +import org.gradle.internal.jvm.inspection.JvmVendor; import org.gradle.internal.logging.LoggingManagerInternal; import org.gradle.internal.nativeintegration.ProcessEnvironment; import org.gradle.internal.nativeintegration.services.NativeServices; @@ -97,6 +98,7 @@ protected DaemonContext createDaemonContext(AgentStatus agentStatus, ProcessEnvi return new DefaultDaemonContext(configuration.getUid(), canonicalize(Jvm.current().getJavaHome()), JavaVersion.current(), + JvmVendor.KnownJvmVendor.parse(Jvm.current().getVendor()), configuration.getBaseDir(), processEnvironment.maybeGetPid(), configuration.getIdleTimeout(), diff --git a/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/toolchain/DaemonJvmCriteria.java b/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/toolchain/DaemonJvmCriteria.java index 84dd9808efa1..dcda6d1ed151 100644 --- a/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/toolchain/DaemonJvmCriteria.java +++ b/platforms/core-runtime/launcher/src/main/java/org/gradle/launcher/daemon/toolchain/DaemonJvmCriteria.java @@ -17,7 +17,7 @@ package org.gradle.launcher.daemon.toolchain; import org.gradle.api.JavaVersion; -import org.gradle.internal.jvm.Jvm; +import org.gradle.internal.jvm.inspection.JvmVendor; import org.gradle.jvm.toolchain.JvmImplementation; import org.gradle.jvm.toolchain.JvmVendorSpec; @@ -26,6 +26,10 @@ public class DaemonJvmCriteria { private final JvmVendorSpec vendorSpec; private final JvmImplementation jvmImplementation; + public DaemonJvmCriteria(JavaVersion javaVersion, JvmVendorSpec vendorSpec) { + this(javaVersion, vendorSpec, JvmImplementation.VENDOR_SPECIFIC); + } + public DaemonJvmCriteria(JavaVersion javaVersion, JvmVendorSpec vendorSpec, JvmImplementation jvmImplementation) { this.javaVersion = javaVersion; this.vendorSpec = vendorSpec; @@ -44,18 +48,12 @@ public JvmImplementation getJvmImplementation() { return jvmImplementation; } - public boolean isCompatibleWith(Jvm other) { - return isCompatibleWith(other.getJavaVersion()); - } - @Override public String toString() { - // TODO: Include vendor and implementation - return String.format("JVM version '%s'", getJavaVersion()); + return String.format("JVM version '%s' vendor '%s'", getJavaVersion(), getVendorSpec()); } - public boolean isCompatibleWith(JavaVersion javaVersion) { - // TODO: Implement comparisons for vendorSpec and jvmImplementation - return javaVersion == getJavaVersion(); // && vendorSpec.matches() && jvmImplementation == other.jvmImplementation; + public boolean isCompatibleWith(JavaVersion javaVersion, JvmVendor javaVendor) { + return javaVersion == getJavaVersion() && vendorSpec.matches(javaVendor.getRawVendor()); } } diff --git a/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/client/DefaultDaemonConnectorTest.groovy b/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/client/DefaultDaemonConnectorTest.groovy index 346df5252738..d62e8f45f7e6 100644 --- a/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/client/DefaultDaemonConnectorTest.groovy +++ b/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/client/DefaultDaemonConnectorTest.groovy @@ -17,6 +17,8 @@ package org.gradle.launcher.daemon.client import org.gradle.api.JavaVersion import org.gradle.api.internal.specs.ExplainingSpec +import org.gradle.internal.jvm.Jvm +import org.gradle.internal.jvm.inspection.JvmVendor import org.gradle.internal.logging.progress.ProgressLoggerFactory import org.gradle.internal.remote.Address import org.gradle.internal.remote.internal.ConnectCompletion @@ -74,7 +76,7 @@ class DefaultDaemonConnectorTest extends Specification { def startBusyDaemon() { def daemonNum = daemonCounter++ - DaemonContext context = new DefaultDaemonContext(daemonNum.toString(), javaHome, JavaVersion.current(), javaHome, daemonNum, 1000, [], false, NativeServicesMode.ENABLED, DaemonParameters.Priority.NORMAL) + DaemonContext context = new DefaultDaemonContext(daemonNum.toString(), javaHome, JavaVersion.current(), JvmVendor.KnownJvmVendor.parse(Jvm.current().vendor), javaHome, daemonNum, 1000, [], false, NativeServicesMode.ENABLED, DaemonParameters.Priority.NORMAL) def address = createAddress(daemonNum) registry.store(new DaemonInfo(address, context, "password".bytes, Busy)) return new DaemonStartupInfo(daemonNum.toString(), null, null); @@ -82,7 +84,7 @@ class DefaultDaemonConnectorTest extends Specification { def startIdleDaemon() { def daemonNum = daemonCounter++ - DaemonContext context = new DefaultDaemonContext(daemonNum.toString(), javaHome, JavaVersion.current(), javaHome, daemonNum, 1000, [], false, NativeServicesMode.ENABLED, DaemonParameters.Priority.NORMAL) + DaemonContext context = new DefaultDaemonContext(daemonNum.toString(), javaHome, JavaVersion.current(), JvmVendor.KnownJvmVendor.parse(Jvm.current().vendor), javaHome, daemonNum, 1000, [], false, NativeServicesMode.ENABLED, DaemonParameters.Priority.NORMAL) def address = createAddress(daemonNum) registry.store(new DaemonInfo(address, context, "password".bytes, Idle)) } diff --git a/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/context/DaemonCompatibilitySpecSpec.groovy b/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/context/DaemonCompatibilitySpecSpec.groovy index 6733b35c1035..d75247547f2a 100644 --- a/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/context/DaemonCompatibilitySpecSpec.groovy +++ b/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/context/DaemonCompatibilitySpecSpec.groovy @@ -20,7 +20,6 @@ import org.gradle.internal.jvm.JavaInfo import org.gradle.internal.jvm.Jvm import org.gradle.internal.nativeintegration.services.NativeServices import org.gradle.internal.os.OperatingSystem -import org.gradle.jvm.toolchain.JvmImplementation import org.gradle.jvm.toolchain.JvmVendorSpec import org.gradle.launcher.daemon.configuration.DaemonParameters import org.gradle.launcher.daemon.toolchain.DaemonJvmCriteria @@ -91,7 +90,7 @@ class DaemonCompatibilitySpecSpec extends Specification { } def "contexts with different jvm criteria are incompatible"() { - clientWants(new DaemonJvmCriteria(JavaVersion.VERSION_11, JvmVendorSpec.ADOPTIUM, JvmImplementation.VENDOR_SPECIFIC)) + clientWants(new DaemonJvmCriteria(JavaVersion.VERSION_11, JvmVendorSpec.ADOPTIUM)) candidate.javaVersion >> JavaVersion.VERSION_15 diff --git a/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/protocol/DaemonStatusAndErrorReportingTest.groovy b/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/protocol/DaemonStatusAndErrorReportingTest.groovy index 7879f6fa60d5..58a6be4815e3 100644 --- a/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/protocol/DaemonStatusAndErrorReportingTest.groovy +++ b/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/protocol/DaemonStatusAndErrorReportingTest.groovy @@ -29,7 +29,7 @@ class DaemonStatusAndErrorReportingTest extends Specification { def "PID can be null"() { given: - def daemonContext = new DefaultDaemonContext(null, null, null, null, null, null, null, false, NativeServicesMode.ENABLED, null) + def daemonContext = new DefaultDaemonContext(null, null, null, null, null, null, null, null, false, NativeServicesMode.ENABLED, null) when: def pid = daemonContext.pid; diff --git a/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/registry/DaemonRegistryServicesTest.groovy b/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/registry/DaemonRegistryServicesTest.groovy index 5ca93e089416..7e973cf55e0a 100644 --- a/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/registry/DaemonRegistryServicesTest.groovy +++ b/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/registry/DaemonRegistryServicesTest.groovy @@ -21,6 +21,8 @@ import org.gradle.cache.internal.DefaultFileLockManager import org.gradle.cache.internal.ProcessMetaDataProvider import org.gradle.cache.internal.locklistener.FileLockContentionHandler import org.gradle.internal.file.Chmod +import org.gradle.internal.jvm.Jvm +import org.gradle.internal.jvm.inspection.JvmVendor import org.gradle.internal.remote.internal.inet.SocketInetAddress import org.gradle.internal.service.DefaultServiceRegistry import org.gradle.launcher.daemon.configuration.DaemonParameters @@ -65,6 +67,7 @@ class DaemonRegistryServicesTest extends Specification { "$idx", new File("$idx"), JavaVersion.current(), + JvmVendor.KnownJvmVendor.parse(Jvm.current().getVendor()), new File("$idx"), idx, 5000, diff --git a/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/registry/PersistentDaemonRegistryTest.groovy b/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/registry/PersistentDaemonRegistryTest.groovy index 24bfce404cf5..a0c5b1b6d4a7 100644 --- a/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/registry/PersistentDaemonRegistryTest.groovy +++ b/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/registry/PersistentDaemonRegistryTest.groovy @@ -19,6 +19,7 @@ package org.gradle.launcher.daemon.registry import org.gradle.api.JavaVersion import org.gradle.internal.file.Chmod import org.gradle.internal.jvm.Jvm +import org.gradle.internal.jvm.inspection.JvmVendor import org.gradle.internal.remote.Address import org.gradle.internal.remote.internal.inet.InetEndpoint import org.gradle.internal.remote.internal.inet.MultiChoiceAddress @@ -156,7 +157,7 @@ class PersistentDaemonRegistryTest extends Specification { } DaemonContext daemonContext() { - new DefaultDaemonContext(UUID.randomUUID().toString(), Jvm.current().javaHome, JavaVersion.current(), tmp.createDir("daemons"), 1L, 600, [], false, NativeServicesMode.ENABLED, DaemonParameters.Priority.NORMAL) + new DefaultDaemonContext(UUID.randomUUID().toString(), Jvm.current().javaHome, JavaVersion.current(), JvmVendor.KnownJvmVendor.parse(Jvm.current().vendor), tmp.createDir("daemons"), 1L, 600, [], false, NativeServicesMode.ENABLED, DaemonParameters.Priority.NORMAL) } Address address(int i = addressCounter++) { diff --git a/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/server/DaemonRegistryUnavailableExpirationStrategyTest.groovy b/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/server/DaemonRegistryUnavailableExpirationStrategyTest.groovy index ef0e3efd0ffb..7b2bc6e4a938 100644 --- a/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/server/DaemonRegistryUnavailableExpirationStrategyTest.groovy +++ b/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/server/DaemonRegistryUnavailableExpirationStrategyTest.groovy @@ -44,7 +44,7 @@ class DaemonRegistryUnavailableExpirationStrategyTest extends Specification { def "daemon should expire when registry file is unreachable"() { given: DaemonRegistryUnavailableExpirationStrategy expirationStrategy = new DaemonRegistryUnavailableExpirationStrategy(daemon) - DaemonContext daemonContext = new DefaultDaemonContext("user", null, JavaVersion.current(), tempDir.file("BOGUS"), 51234L, 10000, [] as List, false, NativeServicesMode.ENABLED, DaemonParameters.Priority.NORMAL) + DaemonContext daemonContext = new DefaultDaemonContext("user", null, JavaVersion.current(), null, tempDir.file("BOGUS"), 51234L, 10000, [] as List, false, NativeServicesMode.ENABLED, DaemonParameters.Priority.NORMAL) when: 1 * daemon.getDaemonContext() >> { daemonContext } @@ -62,7 +62,7 @@ class DaemonRegistryUnavailableExpirationStrategyTest extends Specification { return "DAEMON_ADDRESS" } } - DaemonContext daemonContext = new DefaultDaemonContext("user", null, JavaVersion.current(), daemonDir, 51234L, 10000, [] as List, false, NativeServicesMode.ENABLED, DaemonParameters.Priority.NORMAL) + DaemonContext daemonContext = new DefaultDaemonContext("user", null, JavaVersion.current(), null, daemonDir, 51234L, 10000, [] as List, false, NativeServicesMode.ENABLED, DaemonParameters.Priority.NORMAL) DaemonDir daemonDir = new DaemonDir(daemonDir) DaemonRegistry registry = new EmbeddedDaemonRegistry() daemonDir.getRegistry().createNewFile() diff --git a/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/toolchain/DaemonJavaToolchainQueryServiceTest.groovy b/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/toolchain/DaemonJavaToolchainQueryServiceTest.groovy index fa8972d9693b..1fb0f776fe99 100644 --- a/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/toolchain/DaemonJavaToolchainQueryServiceTest.groovy +++ b/platforms/core-runtime/launcher/src/test/groovy/org/gradle/launcher/daemon/toolchain/DaemonJavaToolchainQueryServiceTest.groovy @@ -161,7 +161,7 @@ class DaemonJavaToolchainQueryServiceTest extends Specification { toolchain.javaHome.toString() == systemSpecificAbsolutePath("/path/1.8.2") } - def "fails with expected exception if no toolchain matches"() { + def "fails with expected exception if no toolchain matches with version"() { given: def queryService = createQueryServiceWithInstallations(["8", "9", "10"]) @@ -171,7 +171,21 @@ class DaemonJavaToolchainQueryServiceTest extends Specification { then: def e = thrown(GradleException) - e.message == "Cannot find a Java installation on your machine (${OperatingSystem.current()}) matching the Daemon JVM defined requirements: JVM version '12'." + e.message == "Cannot find a Java installation on your machine (${OperatingSystem.current()}) matching the Daemon JVM defined requirements: JVM version '12' vendor 'any'." + e.cause == null + } + + def "fails with expected exception if no toolchain matches with version and vendor"() { + given: + def queryService = createQueryServiceWithInstallations(["8", "9", "10"]) + + when: + def filter = createSpec(JavaVersion.VERSION_12, JvmVendorSpec.AMAZON) + queryService.findMatchingToolchain(filter) + + then: + def e = thrown(GradleException) + e.message == "Cannot find a Java installation on your machine (${OperatingSystem.current()}) matching the Daemon JVM defined requirements: JVM version '12' vendor 'AMAZON'." e.cause == null } diff --git a/platforms/jvm/jvm-services/src/main/java/org/gradle/internal/jvm/inspection/JvmVendor.java b/platforms/jvm/jvm-services/src/main/java/org/gradle/internal/jvm/inspection/JvmVendor.java index d2f6a1bfef20..82123e44a69b 100644 --- a/platforms/jvm/jvm-services/src/main/java/org/gradle/internal/jvm/inspection/JvmVendor.java +++ b/platforms/jvm/jvm-services/src/main/java/org/gradle/internal/jvm/inspection/JvmVendor.java @@ -57,7 +57,7 @@ private String getDisplayName() { return displayName; } - static KnownJvmVendor parse(String rawVendor) { + public static KnownJvmVendor parse(String rawVendor) { if (rawVendor == null) { return UNKNOWN; } diff --git a/platforms/jvm/toolchains-jvm-shared/src/main/java/org/gradle/jvm/toolchain/JvmVendorSpec.java b/platforms/jvm/toolchains-jvm-shared/src/main/java/org/gradle/jvm/toolchain/JvmVendorSpec.java index 6b01ea8a5909..e7690954ea2b 100644 --- a/platforms/jvm/toolchains-jvm-shared/src/main/java/org/gradle/jvm/toolchain/JvmVendorSpec.java +++ b/platforms/jvm/toolchains-jvm-shared/src/main/java/org/gradle/jvm/toolchain/JvmVendorSpec.java @@ -20,12 +20,14 @@ import org.gradle.internal.jvm.inspection.JvmVendor.KnownJvmVendor; import org.gradle.jvm.toolchain.internal.DefaultJvmVendorSpec; +import java.io.Serializable; + /** * Represents a filter for a vendor of a Java Virtual Machine implementation. * * @since 6.8 */ -public abstract class JvmVendorSpec { +public abstract class JvmVendorSpec implements Serializable { /** * A constant for using Eclipse Adoptium as the JVM vendor. diff --git a/platforms/jvm/toolchains-jvm-shared/src/main/java/org/gradle/jvm/toolchain/internal/DefaultJvmVendorSpec.java b/platforms/jvm/toolchains-jvm-shared/src/main/java/org/gradle/jvm/toolchain/internal/DefaultJvmVendorSpec.java index 1d0ac71f3a42..fc1adc629204 100644 --- a/platforms/jvm/toolchains-jvm-shared/src/main/java/org/gradle/jvm/toolchain/internal/DefaultJvmVendorSpec.java +++ b/platforms/jvm/toolchains-jvm-shared/src/main/java/org/gradle/jvm/toolchain/internal/DefaultJvmVendorSpec.java @@ -22,21 +22,22 @@ import org.gradle.internal.jvm.inspection.JvmVendor; import org.gradle.jvm.toolchain.JvmVendorSpec; +import java.io.Serializable; import java.util.function.Predicate; public class DefaultJvmVendorSpec extends JvmVendorSpec implements Predicate { - private static final JvmVendorSpec ANY = new DefaultJvmVendorSpec(v -> true, "any"); + private static final JvmVendorSpec ANY = new DefaultJvmVendorSpec((Predicate & Serializable) v -> true, "any"); private final Predicate matcher; private final String description; public static JvmVendorSpec matching(String match) { - return new DefaultJvmVendorSpec(vendor -> StringUtils.containsIgnoreCase(vendor.getRawVendor(), match), "matching('" + match + "')"); + return new DefaultJvmVendorSpec((Predicate & Serializable) vendor -> StringUtils.containsIgnoreCase(vendor.getRawVendor(), match), "matching('" + match + "')"); } public static JvmVendorSpec of(JvmVendor.KnownJvmVendor knownVendor) { - return new DefaultJvmVendorSpec(vendor -> vendor.getKnownVendor() == knownVendor, knownVendor.toString()); + return new DefaultJvmVendorSpec((Predicate & Serializable) vendor -> vendor.getKnownVendor() == knownVendor, knownVendor.toString()); } public static JvmVendorSpec any() { diff --git a/testing/internal-integ-testing/src/main/groovy/org/gradle/integtests/fixtures/daemon/DaemonContextParser.java b/testing/internal-integ-testing/src/main/groovy/org/gradle/integtests/fixtures/daemon/DaemonContextParser.java index 6b347a55c94d..46ff9fc0f7e1 100644 --- a/testing/internal-integ-testing/src/main/groovy/org/gradle/integtests/fixtures/daemon/DaemonContextParser.java +++ b/testing/internal-integ-testing/src/main/groovy/org/gradle/integtests/fixtures/daemon/DaemonContextParser.java @@ -19,6 +19,7 @@ import com.google.common.base.Splitter; import com.google.common.collect.Lists; import org.gradle.api.JavaVersion; +import org.gradle.internal.jvm.inspection.JvmVendor; import org.gradle.internal.nativeintegration.services.NativeServices.NativeServicesMode; import org.gradle.launcher.daemon.configuration.DaemonParameters; import org.gradle.launcher.daemon.context.DaemonContext; @@ -61,7 +62,7 @@ private static DaemonContext parseFrom(String source, GradleVersion version) { if (version.getBaseVersion().compareTo(GradleVersion.version("8.7")) <= 0) { return parseFrom87(source); } - Pattern pattern = Pattern.compile("^.*DefaultDaemonContext\\[(uid=[^\\n,]+)?,?javaHome=([^\\n]+),javaVersion=([^\\n]+),daemonRegistryDir=([^\\n]+),pid=([^\\n]+),idleTimeout=(.+?)(,priority=[^\\n,]+)?(?:,applyInstrumentationAgent=([^\\n,]+))?(?:,nativeServicesMode=([^\\n,]+))?,daemonOpts=([^\\n]+)].*", + Pattern pattern = Pattern.compile("^.*DefaultDaemonContext\\[(uid=[^\\n,]+)?,?javaHome=([^\\n]+),javaVersion=([^\\n]+),javaVendor=([^\\n]+),daemonRegistryDir=([^\\n]+),pid=([^\\n]+),idleTimeout=(.+?)(,priority=[^\\n,]+)?(?:,applyInstrumentationAgent=([^\\n,]+))?(?:,nativeServicesMode=([^\\n,]+))?,daemonOpts=([^\\n]+)].*", Pattern.MULTILINE + Pattern.DOTALL); Matcher matcher = pattern.matcher(source); @@ -69,15 +70,16 @@ private static DaemonContext parseFrom(String source, GradleVersion version) { String uid = matcher.group(1) == null ? null : matcher.group(1).substring("uid=".length()); String javaHome = matcher.group(2); JavaVersion javaVersion = JavaVersion.toVersion(matcher.group(3)); - String daemonRegistryDir = matcher.group(4); - String pidStr = matcher.group(5); + JvmVendor.KnownJvmVendor javaVendor = JvmVendor.KnownJvmVendor.parse(matcher.group(4)); + String daemonRegistryDir = matcher.group(5); + String pidStr = matcher.group(6); Long pid = pidStr.equals("null") ? null : Long.parseLong(pidStr); - Integer idleTimeout = Integer.decode(matcher.group(6)); - DaemonParameters.Priority priority = matcher.group(7) == null ? DaemonParameters.Priority.NORMAL : DaemonParameters.Priority.valueOf(matcher.group(7).substring(",priority=".length())); - boolean applyInstrumentationAgent = Boolean.parseBoolean(matcher.group(8)); - NativeServicesMode nativeServicesMode = matcher.group(9) == null ? NativeServicesMode.ENABLED : NativeServicesMode.valueOf(matcher.group(9)); - List jvmOpts = Lists.newArrayList(Splitter.on(',').split(matcher.group(10))); - return new DefaultDaemonContext(uid, new File(javaHome), JavaVersion.toVersion(javaVersion), new File(daemonRegistryDir), pid, idleTimeout, jvmOpts, applyInstrumentationAgent, nativeServicesMode, priority); + Integer idleTimeout = Integer.decode(matcher.group(7)); + DaemonParameters.Priority priority = matcher.group(8) == null ? DaemonParameters.Priority.NORMAL : DaemonParameters.Priority.valueOf(matcher.group(8).substring(",priority=".length())); + boolean applyInstrumentationAgent = Boolean.parseBoolean(matcher.group(9)); + NativeServicesMode nativeServicesMode = matcher.group(10) == null ? NativeServicesMode.ENABLED : NativeServicesMode.valueOf(matcher.group(10)); + List jvmOpts = Lists.newArrayList(Splitter.on(',').split(matcher.group(11))); + return new DefaultDaemonContext(uid, new File(javaHome), JavaVersion.toVersion(javaVersion), javaVendor, new File(daemonRegistryDir), pid, idleTimeout, jvmOpts, applyInstrumentationAgent, nativeServicesMode, priority); } else { return null; } @@ -92,6 +94,7 @@ private static DaemonContext parseFrom87(String source) { String uid = matcher.group(1) == null ? null : matcher.group(1).substring("uid=".length()); String javaHome = matcher.group(2); JavaVersion javaVersion = JavaVersion.VERSION_1_8; + JvmVendor.KnownJvmVendor javaVendor = JvmVendor.KnownJvmVendor.UNKNOWN; String daemonRegistryDir = matcher.group(3); String pidStr = matcher.group(4); Long pid = pidStr.equals("null") ? null : Long.parseLong(pidStr); @@ -100,7 +103,7 @@ private static DaemonContext parseFrom87(String source) { boolean applyInstrumentationAgent = Boolean.parseBoolean(matcher.group(7)); NativeServicesMode nativeServicesMode = matcher.group(8) == null ? NativeServicesMode.ENABLED : NativeServicesMode.valueOf(matcher.group(8)); List jvmOpts = Lists.newArrayList(Splitter.on(',').split(matcher.group(9))); - return new DefaultDaemonContext(uid, new File(javaHome), JavaVersion.VERSION_1_8, new File(daemonRegistryDir), pid, idleTimeout, jvmOpts, applyInstrumentationAgent, nativeServicesMode, priority); + return new DefaultDaemonContext(uid, new File(javaHome), javaVersion, javaVendor, new File(daemonRegistryDir), pid, idleTimeout, jvmOpts, applyInstrumentationAgent, nativeServicesMode, priority); } else { return null; }