diff --git a/graalvm/src/main/java/net/woggioni/gradle/graalvm/DefaultNativeImageExtension.java b/graalvm/src/main/java/net/woggioni/gradle/graalvm/DefaultNativeImageExtension.java new file mode 100644 index 0000000..291ba7a --- /dev/null +++ b/graalvm/src/main/java/net/woggioni/gradle/graalvm/DefaultNativeImageExtension.java @@ -0,0 +1,22 @@ +package net.woggioni.gradle.graalvm; + +import org.gradle.api.Action; +import org.gradle.api.model.ObjectFactory; +import org.gradle.jvm.toolchain.JavaToolchainSpec; + +import javax.inject.Inject; + + +abstract class DefaultNativeImageExtension implements NativeImageExtension { + + @Inject + public DefaultNativeImageExtension(ObjectFactory objects) { + } + + @Override + public JavaToolchainSpec toolchain(Action action) { + JavaToolchainSpec jts = getToolchain(); + action.execute(getToolchain()); + return jts; + } +} diff --git a/graalvm/src/main/java/net/woggioni/gradle/graalvm/NativeImageExtension.java b/graalvm/src/main/java/net/woggioni/gradle/graalvm/NativeImageExtension.java index 104ab04..6e3a6d0 100644 --- a/graalvm/src/main/java/net/woggioni/gradle/graalvm/NativeImageExtension.java +++ b/graalvm/src/main/java/net/woggioni/gradle/graalvm/NativeImageExtension.java @@ -1,26 +1,32 @@ package net.woggioni.gradle.graalvm; -import org.gradle.api.file.DirectoryProperty; +import org.gradle.api.Action; import org.gradle.api.file.FileCollection; import org.gradle.api.provider.Property; +import org.gradle.api.tasks.Nested; +import org.gradle.jvm.toolchain.JavaToolchainSpec; -abstract public class NativeImageExtension { - public abstract Property getClasspath(); - public abstract DirectoryProperty getGraalVmHome(); +public interface NativeImageExtension { + Property getClasspath(); - public abstract Property getUseMusl(); - public abstract Property getBuildStaticImage(); - public abstract Property getEnableFallback(); - public abstract Property getLinkAtBuildTime(); + @Nested + JavaToolchainSpec getToolchain(); - public abstract Property getMainClass(); + JavaToolchainSpec toolchain(Action action); - public abstract Property getMainModule(); + Property getUseMusl(); + Property getBuildStaticImage(); + Property getEnableFallback(); + Property getLinkAtBuildTime(); - public abstract Property getCompressExecutable(); + Property getMainClass(); - public abstract Property getUseLZMA(); + Property getMainModule(); - public abstract Property getCompressionLevel(); + Property getCompressExecutable(); + + Property getUseLZMA(); + + Property getCompressionLevel(); } diff --git a/graalvm/src/main/java/net/woggioni/gradle/graalvm/NativeImagePlugin.java b/graalvm/src/main/java/net/woggioni/gradle/graalvm/NativeImagePlugin.java index f6e08a9..cfb42f3 100644 --- a/graalvm/src/main/java/net/woggioni/gradle/graalvm/NativeImagePlugin.java +++ b/graalvm/src/main/java/net/woggioni/gradle/graalvm/NativeImagePlugin.java @@ -3,9 +3,9 @@ package net.woggioni.gradle.graalvm; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.artifacts.ConfigurationContainer; -import org.gradle.api.file.Directory; import org.gradle.api.file.FileCollection; import org.gradle.api.file.ProjectLayout; +import org.gradle.api.model.ObjectFactory; import org.gradle.api.plugins.ExtensionContainer; import org.gradle.api.plugins.JavaLibraryPlugin; import org.gradle.api.plugins.JavaPlugin; @@ -15,11 +15,8 @@ import org.gradle.api.provider.Provider; import org.gradle.api.tasks.CacheableTask; import org.gradle.api.tasks.TaskContainer; import org.gradle.jvm.tasks.Jar; -import org.gradle.jvm.toolchain.JavaInstallationMetadata; -import org.gradle.jvm.toolchain.JavaLauncher; -import org.gradle.jvm.toolchain.JavaToolchainService; - -import static java.util.Optional.ofNullable; +import org.gradle.jvm.toolchain.JavaToolchainSpec; +import org.gradle.jvm.toolchain.internal.DefaultToolchainSpec; @CacheableTask public class NativeImagePlugin implements Plugin { @@ -30,7 +27,7 @@ public class NativeImagePlugin implements Plugin { public static final String NATIVE_IMAGE_CONFIGURATION_FOLDER_NAME = "native-image"; private static void setIfPresent(Property p1, Provider provider) { - if(provider.isPresent()) { + if (provider.isPresent()) { p1.set(provider); } } @@ -45,25 +42,25 @@ public class NativeImagePlugin implements Plugin { Provider jarTaskProvider = tasks.named(JavaPlugin.JAR_TASK_NAME, Jar.class, jar -> { jar.from(layout.getProjectDirectory().dir(NATIVE_IMAGE_CONFIGURATION_FOLDER_NAME), copySpec -> { copySpec.into( - String.format("META-INF/native-image/%s/%s/", - project.getName(), - project.getGroup() - ) + String.format("META-INF/native-image/%s/%s/", + project.getName(), + project.getGroup() + ) ); }); }); - NativeImageExtension nativeImageExtension = extensionContainer.create("nativeImage", NativeImageExtension.class); - ExtensionContainer ext = project.getExtensions(); JavaPluginExtension javaPluginExtension = ext.findByType(JavaPluginExtension.class); - JavaToolchainService javaToolchainService = ext.findByType(JavaToolchainService.class); + ObjectFactory objects = project.getObjects(); + NativeImageExtension nativeImageExtension = objects.newInstance(DefaultNativeImageExtension.class); + extensionContainer.add("nativeImage", nativeImageExtension); + + nativeImageExtension.toolchain(jts -> { + jts.getImplementation().convention(javaPluginExtension.getToolchain().getImplementation()); + jts.getVendor().convention(javaPluginExtension.getToolchain().getVendor()); + jts.getLanguageVersion().convention(javaPluginExtension.getToolchain().getLanguageVersion()); + }); - Provider graalHomeDirectoryProvider = ofNullable(javaPluginExtension.getToolchain()).map(javaToolchainSpec -> - javaToolchainService.launcherFor(javaToolchainSpec) - ).map(javaLauncher -> - javaLauncher.map(JavaLauncher::getMetadata).map(JavaInstallationMetadata::getInstallationPath) - ).orElseGet(() -> layout.dir(project.provider(() -> project.file(System.getProperty("java.home"))))); - nativeImageExtension.getGraalVmHome().convention(graalHomeDirectoryProvider); nativeImageExtension.getUseMusl().convention(false); nativeImageExtension.getEnableFallback().convention(false); nativeImageExtension.getLinkAtBuildTime().convention(false); @@ -78,10 +75,16 @@ public class NativeImagePlugin implements Plugin { nativeImageExtension.getClasspath().convention(classpath); Provider nativeImageConfigurationTaskProvider = - tasks.register(CONFIGURE_NATIVE_IMAGE_TASK_NAME, NativeImageConfigurationTask.class); + tasks.register(CONFIGURE_NATIVE_IMAGE_TASK_NAME, NativeImageConfigurationTask.class); Provider nativeImageTaskProvider = tasks.register(NATIVE_IMAGE_TASK_NAME, NativeImageTask.class, nativeImageTask -> { nativeImageTask.getClasspath().set(nativeImageExtension.getClasspath()); + nativeImageTask.toolchain(jts -> { + jts.getImplementation().convention(nativeImageExtension.getToolchain().getImplementation()); + jts.getVendor().convention(nativeImageExtension.getToolchain().getVendor()); + jts.getLanguageVersion().convention(nativeImageExtension.getToolchain().getLanguageVersion()); + }); + nativeImageTask.getBuildStaticImage().set(nativeImageExtension.getBuildStaticImage()); nativeImageTask.getUseMusl().set(nativeImageExtension.getUseMusl()); nativeImageTask.getLinkAtBuildTime().set(nativeImageExtension.getLinkAtBuildTime()); @@ -98,7 +101,7 @@ public class NativeImagePlugin implements Plugin { }); tasks.named(NATIVE_IMAGE_TASK_NAME, NativeImageTask.class, t -> { - if(nativeImageExtension.getCompressExecutable().getOrElse(false)) { + if (nativeImageExtension.getCompressExecutable().getOrElse(false)) { t.finalizedBy(upxTaskProvider); } }); diff --git a/graalvm/src/main/java/net/woggioni/gradle/graalvm/NativeImageTask.java b/graalvm/src/main/java/net/woggioni/gradle/graalvm/NativeImageTask.java index ca21b09..8f742bf 100644 --- a/graalvm/src/main/java/net/woggioni/gradle/graalvm/NativeImageTask.java +++ b/graalvm/src/main/java/net/woggioni/gradle/graalvm/NativeImageTask.java @@ -1,5 +1,6 @@ package net.woggioni.gradle.graalvm; +import org.gradle.api.Action; import org.gradle.api.Project; import org.gradle.api.file.Directory; import org.gradle.api.file.DirectoryProperty; @@ -8,10 +9,10 @@ import org.gradle.api.file.ProjectLayout; import org.gradle.api.file.RegularFileProperty; import org.gradle.api.logging.Logger; import org.gradle.api.logging.Logging; +import org.gradle.api.model.ObjectFactory; import org.gradle.api.plugins.BasePluginExtension; import org.gradle.api.plugins.ExtensionContainer; import org.gradle.api.plugins.JavaApplication; -import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.provider.Property; import org.gradle.api.provider.Provider; import org.gradle.api.tasks.CacheableTask; @@ -25,9 +26,9 @@ import org.gradle.api.tasks.OutputFile; import org.gradle.api.tasks.PathSensitive; import org.gradle.api.tasks.PathSensitivity; import org.gradle.internal.jvm.JavaModuleDetector; -import org.gradle.jvm.toolchain.JavaInstallationMetadata; -import org.gradle.jvm.toolchain.JavaLauncher; import org.gradle.jvm.toolchain.JavaToolchainService; +import org.gradle.jvm.toolchain.JavaToolchainSpec; +import org.gradle.jvm.toolchain.internal.DefaultToolchainSpec; import org.gradle.process.CommandLineArgumentProvider; import javax.inject.Inject; @@ -37,7 +38,6 @@ import java.util.Collections; import java.util.List; import java.util.Objects; -import static java.util.Optional.ofNullable; import static net.woggioni.gradle.graalvm.Constants.GRAALVM_TASK_GROUP; @CacheableTask @@ -53,6 +53,13 @@ public abstract class NativeImageTask extends Exec { @PathSensitive(PathSensitivity.RELATIVE) public abstract DirectoryProperty getGraalVmHome(); + private final JavaToolchainSpec toolchain; + + public JavaToolchainSpec toolchain(Action action) { + action.execute(toolchain); + return toolchain; + } + @InputFile @PathSensitive(PathSensitivity.ABSOLUTE) public abstract RegularFileProperty getNativeCompilerPath(); @@ -81,10 +88,12 @@ public abstract class NativeImageTask extends Exec { private static final Logger log = Logging.getLogger(NativeImageTask.class); - public NativeImageTask() { + @Inject + public NativeImageTask(ObjectFactory objects) { Project project = getProject(); setGroup(GRAALVM_TASK_GROUP); setDescription("Create a native image of the application using GraalVM"); + toolchain = objects.newInstance(DefaultToolchainSpec.class); getUseMusl().convention(false); getBuildStaticImage().convention(false); getEnableFallback().convention(false); @@ -108,15 +117,16 @@ public abstract class NativeImageTask extends Exec { } getClasspath().convention(project.files()); ProjectLayout layout = project.getLayout(); - JavaToolchainService javaToolchainService = ext.findByType(JavaToolchainService.class); - JavaPluginExtension javaPluginExtension = ext.findByType(JavaPluginExtension.class); - Provider graalHomeDirectoryProvider = ofNullable(javaPluginExtension.getToolchain()).map(javaToolchainSpec -> - javaToolchainService.launcherFor(javaToolchainSpec) - ).map(javaLauncher -> - javaLauncher.map(JavaLauncher::getMetadata).map(JavaInstallationMetadata::getInstallationPath) - ).orElseGet(() -> layout.dir(project.provider(() -> project.file(System.getProperty("java.home"))))); - getGraalVmHome().convention(graalHomeDirectoryProvider); + JavaToolchainService javaToolchainService = ext.findByType(JavaToolchainService.class); + Provider graalHomeDirectoryProvider = javaToolchainService.launcherFor(it -> { + it.getLanguageVersion().set(toolchain.getLanguageVersion()); + it.getVendor().set(toolchain.getVendor()); + it.getImplementation().set(toolchain.getImplementation()); + }).map(javaLauncher -> + javaLauncher.getMetadata().getInstallationPath() + ).orElse(layout.dir(project.provider(() -> project.file(System.getProperty("java.home"))))); + getGraalVmHome().convention(graalHomeDirectoryProvider); BasePluginExtension basePluginExtension = ext.getByType(BasePluginExtension.class); getOutputFile().convention(basePluginExtension.getLibsDirectory().file(project.getName()));