diff --git a/grails-gradle/gradle/test-config.gradle b/grails-gradle/gradle/test-config.gradle index 78abf85e4d7..8f166e00978 100644 --- a/grails-gradle/gradle/test-config.gradle +++ b/grails-gradle/gradle/test-config.gradle @@ -40,6 +40,8 @@ tasks.withType(Test).configureEach { } useJUnitPlatform() + systemProperty 'projectVersion', projectVersion + systemProperty 'currentJdk', JavaVersion.current().majorVersion jvmArgs += java17moduleReflectionCompatibilityArguments testLogging { events('passed', 'skipped', 'failed') diff --git a/grails-gradle/plugins/build.gradle b/grails-gradle/plugins/build.gradle index 3772fe07f38..cedf995b7aa 100644 --- a/grails-gradle/plugins/build.gradle +++ b/grails-gradle/plugins/build.gradle @@ -56,6 +56,16 @@ dependencies { implementation 'org.springframework.boot:spring-boot-gradle-plugin' implementation 'org.springframework.boot:spring-boot-loader-tools' implementation 'io.spring.gradle:dependency-management-plugin' + + // Testing - Gradle TestKit is auto-added by java-gradle-plugin + testImplementation('org.spockframework:spock-core') { transitive = false } + testImplementation 'org.codehaus.groovy:groovy-test-junit5' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' +} + +configurations { + testCompileClasspath.exclude group: 'org.apache.groovy', module: 'groovy' + testRuntimeClasspath.exclude group: 'org.apache.groovy', module: 'groovy' } gradlePlugin { @@ -131,4 +141,5 @@ tasks.withType(Copy) { apply { from rootProject.layout.projectDirectory.file('gradle/docs-config.gradle') + from rootProject.layout.projectDirectory.file('gradle/test-config.gradle') } diff --git a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsGradlePlugin.groovy b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsGradlePlugin.groovy index 123a2b76d31..3cddfc86f32 100644 --- a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsGradlePlugin.groovy +++ b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsGradlePlugin.groovy @@ -54,6 +54,7 @@ import org.gradle.api.tasks.TaskContainer import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.compile.GroovyCompile import org.gradle.api.tasks.testing.Test +import org.gradle.jvm.toolchain.JavaToolchainService import org.gradle.language.jvm.tasks.ProcessResources import org.gradle.process.JavaForkOptions import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry @@ -556,6 +557,44 @@ class GrailsGradlePlugin extends GroovyPlugin { String grailsEnvSystemProperty = System.getProperty(Environment.KEY) tasks.withType(Test).configureEach(systemPropertyConfigurer.curry(grailsEnvSystemProperty ?: Environment.TEST.getName())) tasks.withType(JavaExec).configureEach(systemPropertyConfigurer.curry(grailsEnvSystemProperty ?: Environment.DEVELOPMENT.getName())) + + configureToolchainForForkTasks(project) + } + + /** + * Configures {@link JavaExec} tasks to inherit the project's Java toolchain. + * + *

Gradle's {@code JavaPlugin} already sets toolchain conventions on + * {@code JavaCompile}, {@code Javadoc}, and {@code Test} tasks, but does + * not set them on {@code JavaExec} tasks. This means forked + * JVM processes (dbm-* migration tasks, console, shell, and application + * context commands) use the JDK running Gradle instead of the project's + * configured toolchain. When the project targets a different JDK version + * than the one running Gradle, this causes {@code UnsupportedClassVersionError} + * or silent runtime failures.

+ * + *

This method only acts when the user has explicitly configured a toolchain + * via {@code java.toolchain.languageVersion}. When no toolchain is configured, + * behavior is unchanged - tasks use the JDK running Gradle as before.

+ * + *

Uses {@code convention()} so that individual tasks can still override + * the launcher via {@code javaLauncher.set(...)} if needed.

+ * + * @param project the Gradle project + * @since 7.0.8 + */ + protected void configureToolchainForForkTasks(Project project) { + project.afterEvaluate { + def javaExtension = project.extensions.findByType(org.gradle.api.plugins.JavaPluginExtension) + if (javaExtension?.toolchain?.languageVersion?.isPresent()) { + def toolchainService = project.extensions.getByType(JavaToolchainService) + def launcher = toolchainService.launcherFor(javaExtension.toolchain) + + project.tasks.withType(JavaExec).configureEach { JavaExec task -> + task.javaLauncher.convention(launcher) + } + } + } } protected void configureConsoleTask(Project project) { diff --git a/grails-gradle/plugins/src/test/groovy/org/grails/gradle/plugin/core/GradleSpecification.groovy b/grails-gradle/plugins/src/test/groovy/org/grails/gradle/plugin/core/GradleSpecification.groovy new file mode 100644 index 00000000000..49ce68a8a29 --- /dev/null +++ b/grails-gradle/plugins/src/test/groovy/org/grails/gradle/plugin/core/GradleSpecification.groovy @@ -0,0 +1,134 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.grails.gradle.plugin.core + +import org.gradle.testkit.runner.BuildResult +import org.gradle.testkit.runner.GradleRunner +import org.gradle.testkit.runner.TaskOutcome +import spock.lang.Specification + +import java.nio.file.FileVisitResult +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.SimpleFileVisitor +import java.nio.file.attribute.BasicFileAttributes + +/** + * Base class for Gradle plugin functional tests using TestKit. + * + *

Adapted from the {@code GradleSpecification} in the + * {@code apache/grails-gradle-publish} project. Handles temp directory + * management, GradleRunner setup, test resource project copying, and + * common build assertions.

+ * + * @since 7.0.8 + */ +abstract class GradleSpecification extends Specification { + + private static Path basePath + private static GradleRunner gradleRunner + + /** Project version injected by Gradle test config. */ + protected static final String PROJECT_VERSION = System.getProperty('projectVersion') + + /** Current JDK major version injected by Gradle test config. */ + protected static final int CURRENT_JDK = Integer.parseInt(System.getProperty('currentJdk')) + + void setupSpec() { + basePath = Files.createTempDirectory('gradle-projects') + Path testKitDir = Files.createDirectories(basePath.resolve('.gradle')) + gradleRunner = GradleRunner.create() + .withPluginClasspath() + .withTestKitDir(testKitDir.toFile()) + } + + void cleanup() { + basePath?.toFile()?.listFiles()?.each { + if (it.name == '.gradle') { + return + } + it.deleteDir() + } + } + + void cleanupSpec() { + basePath?.toFile()?.deleteDir() + } + + /** + * Sets up a test project from resource files under + * {@code src/test/resources/test-projects/{projectName}}. + * + *

Files are copied to a temp directory. Any occurrence of + * {@code __CURRENT_JDK__} in {@code .gradle} files is replaced + * with the actual current JDK version, and {@code __PROJECT_VERSION__} + * is replaced with the actual project version.

+ */ + protected GradleRunner setupTestResourceProject(String projectName) { + Path destination = basePath.resolve(projectName) + Files.createDirectories(destination) + + Path source = Path.of("src/test/resources/test-projects/${projectName}") + copyDirectory(source, destination) + + gradleRunner.withProjectDir(destination.toFile()) + } + + /** + * Executes a Gradle task and returns the build result. + */ + protected BuildResult executeTask(String taskName, List otherArgs = []) { + List args = [taskName, '--stacktrace'] + args.addAll(otherArgs) + gradleRunner.withArguments(args).forwardOutput().build() + } + + /** + * Asserts that the given task succeeded. + */ + protected void assertTaskSuccess(String taskName, BuildResult result) { + def task = result.tasks.find { it.path.endsWith(":${taskName}") } + assert task != null : "Task '${taskName}' not found in build result" + assert task.outcome == TaskOutcome.SUCCESS : "Task '${taskName}' outcome was ${task.outcome}" + } + + private void copyDirectory(Path source, Path destination) { + Files.walkFileTree(source, new SimpleFileVisitor() { + @Override + FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) { + Files.createDirectories(destination.resolve(source.relativize(dir))) + FileVisitResult.CONTINUE + } + + @Override + FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { + Path target = destination.resolve(source.relativize(file)) + if (file.toString().endsWith('.gradle') || file.toString().endsWith('.properties')) { + String content = Files.readString(file) + .replace('__CURRENT_JDK__', String.valueOf(CURRENT_JDK)) + .replace('__PROJECT_VERSION__', PROJECT_VERSION) + Files.writeString(target, content) + } else { + Files.copy(file, target) + } + FileVisitResult.CONTINUE + } + }) + } +} diff --git a/grails-gradle/plugins/src/test/groovy/org/grails/gradle/plugin/core/GrailsGradlePluginToolchainSpec.groovy b/grails-gradle/plugins/src/test/groovy/org/grails/gradle/plugin/core/GrailsGradlePluginToolchainSpec.groovy new file mode 100644 index 00000000000..7945814c581 --- /dev/null +++ b/grails-gradle/plugins/src/test/groovy/org/grails/gradle/plugin/core/GrailsGradlePluginToolchainSpec.groovy @@ -0,0 +1,136 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.grails.gradle.plugin.core + +/** + * Tests that {@link GrailsGradlePlugin} propagates the project's Java toolchain + * to JavaExec tasks via {@code javaLauncher.convention()}. + * + *

Without the fix, JavaExec tasks spawned by Grails (dbm-* migration + * commands, console, shell, application context commands) use the JDK + * running Gradle instead of the project's configured toolchain.

+ * + * @since 7.0.8 + * @see GrailsGradlePlugin#configureToolchainForForkTasks + */ +class GrailsGradlePluginToolchainSpec extends GradleSpecification { + + // ---------------------------------------------------------------- + // Toolchain propagation + // ---------------------------------------------------------------- + + def "JavaExec tasks inherit project toolchain"() { + given: + setupTestResourceProject('toolchain-javaexec') + + when: + def result = executeTask('checkToolchain') + + then: + result.output.contains("TOOLCHAIN_VERSION=${CURRENT_JDK}") + } + + def "Test tasks inherit project toolchain"() { + given: + setupTestResourceProject('toolchain-test') + + when: + def result = executeTask('checkTestToolchain') + + then: + result.output.contains("TEST_TOOLCHAIN_VERSION=${CURRENT_JDK}") + } + + def "ApplicationContextCommandTask inherits toolchain via grails-web plugin"() { + given: + setupTestResourceProject('toolchain-command') + + when: + def result = executeTask('checkCommandToolchain') + + then: + result.output.contains("CMD_TOOLCHAIN_VERSION=${CURRENT_JDK}") + } + + def "convention allows individual task override via set()"() { + given: + setupTestResourceProject('toolchain-override') + + when: + def result = executeTask('checkOverride') + + then: + result.output.contains("OVERRIDE_VERSION=${CURRENT_JDK}") + } + + // ---------------------------------------------------------------- + // Backwards compatibility (no toolchain configured) + // ---------------------------------------------------------------- + + def "JavaExec tasks work without errors when no toolchain configured"() { + given: + setupTestResourceProject('no-toolchain-javaexec') + + when: + def result = executeTask('checkToolchain') + + then: + result.output.contains('HAS_LAUNCHER=') + } + + def "GrailsWebGradlePlugin works without errors when no toolchain configured"() { + given: + setupTestResourceProject('no-toolchain-web') + + when: + def result = executeTask('checkNoError') + + then: + result.output.contains('WEB_PLUGIN_OK=true') + } + + // ---------------------------------------------------------------- + // Fork settings preservation + // ---------------------------------------------------------------- + + def "configureForkSettings applies system properties and default heap sizes"() { + given: + setupTestResourceProject('fork-settings-defaults') + + when: + def result = executeTask('inspectSysProps') + + then: + result.output.contains('HAS_ENV=true') + result.output.contains('MIN_HEAP=768m') + result.output.contains('MAX_HEAP=768m') + } + + def "custom heap sizes are not overridden by fork settings"() { + given: + setupTestResourceProject('fork-settings-custom') + + when: + def result = executeTask('inspectHeap') + + then: + result.output.contains('MIN_HEAP=512m') + result.output.contains('MAX_HEAP=2g') + } +} diff --git a/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-custom/build.gradle b/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-custom/build.gradle new file mode 100644 index 00000000000..8e9ffc40181 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-custom/build.gradle @@ -0,0 +1,18 @@ +plugins { + id 'org.apache.grails.gradle.grails-app' +} + +tasks.register('customHeap', JavaExec) { + classpath = files() + mainClass = 'does.not.Matter' + minHeapSize = '512m' + maxHeapSize = '2g' +} + +tasks.register('inspectHeap') { + doLast { + def task = tasks.named('customHeap', JavaExec).get() + println "MIN_HEAP=${task.minHeapSize}" + println "MAX_HEAP=${task.maxHeapSize}" + } +} diff --git a/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-custom/gradle.properties b/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-custom/gradle.properties new file mode 100644 index 00000000000..35c332fb874 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-custom/gradle.properties @@ -0,0 +1 @@ +grailsVersion=__PROJECT_VERSION__ diff --git a/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-custom/grails-app/conf/application.yml b/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-custom/grails-app/conf/application.yml new file mode 100644 index 00000000000..e69de29bb2d diff --git a/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-custom/settings.gradle b/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-custom/settings.gradle new file mode 100644 index 00000000000..c426fa21f91 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-custom/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'test-toolchain' diff --git a/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-defaults/build.gradle b/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-defaults/build.gradle new file mode 100644 index 00000000000..9816aab19d4 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-defaults/build.gradle @@ -0,0 +1,18 @@ +plugins { + id 'org.apache.grails.gradle.grails-app' +} + +tasks.register('checkSysProps', JavaExec) { + classpath = files() + mainClass = 'does.not.Matter' +} + +tasks.register('inspectSysProps') { + doLast { + def task = tasks.named('checkSysProps', JavaExec).get() + def sysProps = task.systemProperties + println "HAS_ENV=${sysProps.containsKey('grails.env')}" + println "MIN_HEAP=${task.minHeapSize}" + println "MAX_HEAP=${task.maxHeapSize}" + } +} diff --git a/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-defaults/gradle.properties b/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-defaults/gradle.properties new file mode 100644 index 00000000000..35c332fb874 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-defaults/gradle.properties @@ -0,0 +1 @@ +grailsVersion=__PROJECT_VERSION__ diff --git a/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-defaults/grails-app/conf/application.yml b/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-defaults/grails-app/conf/application.yml new file mode 100644 index 00000000000..e69de29bb2d diff --git a/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-defaults/settings.gradle b/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-defaults/settings.gradle new file mode 100644 index 00000000000..c426fa21f91 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/fork-settings-defaults/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'test-toolchain' diff --git a/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-javaexec/build.gradle b/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-javaexec/build.gradle new file mode 100644 index 00000000000..fafaed9db77 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-javaexec/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'org.apache.grails.gradle.grails-app' +} + +tasks.register('printLauncher', JavaExec) { + classpath = files() + mainClass = 'does.not.Matter' +} + +tasks.register('checkToolchain') { + doLast { + def launcher = tasks.named('printLauncher', JavaExec).get().javaLauncher + if (launcher.isPresent()) { + println 'HAS_LAUNCHER=true' + } else { + println 'HAS_LAUNCHER=false' + } + } +} diff --git a/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-javaexec/gradle.properties b/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-javaexec/gradle.properties new file mode 100644 index 00000000000..35c332fb874 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-javaexec/gradle.properties @@ -0,0 +1 @@ +grailsVersion=__PROJECT_VERSION__ diff --git a/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-javaexec/grails-app/conf/application.yml b/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-javaexec/grails-app/conf/application.yml new file mode 100644 index 00000000000..e69de29bb2d diff --git a/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-javaexec/settings.gradle b/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-javaexec/settings.gradle new file mode 100644 index 00000000000..c426fa21f91 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-javaexec/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'test-toolchain' diff --git a/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-web/build.gradle b/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-web/build.gradle new file mode 100644 index 00000000000..60e07b18708 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-web/build.gradle @@ -0,0 +1,9 @@ +plugins { + id 'org.apache.grails.gradle.grails-web' +} + +tasks.register('checkNoError') { + doLast { + println 'WEB_PLUGIN_OK=true' + } +} diff --git a/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-web/gradle.properties b/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-web/gradle.properties new file mode 100644 index 00000000000..35c332fb874 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-web/gradle.properties @@ -0,0 +1 @@ +grailsVersion=__PROJECT_VERSION__ diff --git a/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-web/grails-app/conf/application.yml b/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-web/grails-app/conf/application.yml new file mode 100644 index 00000000000..e69de29bb2d diff --git a/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-web/settings.gradle b/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-web/settings.gradle new file mode 100644 index 00000000000..c426fa21f91 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/no-toolchain-web/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'test-toolchain' diff --git a/grails-gradle/plugins/src/test/resources/test-projects/toolchain-command/build.gradle b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-command/build.gradle new file mode 100644 index 00000000000..12222d08e39 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-command/build.gradle @@ -0,0 +1,25 @@ +plugins { + id 'org.apache.grails.gradle.grails-web' +} + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(__CURRENT_JDK__) + } +} + +tasks.register('checkCommandToolchain') { + doLast { + def cmdTask = tasks.named('urlMappingsReport').get() + if (cmdTask instanceof JavaExec) { + def launcher = ((JavaExec) cmdTask).javaLauncher + if (launcher.isPresent()) { + println "CMD_TOOLCHAIN_VERSION=${launcher.get().metadata.languageVersion.asInt()}" + } else { + println 'CMD_TOOLCHAIN_VERSION=none' + } + } else { + println 'CMD_TOOLCHAIN_VERSION=not_javaexec' + } + } +} diff --git a/grails-gradle/plugins/src/test/resources/test-projects/toolchain-command/gradle.properties b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-command/gradle.properties new file mode 100644 index 00000000000..35c332fb874 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-command/gradle.properties @@ -0,0 +1 @@ +grailsVersion=__PROJECT_VERSION__ diff --git a/grails-gradle/plugins/src/test/resources/test-projects/toolchain-command/grails-app/conf/application.yml b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-command/grails-app/conf/application.yml new file mode 100644 index 00000000000..e69de29bb2d diff --git a/grails-gradle/plugins/src/test/resources/test-projects/toolchain-command/settings.gradle b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-command/settings.gradle new file mode 100644 index 00000000000..c426fa21f91 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-command/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'test-toolchain' diff --git a/grails-gradle/plugins/src/test/resources/test-projects/toolchain-javaexec/build.gradle b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-javaexec/build.gradle new file mode 100644 index 00000000000..bc4c3757ec2 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-javaexec/build.gradle @@ -0,0 +1,26 @@ +plugins { + id 'org.apache.grails.gradle.grails-app' +} + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(__CURRENT_JDK__) + } +} + +tasks.register('printLauncher', JavaExec) { + classpath = files() + mainClass = 'does.not.Matter' +} + +tasks.register('checkToolchain') { + doLast { + def launcher = tasks.named('printLauncher', JavaExec).get().javaLauncher + if (launcher.isPresent()) { + def metadata = launcher.get().metadata + println "TOOLCHAIN_VERSION=${metadata.languageVersion.asInt()}" + } else { + println 'TOOLCHAIN_VERSION=none' + } + } +} diff --git a/grails-gradle/plugins/src/test/resources/test-projects/toolchain-javaexec/gradle.properties b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-javaexec/gradle.properties new file mode 100644 index 00000000000..35c332fb874 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-javaexec/gradle.properties @@ -0,0 +1 @@ +grailsVersion=__PROJECT_VERSION__ diff --git a/grails-gradle/plugins/src/test/resources/test-projects/toolchain-javaexec/grails-app/conf/application.yml b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-javaexec/grails-app/conf/application.yml new file mode 100644 index 00000000000..e69de29bb2d diff --git a/grails-gradle/plugins/src/test/resources/test-projects/toolchain-javaexec/settings.gradle b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-javaexec/settings.gradle new file mode 100644 index 00000000000..c426fa21f91 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-javaexec/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'test-toolchain' diff --git a/grails-gradle/plugins/src/test/resources/test-projects/toolchain-override/build.gradle b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-override/build.gradle new file mode 100644 index 00000000000..a70d289314c --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-override/build.gradle @@ -0,0 +1,30 @@ +import org.gradle.jvm.toolchain.JavaLanguageVersion + +plugins { + id 'org.apache.grails.gradle.grails-app' +} + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(__CURRENT_JDK__) + } +} + +tasks.register('customExec', JavaExec) { + classpath = files() + mainClass = 'does.not.Matter' + javaLauncher.set(javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(__CURRENT_JDK__) + }) +} + +tasks.register('checkOverride') { + doLast { + def launcher = tasks.named('customExec', JavaExec).get().javaLauncher + if (launcher.isPresent()) { + println "OVERRIDE_VERSION=${launcher.get().metadata.languageVersion.asInt()}" + } else { + println 'OVERRIDE_VERSION=none' + } + } +} diff --git a/grails-gradle/plugins/src/test/resources/test-projects/toolchain-override/gradle.properties b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-override/gradle.properties new file mode 100644 index 00000000000..35c332fb874 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-override/gradle.properties @@ -0,0 +1 @@ +grailsVersion=__PROJECT_VERSION__ diff --git a/grails-gradle/plugins/src/test/resources/test-projects/toolchain-override/grails-app/conf/application.yml b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-override/grails-app/conf/application.yml new file mode 100644 index 00000000000..e69de29bb2d diff --git a/grails-gradle/plugins/src/test/resources/test-projects/toolchain-override/settings.gradle b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-override/settings.gradle new file mode 100644 index 00000000000..c426fa21f91 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-override/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'test-toolchain' diff --git a/grails-gradle/plugins/src/test/resources/test-projects/toolchain-test/build.gradle b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-test/build.gradle new file mode 100644 index 00000000000..e397472e6de --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-test/build.gradle @@ -0,0 +1,21 @@ +plugins { + id 'org.apache.grails.gradle.grails-app' +} + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(__CURRENT_JDK__) + } +} + +tasks.register('checkTestToolchain') { + doLast { + def testTask = tasks.named('test', Test).get() + def launcher = testTask.javaLauncher + if (launcher.isPresent()) { + println "TEST_TOOLCHAIN_VERSION=${launcher.get().metadata.languageVersion.asInt()}" + } else { + println 'TEST_TOOLCHAIN_VERSION=none' + } + } +} diff --git a/grails-gradle/plugins/src/test/resources/test-projects/toolchain-test/gradle.properties b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-test/gradle.properties new file mode 100644 index 00000000000..35c332fb874 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-test/gradle.properties @@ -0,0 +1 @@ +grailsVersion=__PROJECT_VERSION__ diff --git a/grails-gradle/plugins/src/test/resources/test-projects/toolchain-test/grails-app/conf/application.yml b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-test/grails-app/conf/application.yml new file mode 100644 index 00000000000..e69de29bb2d diff --git a/grails-gradle/plugins/src/test/resources/test-projects/toolchain-test/settings.gradle b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-test/settings.gradle new file mode 100644 index 00000000000..c426fa21f91 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/toolchain-test/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'test-toolchain'