Приложение Heroku отказывается запускаться, так как не может загрузить kotlin .jvm.internal.Intrinsics - PullRequest
0 голосов
/ 23 марта 2020

У меня есть многомодульный проект. Один модуль - это приложение android, а другой - сервер с весенней загрузкой, который я пытаюсь запустить на Heroku. Сначала я установил приложение android, а затем добавил модуль Heroku, используя указания на их сайте. Сервер нормально работает локально в IntelliJ (как приложение), но при развертывании в Heroku или при локальном запуске через heroku local web он аварийно завершает работу при запуске:

Исключение в потоке "main" java. lang.reflect. ) в java .lang.reflect.Method.invoke (Метод. 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.kris toph3r.videocallmyfriends.server.Application.main (Application.kt) ... еще 8 причин: java .lang.ClassNotFoundException: kotlin .jvm.internal.Intrinsics at java. net .URLClassLoader. findClass (URLClassLoader. java: 382) в java .lang.ClassLoader.loadClass (ClassLoader. java: 419) в org.springframework.boot.loader.LaunchedURLClassLoader.loadClass (LaunchedURLClassLoader.) 10 *. at java .lang.ClassLoader.loadClass (ClassLoader. java: 352) ... еще 10

Код сервера (и build.gradle, et c) адаптирован из другое приложение Heroku, которое я написал (клонировано из одного из их примеров проектов и изменено), и это приложение прекрасно работает на Heroku / локально в IntelliJ / локально с использованием heroku local web. Не уверен, какая дополнительная информация требуется, чтобы понять это. Это мои файлы build.gradle:

Root проект:

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 коду
  • Размещение плагинов на уровне проекта root или на уровне модуля сервера
  • Добавление всех зависимостей, используемых рабочим проектом, в этот
  • Как правило, перемещает вещи Gradle, удаляет вещи, чтобы проверить, не ломается ли сборка, и т.д. c.
  • Установка класса запуска as org.springframework.boot.loader.JarLauncher

Следует отметить, что в моем рабочем проекте не настроена задача «stage», но он собирается и работает нормально, в то время как этот проект отказывается собирать Heroku без задачи этапа. , Однако в документации Heroku говорится, что они вызывают сценическое задание для создания приложения, поэтому я не уверен, имеет ли это значение.

1 Ответ

0 голосов
/ 24 марта 2020

Обновление весенней загрузки и множество результирующих изменений в build.gradle сервера исправили его (хотя мой существующий проект все еще работает на старой версии весенней загрузки - довольно загадка!)

В проекте root внутри buildscript я изменил версию загрузочной пружины:

    ext.spring_boot_version = '2.2.5.RELEASE'

В модуле сервера:

Добавлена ​​зависимость пружины Плагин управления:

apply plugin: 'io.spring.dependency-management'

Добавлен раздел управлением зависимостями:

dependencyManagement {
    imports {
        mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
    }
}

По какой-то причине (причуды весенней загрузки?) Мне пришлось добавить еще одну Kotlin зависимость:

    implementation "org.jetbrains.kotlin:kotlin-reflect"

И, наконец, пришлось заменить bootRepackage на springBoot:

springBoot {
    mainClassName = 'com.krist0ph3r.videocallmyfriends.server.Application'
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...