diff --git a/build.gradle b/build.gradle index 5e04558..054eda4 100644 --- a/build.gradle +++ b/build.gradle @@ -38,7 +38,7 @@ subprojects { } wrapper { - gradleVersion = "7.0.2" + gradleVersion = "7.1.1" distributionType = Wrapper.DistributionType.ALL } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts deleted file mode 100644 index 5a41975..0000000 --- a/buildSrc/build.gradle.kts +++ /dev/null @@ -1,7 +0,0 @@ -repositories { - jcenter() -} - -plugins { - `kotlin-dsl` -} diff --git a/buildSrc/src/main/kotlin/Build.kt b/buildSrc/src/main/kotlin/Build.kt deleted file mode 100644 index 51f10cd..0000000 --- a/buildSrc/src/main/kotlin/Build.kt +++ /dev/null @@ -1,5 +0,0 @@ -import org.gradle.api.Project - -operator fun Project.get(key : String) : String? { - return property(key) as String? -} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 25d3265..af7be50 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/jlink/build.gradle b/jlink/build.gradle new file mode 100644 index 0000000..e2894d2 --- /dev/null +++ b/jlink/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'maven-publish' + id 'java-gradle-plugin' +} + +version = "0.1" + +gradlePlugin { + plugins { + create("JlinkPlugin") { + id = "net.woggioni.gradle.jlink" + implementationClass = "net.woggioni.gradle.jlink.JlinkPlugin" + } + } +} diff --git a/jlink/src/main/java/net/woggioni/gradle/jlink/JlinkPlugin.java b/jlink/src/main/java/net/woggioni/gradle/jlink/JlinkPlugin.java new file mode 100644 index 0000000..d9deabd --- /dev/null +++ b/jlink/src/main/java/net/woggioni/gradle/jlink/JlinkPlugin.java @@ -0,0 +1,11 @@ +package net.woggioni.gradle.jlink; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; + +public class JlinkPlugin implements Plugin { + @Override + public void apply(Project project) { + project.getTasks().register("jlink", JlinkTask.class); + } +} diff --git a/jlink/src/main/java/net/woggioni/gradle/jlink/JlinkTask.java b/jlink/src/main/java/net/woggioni/gradle/jlink/JlinkTask.java new file mode 100644 index 0000000..d1ad5d2 --- /dev/null +++ b/jlink/src/main/java/net/woggioni/gradle/jlink/JlinkTask.java @@ -0,0 +1,122 @@ +package net.woggioni.gradle.jlink; + +import lombok.Getter; +import lombok.Setter; +import lombok.SneakyThrows; +import org.apache.tools.ant.taskdefs.condition.Os; +import org.gradle.api.DefaultTask; +import org.gradle.api.GradleException; +import org.gradle.api.file.DirectoryProperty; +import org.gradle.api.file.FileCollection; +import org.gradle.api.model.ObjectFactory; +import org.gradle.api.plugins.*; +import org.gradle.api.provider.ListProperty; +import org.gradle.api.provider.Property; +import org.gradle.api.provider.Provider; +import org.gradle.api.tasks.*; +import org.gradle.jvm.toolchain.JavaInstallationMetadata; +import org.gradle.jvm.toolchain.JavaLauncher; +import org.gradle.jvm.toolchain.JavaToolchainService; + +import javax.annotation.Nonnull; +import javax.inject.Inject; +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + + +public class JlinkTask extends DefaultTask { + + @Getter(onMethod_ = {@Input, @Optional} ) + private final Property launcher; + + @Getter(onMethod_ = {@Input, @Optional} ) + private final Property mainClass; + + @Getter(onMethod_ = {@Input} ) + private final Property mainModule; + + @Getter(onMethod_ = {@Input} ) + private final ListProperty rootModules; + + @Getter(onMethod_ = {@OutputDirectory} ) + private final DirectoryProperty destination; + + @Setter + @Getter(onMethod_ = {@InputFiles} ) + private FileCollection modulePath; + + private final Provider javaLauncher; + + @Inject + public JlinkTask(@Nonnull ObjectFactory objectFactory) { + ExtensionContainer ext = getProject().getExtensions(); + mainClass = objectFactory.property(String.class).convention(ext.findByType(JavaApplication.class).getMainClass()); + mainModule = objectFactory.property(String.class).convention(ext.findByType(JavaApplication.class).getMainModule()); + launcher = objectFactory.property(String.class).convention(getProject().provider(() -> { + String source; + if(mainClass.isPresent()) { + source = mainClass.get(); + } else { + source = mainModule.get(); + } + int i = source.lastIndexOf("."); + return source.substring(i == -1 ? 0 : i); + })); + rootModules = objectFactory.listProperty(String.class).convention(getProject().provider(() -> Arrays.asList(mainModule.get()))); + modulePath = getProject().getConfigurations().getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME) + .plus(getProject().getTasks().named(JavaPlugin.JAR_TASK_NAME).get().getOutputs().getFiles()); + + destination = objectFactory.directoryProperty().convention( + ext.findByType(BasePluginExtension.class) + .getDistsDirectory() + .map(it -> it.dir(getProject().getName())) + ); + + JavaToolchainService javaToolchainService = ext.findByType(JavaToolchainService.class); + JavaPluginExtension javaPluginExtension = ext.findByType(JavaPluginExtension.class); + javaLauncher = objectFactory.property(JavaLauncher.class) + .convention(javaToolchainService.launcherFor(javaPluginExtension.getToolchain())); + } + + @SneakyThrows + @TaskAction + public void run() { + File javaHome; + if(javaLauncher.isPresent()) { + JavaInstallationMetadata javaInstallationMetadata = javaLauncher.get().getMetadata(); + if (!javaInstallationMetadata.getLanguageVersion().canCompileOrRun(9)) { + throw new GradleException(String.format("Minimum Java version supported by '%s' is 9", JlinkTask.class.getName())); + } + javaHome = javaInstallationMetadata.getInstallationPath().getAsFile(); + } else { + javaHome = new File(System.getProperty("java.home")); + } + String executableFileExtension; + if(Os.isFamily(Os.FAMILY_WINDOWS)) { + executableFileExtension = ".exe"; + } else { + executableFileExtension = ""; + } + String jlinkPath = new File(javaHome, "bin/jlink" + executableFileExtension).getPath(); + + List cmd = new ArrayList<>(); + cmd.add(jlinkPath); + cmd.add("--module-path"); + cmd.add(modulePath.getAsPath()); + for(String moduleName : rootModules.get()) { + cmd.add("--add-modules"); + cmd.add(moduleName); + } + cmd.add("--launcher"); + if(mainClass.isPresent()) { + cmd.add(String.format("%s=%s/%s", launcher.get(), mainModule.get(), mainClass.get())); + } else { + cmd.add(String.format("%s=%s", launcher.get(), mainModule.get())); + } + cmd.add("--output"); + cmd.add(destination.get().getAsFile().getPath()); + getProject().exec(execSpec -> execSpec.commandLine(cmd)); + } +} diff --git a/lombok/src/main/java/net/woggioni/gradle/lombok/LombokPlugin.java b/lombok/src/main/java/net/woggioni/gradle/lombok/LombokPlugin.java index db637aa..6ff4f95 100644 --- a/lombok/src/main/java/net/woggioni/gradle/lombok/LombokPlugin.java +++ b/lombok/src/main/java/net/woggioni/gradle/lombok/LombokPlugin.java @@ -24,7 +24,8 @@ public class LombokPlugin implements Plugin { ObjectFactory objectFactory = project.getObjects(); LombokExtension ext = project.getExtensions() .create("lombok", LombokExtension.class, - objectFactory.property(String.class).convention("1.18.20") + objectFactory.property(String.class) + .convention((String) project.getExtensions().getExtraProperties().get("version.lombok")) ); JavaPluginConvention javaPluginConvention = project.getConvention().getPlugin(JavaPluginConvention.class); SourceSetContainer sourceSetContainer = javaPluginConvention.getSourceSets(); diff --git a/settings.gradle b/settings.gradle index 5709198..14fc348 100644 --- a/settings.gradle +++ b/settings.gradle @@ -16,3 +16,4 @@ include("jpms-check") include("multi-release-jar") include("wildfly") include("lombok") +include("jlink")