Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
msgilligan opened this issue Nov 25, 2023 · 2 comments
Labels
bug Something isn't working

Comments

@msgilligan
Copy link

msgilligan commented Nov 25, 2023

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:

  • OS: macOS 13.6.2
  • GraalVM Version: 21.0.1-graalce (installed with SDKMAN)
  • Java Version: 21
  • Plugin version: Should be 0.9.28 (but is installed via io.micronaut.application, see above)

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.

@msgilligan msgilligan added the bug Something isn't working label Nov 25, 2023
@melix
Copy link
Collaborator

melix commented Dec 6, 2023

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

@dsilvasc
Copy link

dsilvasc commented Dec 20, 2023

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)
      })

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants