NoClassDefFoundError с несколькими проектами gradle - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть настроенный мульти проект в Java.Сборка прошла успешно, но когда я попытался запустить JAR, был выдан java.lang.NoClassDefFoundError.

Вот структура моего проекта:

.gradle/
authserver/
    build/
    src/main/java/fr/evywell/robserver/auth/
        Main.java
build/
common/
    build/
    src/main/java/fr/evywell/robserver/common/
gradle/
build.gradle
settings.gradle

А затем моя конфигурация: настройки.gradle (IN ROOT DIR)

rootProject.name = "robserver"

include 'authserver'
include 'common'

build.gradle (IN ROOT DIR)

subprojects {
    apply plugin: 'java'

    repositories {
        mavenCentral()
    }
}

build.gradle (IN common DIR)

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile group: 'io.netty', name: 'netty-all', version: '4.1.24.Final'
    compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.16'
    compile group: 'org.javassist', name: 'javassist', version: '3.25.0-GA'
    compile group: 'com.jsoniter', name: 'jsoniter', version: '0.9.23'
}

build.gradle (IN authserver DIR)

apply plugin: 'application'

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile group: 'io.netty', name: 'netty-all', version: '4.1.24.Final'
    compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.16'
    compile group: 'org.javassist', name: 'javassist', version: '3.25.0-GA'
    compile group: 'com.jsoniter', name: 'jsoniter', version: '0.9.23'
    compile project (':common')
}

mainClassName = 'fr.evywell.robserver.auth.Main'

jar {
    manifest {
        attributes 'Main-Class': 'fr.evywell.robserver.auth.Main'
    }
}

Сообщение об ошибке:

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: fr/evywell/robserver/common/network/Server
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
    at java.lang.Class.getMethod0(Class.java:3018)
    at java.lang.Class.getMethod(Class.java:1784)
    at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: fr.evywell.robserver.common.network.Server
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 7 more

В сообщении об ошибке говорится, что он не может найти класс в моем пакете common.Я не знаю почему, потому что я использовал compile project (':common') в своей конфигурации gradle для аутентификатора

Вот команда: java -jar authserver/build/libs/authserver.jar

Спасибо за вашу помощь и хорошего дня!

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Я использовал теневой плагин для создания "толстой банки".Я не знаю, хорошая ли это практика ...

Спасибо за вашу помощь!

// authserver/build.gradle
plugins {
    id 'com.github.johnrengelman.shadow' version '5.1.0'
    id 'java'
}
apply plugin: 'application'

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile group: 'io.netty', name: 'netty-all', version: '4.1.24.Final'
    compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.16'
    compile group: 'org.javassist', name: 'javassist', version: '3.25.0-GA'
    compile group: 'com.jsoniter', name: 'jsoniter', version: '0.9.23'
    compile project (':common')
}

mainClassName = 'fr.evywell.robserver.auth.Main'


jar {
    manifest {
        attributes 'Main-Class': 'fr.evywell.robserver.auth.Main'
    }
}

0 голосов
/ 26 сентября 2019

Думаю, проблема в том, что создаваемый вами JAR не включает файлы классов, сгенерированные при компиляции общего модуля.Попробуйте изменить задачу jar модуля authserver, чтобы включить вывод компиляции общего модуля:

jar {
     from project.sourceSets.main.allSource
     from project(":common").sourceSets.main.java.output

     manifest {
        attributes 'Main-Class': 'fr.evywell.robserver.auth.Main'
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...