Deploy Java + libGDX html game on Heroku

34 Views Asked by At

My application works fine and runs in browser via superDev. But when I try to deploy it to Heroku it gives me an error related to compileGWT:

   > Task :core:compileJava
   Note: /tmp/build_8848bf21/core/src/com/mygdx/game/Entity/Player.java uses unchecked or unsafe operations.
   Note: Recompile with -Xlint:unchecked for details.
   
   > Task :core:processResources NO-SOURCE
   > Task :core:classes
   > Task :core:jar
   > Task :html:compileJava
   > Task :html:processResources NO-SOURCE
   > Task :html:classes
   > Task :html:addSource
   
   > Task :html:compileGwt
   [ERROR] Unexpected internal compiler error
   java.lang.UnsupportedClassVersionError: jsinterop/annotations/JsProperty has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:757)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:473)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:419)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:352)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at com.google.gwt.dev.javac.CompilationUnitTypeOracleUpdater.getAnnotationClass(CompilationUnitTypeOracleUpdater.java:615)
    at com.google.gwt.dev.javac.CompilationUnitTypeOracleUpdater.resolveAnnotation(CompilationUnitTypeOracleUpdater.java:686)
    at com.google.gwt.dev.javac.CompilationUnitTypeOracleUpdater.resolveAnnotations(CompilationUnitTypeOracleUpdater.java:704)
    at com.google.gwt.dev.javac.CompilationUnitTypeOracleUpdater.resolveMethod(CompilationUnitTypeOracleUpdater.java:1097)
    at com.google.gwt.dev.javac.CompilationUnitTypeOracleUpdater.resolveClass(CompilationUnitTypeOracleUpdater.java:944)
    at com.google.gwt.dev.javac.CompilationUnitTypeOracleUpdater.access$700(CompilationUnitTypeOracleUpdater.java:82)
    at com.google.gwt.dev.javac.CompilationUnitTypeOracleUpdater$CompilationUnitTypeOracleResolver.resolveClass(CompilationUnitTypeOracleUpdater.java:187)
    at com.google.gwt.dev.javac.asm.ResolveTypeSignature.visitClassType(ResolveTypeSignature.java:133)
    at org.objectweb.asm.signature.SignatureReader.parseType(SignatureReader.java:200)
    at org.objectweb.asm.signature.SignatureReader.accept(SignatureReader.java:111)
    at com.google.gwt.dev.javac.CompilationUnitTypeOracleUpdater.resolveMethod(CompilationUnitTypeOracleUpdater.java:1151)
    at com.google.gwt.dev.javac.CompilationUnitTypeOracleUpdater.resolveClass(CompilationUnitTypeOracleUpdater.java:944)
    at com.google.gwt.dev.javac.CompilationUnitTypeOracleUpdater.access$700(CompilationUnitTypeOracleUpdater.java:82)
    at com.google.gwt.dev.javac.CompilationUnitTypeOracleUpdater$CompilationUnitTypeOracleResolver.resolveClass(CompilationUnitTypeOracleUpdater.java:187)
    at com.google.gwt.dev.javac.asm.ResolveTypeSignature.visitClassType(ResolveTypeSignature.java:133)
    at org.objectweb.asm.signature.SignatureReader.parseType(SignatureReader.java:220)
    at org.objectweb.asm.signature.SignatureReader.accept(SignatureReader.java:114)
    at com.google.gwt.dev.javac.CompilationUnitTypeOracleUpdater.resolveMethod(CompilationUnitTypeOracleUpdater.java:1151)
    at com.google.gwt.dev.javac.CompilationUnitTypeOracleUpdater.resolveClass(CompilationUnitTypeOracleUpdater.java:944)
    at com.google.gwt.dev.javac.CompilationUnitTypeOracleUpdater.resolveClass(CompilationUnitTypeOracleUpdater.java:976)
    at com.google.gwt.dev.javac.CompilationUnitTypeOracleUpdater.resolveClass(CompilationUnitTypeOracleUpdater.java:912)
    at com.google.gwt.dev.javac.CompilationUnitTypeOracleUpdater.addNewTypesDontIndex(CompilationUnitTypeOracleUpdater.java:415)
    at com.google.gwt.dev.javac.CompilationUnitTypeOracleUpdater.addNewTypesDontIndex(CompilationUnitTypeOracleUpdater.java:493)
    at com.google.gwt.dev.javac.CompilationUnitTypeOracleUpdater.addNewUnits(CompilationUnitTypeOracleUpdater.java:456)
    at com.google.gwt.dev.javac.CompilationState.assimilateUnits(CompilationState.java:251)
    at com.google.gwt.dev.javac.CompilationState.<init>(CompilationState.java:111)
    at com.google.gwt.dev.javac.CompilationStateBuilder.doBuildFrom(CompilationStateBuilder.java:540)
    at com.google.gwt.dev.javac.CompilationStateBuilder.buildFrom(CompilationStateBuilder.java:464)
    at com.google.gwt.dev.cfg.ModuleDef.getCompilationState(ModuleDef.java:423)
    at com.google.gwt.dev.Precompile.precompile(Precompile.java:210)
    at com.google.gwt.dev.Precompile.precompile(Precompile.java:190)
    at com.google.gwt.dev.Precompile.precompile(Precompile.java:131)
    at com.google.gwt.dev.Compiler.compile(Compiler.java:192)
    at com.google.gwt.dev.Compiler.compile(Compiler.java:143)
    at com.google.gwt.dev.Compiler.compile(Compiler.java:132)
    at com.google.gwt.dev.Compiler$1.run(Compiler.java:110)
    at com.google.gwt.dev.CompileTaskRunner.doRun(CompileTaskRunner.java:55)
    at com.google.gwt.dev.CompileTaskRunner.runWithAppropriateLogger(CompileTaskRunner.java:50)
    at com.google.gwt.dev.Compiler.main(Compiler.java:113)
   [ERROR] Error saving compilation unit to cache file: /tmp/build_8848bf21/html/build/gwt/cache/gwt-unitCache/gwt-unitCache-7b9fbb59f8661539c34f46974ce5fb573aac79fc-C90BB3B791D3293DB8D5BA1AB0A974D4-0000018D318459FA
   java.io.IOException: Stream Closed
    at java.io.RandomAccessFile.readBytes(Native Method)
    at java.io.RandomAccessFile.read(RandomAccessFile.java:377)
    at com.google.gwt.dev.util.DiskCache.transferToStream(DiskCache.java:170)
    at com.google.gwt.dev.util.DiskCacheToken.writeObject(DiskCacheToken.java:73)
    at sun.reflect.GeneratedMethodAccessor35.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1154)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:441)
    at com.google.gwt.dev.javac.CachedCompilationUnit.writeObject(CachedCompilationUnit.java:230)
    at sun.reflect.GeneratedMethodAccessor36.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1154)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at com.google.gwt.dev.javac.PersistentUnitCacheDir$OpenFile.writeUnit(PersistentUnitCacheDir.java:373)
    at com.google.gwt.dev.javac.PersistentUnitCacheDir.writeUnit(PersistentUnitCacheDir.java:194)
    at com.google.gwt.dev.javac.PersistentUnitCache$BackgroundService$6.run(PersistentUnitCache.java:444)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:750)
   
   > Task :html:compileGwt FAILED
   
   FAILURE: Build failed with an exception.
   
   * What went wrong:
   Execution failed for task ':html:compileGwt'.
   > Process 'command '/tmp/build_8848bf21/.jdk/bin/java'' finished with non-zero exit value 1
   
   * Try:
   > Run with --stacktrace option to get the stack trace.
   > Run with --info or --debug option to get more log output.
   > Run with --scan to get full insights.
   
   * Get more help at https://help.gradle.org  

