【发布时间】:2020-07-03 13:00:30
【问题描述】:
我有一个多模块项目。一个模块是一个 android 应用程序,一个是我试图在 Heroku 上运行的基于 spring-boot 的服务器。我首先设置了 android 应用程序,然后使用他们网站上的说明添加了 Heroku 模块。服务器在 IntelliJ 中本地运行良好(作为应用程序),但是当部署到 Heroku 或通过 heroku local web 在本地运行时,它在启动时崩溃:
线程“main”中的异常 java.lang.reflect.InvocationTargetException 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) 在 org.springframework.boot.loader.Launcher.launch(Launcher.java:87) 在 org.springframework.boot.loader.Launcher.launch(Launcher.java:50) 在 org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51) 引起:java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics 在 com.kristoph3r.videocallmyfriends.server.Application$Companion.main(Application.kt) 在 com.kristoph3r.videocallmyfriends.server.Application.main(Application.kt) ... 8 更多原因:java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics 在 java.net.URLClassLoader.findClass(URLClassLoader.java:382) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:419) 在 org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:94) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:352) ... 10 更多
服务器代码(和 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 gradle kotlin heroku