2
votes

The issue is that executing gradle commands via the wrapper will cause the compileKotlin step to fail with different mentions that it is unable to find javafx-related classes/packages.

I'm setting up the whole project structure so that all the build system is not dependent on the IDE but rather relies on using the wrapper to execute all the build.

But executing a gradlew.bat build on the command line will fail with the mentioned errors. However, executing a "build" via the embedded Gradle in Intellij works. (attached pictures)

A few things to mention:

  • kotlin version 1.3.50 (latest version)
  • gradle version in wrapper properties is 5.6.2

Build failure pic:

Build failure pic

Build working with Gradle from Intellij: Build working with Gradle from Intellij Build from Intellij button:

Build from Intellij button

Gradle config in Intellij: Gradle config in Intellij

I have already tried plenty of suggestions mentioned on several topics related to this one (Invalidated caches + Restart, re-importing project, generating the wrapper again, all the usual solutions you will see for this issue). None of them worked, so the issue remains. I tried switching between versions of Gradle and running the wrapper again and that didn't work, it seems that version specified for the wrapper and the Gradle distribution it pulls down does not matter since the build fails with exactly the same error on all versions.

Note that this happened quite recently after an update of Intellij Idea from version 2019.2.2 to 2019.2.3, I really hope this isn't the root issue behind it.

This is not the only project with Gradle kotlin-dsl using javafx that is failing right now: even creating a new empty project via the tornadofx-plugin for Intellij and migrating it to the kotlin-dsl will yield the same results: compileKotlin task will fail. Besides that, several older projects with gradle kotlin-dsl that were building fine from the wrapper suddenly started out giving the same error.

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import edu.sc.seis.launch4j.tasks.DefaultLaunch4jTask

plugins {
    application
    id("edu.sc.seis.launch4j") version "2.4.6"
    kotlin("jvm") version "1.3.50"
}

group = "genericdesktopapp"
version = "1.0-SNAPSHOT"

application {
    mainClassName = "root/RootKt"
}

repositories {
    mavenCentral()
    mavenLocal()
}

dependencies {
    implementation(kotlin(module = "reflect", version = "1.3.50"))
    implementation(kotlin("stdlib-jdk8"))
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0-RC")
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-javafx:1.3.0-RC")
    implementation("org.slf4j:slf4j-api:1.7.21")
    implementation("com.lmax:disruptor:3.3.4")
    implementation("org.apache.logging.log4j:log4j-slf4j-impl:2.6.2")
    implementation("org.apache.logging.log4j:log4j-api:2.6.2")
    implementation("org.apache.logging.log4j:log4j-core:2.6.2")
    implementation("commons-io:commons-io:2.6")
    implementation("org.apache.commons:commons-text:1.6")
    implementation("com.github.salomonbrys.kodein:kodein:4.1.0")
    implementation("commons-validator:commons-validator:1.6")
    implementation("no.tornado:tornadofx:1.7.17")

    testImplementation("org.junit.jupiter:junit-jupiter-api:5.1.0")
    testRuntime("org.junit.jupiter:junit-jupiter-engine:5.1.0")

}

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "1.8"
}

tasks.withType<DefaultLaunch4jTask> {
    outfile = "GenericToolbox.exe"
    mainClassName = "root.Root"
    productName = "GenericToolbox"
}

I expect that when I run in the command line gradlew.bat build or ./gradlew build for it to complete normally and find the related classes from javafx, like it happens when using Intellij Gradle build command.

This issue should not even happen since I'm keeping everything at java-8, I know this issue is supposed to happen to versions beyond 8. I'm also seeing in the gradle caches the stdlib-jdk7 from kotlin, I have nowhere nothing related to jdk7 specified in my Intellij configurations or in the build script, so that is also something weird happening. (even cache reset made gradle pull it back in the cache, so I'm thinking it's probably the embedded kotlin compiler from gradle that is that version).

Edit: An easy way of reproducing it (just tested it right now). Open a command line and create a new project with gradle kotlin dsl:

  • mkdir testproject
  • cd testproject
  • gradle init --dsl kotlin

On the project that was generated, run the gradlew.bat build or ./gradlew build and see the compileKotlin working okay and the build is successful. On the same project, in the generated App.kt file, in the main function, add a simple val stage = Stage() (imported from javafx). Run again the gradlew.bat build and see that it now fails since it doesn't find javafx.

1

1 Answers

0
votes

I have managed to find a way around this issue, however, it's not a proper solution since I still haven't found the cause for why that was happening, but I'll post it in case anyone else will have this issue and maybe it will be helpful.

The solution is (weirdly enough) to specify the jdk version that gradle will use when running the commands through the wrapper:

gradlew.bat build -Dorg.gradle.java.home=---path-to-jdk---

I have checked my environment variables and the java home variable already points to that same location, so somehow I believe gradle doesn't find the java home and uses something embedded (which is most likely something above java 8) which produces that error. Running through the Intellij gradle works because it is using the embedded jdk in Intellij which is also java8, so that explains why they were working through the Intellij build button from the Gradle side-window.

If anyone finds the root cause or has some other suggestion, please, feel free to share your knowledge.