BUILD FAILED in 1m 3s 5 actionable tasks: 5 executed

! ERROR: Failed to run Gradle! We're sorry this build is failing. If you can't find the issue in application code, please submit a ticket so we can help: https://help.heroku.com You can also try reverting to the previous version of the buildpack by running: $ heroku buildpacks:set https://github.com/heroku/heroku-buildpack-gradle#previous-version

   Thanks,
   Heroku

Push rejected, failed to compile Gradle app. Push failed

It's my build.gradle(MyProject)

buildscript {
    

    repositories {
        mavenLocal()
        mavenCentral()
        gradlePluginPortal()
        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
        google()
    }
    dependencies {
        classpath 'org.docstr:gwt-gradle-plugin:1.1.29'
        classpath 'org.gretty:gretty:3.1.0'
        

    }
}

allprojects {
    apply plugin: "eclipse"

    version = '1.0'
    ext {
        appName = "GameFriends"
        gdxVersion = '1.12.2-SNAPSHOT'
        roboVMVersion = '2.3.20'
        box2DLightsVersion = '1.5'
        ashleyVersion = '1.7.4'
        aiVersion = '1.8.2'
        gdxControllersVersion = '2.2.1'
    }

    repositories {
        mavenLocal()
        mavenCentral()
        google()
        gradlePluginPortal()
        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
        maven { url "https://oss.sonatype.org/content/repositories/releases/" }
        maven { url "https://jitpack.io" }
    }
}

