plugins { id 'java-library' alias catalog.plugins.kotlin.jvm alias catalog.plugins.envelope alias catalog.plugins.sambal alias catalog.plugins.graalvm.native.image alias catalog.plugins.graalvm.jlink alias catalog.plugins.jpms.check id 'maven-publish' } import net.woggioni.gradle.envelope.EnvelopePlugin import net.woggioni.gradle.envelope.EnvelopeJarTask import net.woggioni.gradle.graalvm.NativeImageConfigurationTask import net.woggioni.gradle.graalvm.NativeImagePlugin import net.woggioni.gradle.graalvm.UpxTask import net.woggioni.gradle.graalvm.JlinkPlugin import net.woggioni.gradle.graalvm.JlinkTask sourceSets { configureNativeImage { java { } kotlin { } } } configurations { release { transitive = false canBeConsumed = true canBeResolved = true visible = true } configureNativeImageImplementation { extendsFrom implementation } configureNativeImageRuntimeOnly { extendsFrom runtimeOnly } nativeImage { extendsFrom runtimeClasspath } } dependencies { configureNativeImageImplementation project configureNativeImageImplementation project(':rbcs-server-memcache') implementation catalog.jwo implementation catalog.slf4j.api implementation catalog.picocli implementation project(':rbcs-client') implementation project(':rbcs-server') // runtimeOnly catalog.slf4j.jdk14 runtimeOnly catalog.logback.classic // runtimeOnly catalog.slf4j.simple nativeImage project(':rbcs-server-memcache') } Property mainModuleName = objects.property(String.class) mainModuleName.set('net.woggioni.rbcs.cli') Property mainClassName = objects.property(String.class) mainClassName.set('net.woggioni.rbcs.cli.RemoteBuildCacheServerCli') tasks.named(JavaPlugin.COMPILE_JAVA_TASK_NAME, JavaCompile) { options.javaModuleMainClass = mainClassName } Provider jarTaskProvider = tasks.named(JavaPlugin.JAR_TASK_NAME, Jar) Provider envelopeJarTaskProvider = tasks.named(EnvelopePlugin.ENVELOPE_JAR_TASK_NAME, EnvelopeJarTask.class) { mainModule = mainModuleName mainClass = mainClassName extraClasspath = ["plugins"] systemProperties['logback.configurationFile'] = 'classpath:net/woggioni/rbcs/cli/logback.xml' systemProperties['io.netty.leakDetectionLevel'] = 'DISABLED' } tasks.named(NativeImagePlugin.CONFIGURE_NATIVE_IMAGE_TASK_NAME, NativeImageConfigurationTask) { javaLauncher = javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(21) vendor = JvmVendorSpec.ORACLE } mainClass = "net.woggioni.rbcs.cli.graal.GraalNativeImageConfiguration" classpath = project.files( configurations.configureNativeImageRuntimeClasspath, sourceSets.configureNativeImage.output ) mergeConfiguration = false systemProperty('logback.configurationFile', 'classpath:net/woggioni/rbcs/cli/logback.xml') systemProperty('io.netty.leakDetectionLevel', 'DISABLED') modularity.inferModulePath = false enabled = true } nativeImage { mainClass = mainClassName // mainModule = mainModuleName useMusl = true buildStaticImage = true linkAtBuildTime = false classpath = project.files(jarTaskProvider, configurations.nativeImage) compressExecutable = true compressionLevel = 10 useLZMA = false } Provider upxTaskProvider = tasks.named(NativeImagePlugin.UPX_TASK_NAME, UpxTask) { } tasks.named(JlinkPlugin.JLINK_TASK_NAME, JlinkTask) { mainClass = mainClassName mainModule = 'net.woggioni.rbcs.cli' } tasks.named(JavaPlugin.PROCESS_RESOURCES_TASK_NAME, ProcessResources) { from(rootProject.file('conf')) { into('net/woggioni/rbcs/cli') include 'logback.xml' include 'logging.properties' } } artifacts { release(envelopeJarTaskProvider) release(upxTaskProvider) } publishing { publications { maven(MavenPublication) { artifact envelopeJar artifact(upxTaskProvider) { classifier = "linux-x86_64" extension = "exe" } } } }