graalvm / native-build-tools

Native-image plugins for various build tools
https://graalvm.github.io/native-build-tools/
Other
349 stars 51 forks source link

Gradle plugin nativeCompile fails when JAVA_HOME and GRAALVM_HOME are not set #542

Open msgilligan opened 7 months ago

msgilligan commented 7 months ago

Describe the bug

Gradle plugin nativeCompile fails when JAVA_HOME and GRAALVM_HOME are not set.

The documentation says:

By default, the plugin will try to use the native-image tool that is bundled with the JDK that is used to run Gradle. This means you must make sure that you run Gradle with a GraalVM JDK.

But if I try a build with ~/.sdkman/candidates/java/21.0.1-graalce/bin/java and native-image in the same directory (~/.sdkman/candidates/java/21.0.1-graalce/bin/native-image), I get the following error:

> Task :consensusj-jsonrpc-cli:nativeCompile FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':consensusj-jsonrpc-cli:nativeCompile'.
> Cannot query the value of property 'javaLauncher' because it has no value available.

This does not happen when JAVA_HOME or GRAALVM_HOME is set.

To Reproduce

I used the following commands to reproduce:

unset JAVA_HOME
unset GRAALVM_HOME
./gradlew consensusj-jsonrpc-cli:nativeCompile

excerpt from my subproject build.gradle:

    // Instead of using 'org.graalvm.buildtools.native' directly we need to include
    // the micronaut application plugin to avoid a Gradle bug:
    // See: https://github.com/micronaut-projects/micronaut-gradle-plugin/issues/706
    // and: https://github.com/gradle/gradle/issues/17559
    //id 'org.graalvm.buildtools.native' version '0.9.28'
    id("io.micronaut.application") version "${micronautAppGradlePluginVersion}"

gradle.properties contains:

micronautAppGradlePluginVersion = 4.2.0

Expected behavior

The nativeCompile task to complete successfully, as it does when JAVA_HOME or GRAALVM_HOME is set.

Logs

See above. I'm happy to provide more info if necessary.

System Info:

Additional context

I actually discovered the bug while trying to create a build that will run in a Nix shell environment.

I don't think either of these issues (or my workaround for them) is relevant:

But I thought I should link them for completeness.

melix commented 7 months ago

Interesting. I actually didn't even expect Gradle to run if JAVA_HOME isn't set :D

dsilvasc commented 6 months ago

This is the workaround I've been using:

graalvmNative {
  binaries {
    all {
      // native-build-tools reads this to find native-image unless either JAVA_HOME or GRAALVM_HOME are set:
      //  https://github.com/graalvm/native-build-tools/blob/0.9.28/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/tasks/BuildNativeImageTask.java#L211
      //  https://github.com/graalvm/native-build-tools/blob/0.9.28/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/NativeImageExecutableLocator.java#L89
      //  https://github.com/graalvm/native-build-tools/issues/542
      javaLauncher.set(javaToolchains.launcherFor {
        // Compile with native-image from GraalVM for JDK21
        languageVersion.set(JavaLanguageVersion.of(21))
        vendor.set(JvmVendorSpec.GRAAL_VM)
      })