spring - Heroku 应用程序拒绝启动,因为它无法加载 kotlin.jvm.internal.Intrinsics

标签 spring gradle kotlin heroku

我有一个多模块项目。一个模块是一个 android 应用程序,一个是我试图在 Heroku 上运行的基于 spring-boot 的服务器。我首先设置了 android 应用程序,然后使用他们网站上的说明添加了 Heroku 模块。服务器在 IntelliJ 本地运行良好(作为应用程序),但在部署到 Heroku 时,或通过 heroku local web 在本地运行它在启动时崩溃:

Exception in thread "main" java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51) Caused by: java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics at com.kristoph3r.videocallmyfriends.server.Application$Companion.main(Application.kt) at com.kristoph3r.videocallmyfriends.server.Application.main(Application.kt) ... 8 more Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:419) at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:94) at java.lang.ClassLoader.loadClass(ClassLoader.java:352) ... 10 more



服务器代码(和 build.gradle 等)改编自我编写的另一个 Heroku 应用程序(从他们的示例项目之一克隆并修改),并且该应用程序在 Heroku/本地在 IntelliJ 上运行良好/本地使用 heroku local web .不知道需要什么额外的信息来解决这个问题。这些是我的 build.gradle 文件:

根项目:
buildscript {
    ext.kotlin_version = '1.3.70'
    ext.spring_boot_version = '1.5.3.RELEASE'
    repositories {
        google()
        jcenter()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.3'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.springframework.boot:spring-boot-gradle-plugin:$spring_boot_version"
    }
}

allprojects {
    repositories {
        google()
        jcenter()

    }
}

task stage(dependsOn: [':server:stage'])

服务器模块:
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'kotlin'
apply plugin: 'org.springframework.boot'
apply plugin: 'application'

bootRepackage {
    mainClassName = 'com.kristoph3r.videocallmyfriends.server.Application'
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib"
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
}

task stage(dependsOn: ['build', 'clean']) {
    group = 'application'
}

build.mustRunAfter clean

jar {
    archiveBaseName = 'server'
    archiveVersion = '1.0'
}

到目前为止我尝试过的事情:
  • 比较两个项目中的 JAR:它们只包含与我的 Kotlin 代码
  • 对应的类
  • 将插件置于根项目级别或服务器模块级别
  • 将工作项目使用的所有依赖项添加到这个
  • 通常移动 gradle 的东西,删除东西以检查构建是否中断等。
  • 设置启动类为org.springframework.boot.loader.JarLauncher

  • 需要注意的是,我的工作项目没有配置“阶段”任务,但构建和运行良好,而这个项目拒绝在没有阶段任务的 Heroku 上构建。但是,Heroku 文档指出它们触发了构建应用程序的阶段任务,所以我不确定差异是否重要。

    最佳答案

    Spring 启动升级和服务器 build.gradle 中的许多由此产生的变化修复了它(尽管我现有的项目仍然适用于旧的 spring-boot 版本 - 相当神秘!)

    在根项目 ,在buildscript里面,我改变了spring boot的版本:

        ext.spring_boot_version = '2.2.5.RELEASE'
    

    在服务器模块中:

    添加了spring依赖管理插件:
    apply plugin: 'io.spring.dependency-management'
    

    添加了一个依赖管理部分:
    dependencyManagement {
        imports {
            mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
        }
    }
    

    出于某种原因( Spring Boot 的怪癖?)我不得不添加另一个 Kotlin 依赖项:
        implementation "org.jetbrains.kotlin:kotlin-reflect"
    

    最后不得不用springBoot替换bootRepackage:
    springBoot {
        mainClassName = 'com.krist0ph3r.videocallmyfriends.server.Application'
    }
    

    关于spring - Heroku 应用程序拒绝启动,因为它无法加载 kotlin.jvm.internal.Intrinsics,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60807220/

    相关文章:

    java - 如何定义整个spring项目的连接范围——web服务连接范围

    java - 如何设置 Spring Security 以允许来自特定应用程序的 REST 调用?

    maven - gradle始终使用{user.home}/repository作为Maven本地缓存

    android-intent - Kotlin 可打包类抛出 ClassNotFoundException

    kotlin - 如何在 Kotlin 中检查序列是否为空

    java - NoSuchMethodError 错误

    java - spring中创建ThreadPoolExecutor会导致内存泄漏吗?

    java - 试图了解 gradle 和 maven 实际上做了什么

    java - 在 com.android.build.gradle.internal.dsl.BaseAppModuleExtension 类型的对象上找不到参数 [26] 的方法 ImplementationSdkVersion()

    java - 如何调整ScrollView中的Banner广告