我有一个多模块项目。一个模块是一个 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'
}
到目前为止我尝试过的事情:
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/