project(":html") {
    apply plugin: "java-library"
    apply plugin: "gwt"
    apply plugin: "war"
    apply plugin: "org.gretty"


    dependencies {
        implementation project(":core")
        api "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion"
        api "com.badlogicgames.gdx:gdx:$gdxVersion:sources"
        api "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion:sources"
        api "com.google.jsinterop:jsinterop-annotations:2.0.2:sources"
        api "com.badlogicgames.gdx:gdx-box2d:$gdxVersion:sources"
        api "com.badlogicgames.gdx:gdx-box2d-gwt:$gdxVersion:sources"

    }
}

project(":core") {
    apply plugin: "java-library"


    dependencies {
        api "com.badlogicgames.gdx:gdx:$gdxVersion"
        api "com.badlogicgames.gdx:gdx-box2d:$gdxVersion"
        
    }
}

It's my build.gradle(html)

gwt {
    gwtVersion='2.10.0' // Should match the gwt version used for building the gwt backend
    maxHeapSize="1G" // Default 256m is not enough for gwt compiler. GWT is HUNGRY
    minHeapSize="1G"

    src = files(file("src/")) // Needs to be in front of "modules" below.
    modules 'com.mygdx.game.GdxDefinition'
    devModules 'com.mygdx.game.GdxDefinitionSuperdev'
    project.webAppDirName = 'webapp'

    compiler {
        strict = true
        disableCastChecking = true

        // Set the Java version for GWT compiler
        sourceCompatibility = '1.8'
        targetCompatibility = '1.8'
    }
}

import org.docstr.gradle.plugins.gwt.GwtSuperDev
import org.akhikhl.gretty.AppBeforeIntegrationTestTask

gretty.httpPort = 8080
gretty.resourceBase = project.buildDir.path + "/gwt/draftOut"
gretty.contextPath = "/"
gretty.portPropertiesFileName = "TEMP_PORTS.properties"

tasks.register('startHttpServer') {
    dependsOn draftCompileGwt

    doFirst {
        copy {
            from "webapp"
            into gretty.resourceBase
        }

        copy {
            from "war"
            into gretty.resourceBase
        }
    }
}

task beforeRun(type: AppBeforeIntegrationTestTask, dependsOn: startHttpServer) {
    // The next line allows ports to be reused instead of
    // needing a process to be manually terminated.
    file("build/TEMP_PORTS.properties").delete()
    // Somewhat of a hack; uses Gretty's support for wrapping a task in
    // a start and then stop of a Jetty server that serves files while
    // also running the SuperDev code server.
    integrationTestTask 'superDev'

    interactive false
}

tasks.register('stage') {
    dependsOn 'assemble'
}

tasks.register('superDev', GwtSuperDev) {
    dependsOn startHttpServer
}

tasks.register('dist') {
    dependsOn clean, compileGwt
    doLast {
        file("build/dist").mkdirs()
        copy {
            from "build/gwt/out"
            into "build/dist"
        }
        copy {
            from "webapp"
            into "build/dist"
        }
        copy {
            from "war"
            into "build/dist"
        }
    }
}

tasks.register('addSource') {
    doLast {
        sourceSets.main.compileClasspath += files(project(':core').sourceSets.main.allJava.srcDirs)
    }
}

tasks.compileGwt.dependsOn(addSource)
tasks.draftCompileGwt.dependsOn(addSource)
tasks.checkGwt.dependsOn(addSource)

sourceCompatibility = 1.8
sourceSets.main.java.srcDirs = [ "src/" ]

eclipse.project.name = appName + "-html"

I added compile version for GWT

compiler {
        strict = true
        disableCastChecking = true

        // Set the Java version for GWT compiler
        sourceCompatibility = '1.8'
        targetCompatibility = '1.8'
    }

Besides I added this part

tasks.register('stage') {
    dependsOn 'assemble'
}

and changed this

tasks.register('superDev', GwtSuperDev) {
    dependsOn startHttpServer
}
1

There are 1 best solutions below

0
Colin Alworth On

java.lang.UnsupportedClassVersionError: jsinterop/annotations/JsProperty has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

Your Heroku build is running Java 8, but at least one of your dependencies was built for Java 11. Setting that your source/target level to 8 doesn't prevent your own computer's Java version from being able to build against code it can recognize - look into Gradle Toolchains to ensure that Gradle runs a specific version of Java itself.

You might also have luck using an older version of jsinterop-annotations - GWT 2.11 only requires 2.0.0.

See https://stackoverflow.com/a/75193700/860630 for a convenient listing of class file versions and Java versions.