Java 应用程序以“Spring Boot”启动;“bootRun”;包含Gradle Vaadin插件时导致NoClassDefFoundError

Java 应用程序以“Spring Boot”启动;“bootRun”;包含Gradle Vaadin插件时导致NoClassDefFoundError,java,spring-boot,gradle,multi-module,vaadin8,Java,Spring Boot,Gradle,Multi Module,Vaadin8,我的目标是建立一个简单的多模块项目,使用SpringBoot2、Gradle4.x和Vaadin8.x作为UI。Vaadin目前仅用于其中一个子项目,其他项目提供服务或只是图书馆 我从开始,它(尽管使用了较旧的Gradle语法)产生了一个可以工作的测试项目。它包含一个“libaray”子项目和一个“application”子项目,具体取决于前者。“bootRun”和“bootJar”Gradle任务都非常有效,在我将一些配置集中到父build.grade中之后仍然有效 然后我将端点添加到“应用程

我的目标是建立一个简单的多模块项目,使用SpringBoot2、Gradle4.x和Vaadin8.x作为UI。Vaadin目前仅用于其中一个子项目,其他项目提供服务或只是图书馆

我从开始,它(尽管使用了较旧的Gradle语法)产生了一个可以工作的测试项目。它包含一个“libaray”子项目和一个“application”子项目,具体取决于前者。“bootRun”和“bootJar”Gradle任务都非常有效,在我将一些配置集中到父build.grade中之后仍然有效

然后我将端点添加到“应用程序”项目中,并更改端点以显示一个简单的vaadin标签

问题是,现在当使用“bootRun”时,启动的应用程序不再能够访问它所依赖的“库”中的类。如果我删除代码中的任何依赖项,应用程序就会工作,但只要我引用了“库”(例如“MyService”)中的类,它就会崩溃为“java.lang.ClassNotFoundException”

但是,当使用“bootJar”部署同一个应用程序并运行jar时,一切都正常,因此可以解决模块间的依赖性

现在我想知道我是否缺乏理解,Vaadin Gradle插件是否需要额外/不同的模块依赖配置?或者这可能是Vaadin Gradle插件中的错误,或者是我的配置中的问题

我已经阅读了这个插件的完整文档,但没有得到任何线索,我已经在网上搜索过了,但是我没有在这个特定的上下文中找到“NoClassDefFoundError”,也没有找到Spring Boot和Vaadin 8都可以使用的多模块项目示例

以下是相关示例代码(不包括进口):

hello.app.DemoApplication

@SpringBootApplication(scanBasePackages = "hello")
@RestController
public class DemoApplication {
    //Service defined in dependent sub-project
    private final MyService myService;

    public DemoApplication(MyService myService) {
        this.myService = myService;
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
你好。应用程序。StartUI

/** Entry point for the Vaadin 8 UI */
@SpringUI
@SpringView
public class StartUI extends UI implements View {

    @Override
    protected void init(final VaadinRequest request) {
        setContent(new Label("Hello vaadin"));
    }
}
库渐变属性

应用程序渐变属性

父(根)项目生成。gradle

当然,parent settings.gradle引用子项目

堆栈跟踪(稍微缩短)


进一步信息:我正在Eclipse光子中使用带有Gradle 4.3的Buildship 2.2插件。

我看到了一些东西:

  • 您不是在构建Java库,而是在构建Java web应用程序,所以不要使用“Java库”插件

  • 管理插件的更好策略是使用apply false参数在父项目中注册它们。然后在子项目中正常应用插件。这样,您就可以在一个地方管理所有插件依赖项版本

  • 实现配置相当新,许多插件不支持它(例如gretty)。我会将它们改为使用compile和testCompile

  • Spring依赖关系管理插件非常具有侵入性,并非所有插件都支持它(Gradle Vaadin插件就是其中之一)。我会跳过它,转而使用Gradle的BOM支持


感谢您抽出时间提出建议。您让我高兴极了。现在bootRun又开始工作了。实际问题是我使用了新的“api”和“实现”语法,而不是“编译”(这就是为什么我需要“java库”插件)。切换到编译和“java”插件解决了依赖性问题。看见我还修改了build.gradle文件以使用“spring引导依赖项”BOM,而不使用依赖项管理插件。这花了我一段时间,我在这过程中学到了很多东西——但似乎这与问题无关。
plugins { id "io.spring.dependency-management" version "1.0.5.RELEASE" }
ext { springBootVersion = '2.0.3.RELEASE' }
jar {
    baseName = 'library'
    version = '0.0.1-SNAPSHOT'
}
dependencies {
    implementation('org.springframework.boot:spring-boot-starter')
    testImplementation('org.springframework.boot:spring-boot-starter-test')
}
dependencyManagement {
    imports { mavenBom("org.springframework.boot:spring-boot-dependencies:${springBootVersion}") }
}
plugins {
    id "io.spring.dependency-management" version "1.0.5.RELEASE"
    id "org.springframework.boot" version "2.0.3.RELEASE"
    id 'com.devsoap.plugin.vaadin'version '1.3.1' //Add vaadin support
}
bootJar {
    baseName = 'application'
    version = '0.0.1-SNAPSHOT'
}
dependencies {
    implementation project(':library') // Contains "MyService"
    implementation('org.springframework.boot:spring-boot-starter-actuator')
    implementation('org.springframework.boot:spring-boot-starter-web')
    testImplementation('org.springframework.boot:spring-boot-starter-test')
}
subprojects {
    //Only plugins configured here applied to sub-projects.
    apply plugin: "java-library"
    apply plugin: "eclipse"
    repositories { mavenCentral() } 
    sourceCompatibility = 1.8
}
java.lang.IllegalStateException: Cannot load configuration class: hello.app.DemoApplication
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:414) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanFactory(ConfigurationClassPostProcessor.java:254) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:284) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:128) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:694) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) ~[spring-boot-2.0.3.RELEASE.jar:2.0.3.RELEASE]
    ...
Caused by: java.lang.IllegalStateException: Unable to load cache item
    at org.springframework.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:79) ~[spring-core-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at org.springframework.cglib.core.internal.LoadingCache.get(LoadingCache.java:34) ~[spring-core-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:116) ~[spring-core-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:291) ~[spring-core-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:480) ~[spring-core-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:337) ~[spring-core-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassEnhancer.createClass(ConfigurationClassEnhancer.java:138) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassEnhancer.enhance(ConfigurationClassEnhancer.java:110) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:403) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    ... 12 common frames omitted
Caused by: java.lang.NoClassDefFoundError: hello/service/MyService
    at java.lang.Class.getDeclaredConstructors0(Native Method) ~[na:1.8.0_151]
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671) ~[na:1.8.0_151]
    at java.lang.Class.getDeclaredConstructors(Class.java:2020) ~[na:1.8.0_151]
    at org.springframework.cglib.proxy.Enhancer.generateClass(Enhancer.java:566) ~[spring-core-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    ...
Caused by: java.lang.ClassNotFoundException: hello.service.MyService
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_151]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_151]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) ~[na:1.8.0_151]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_151]
    ... 34 common frames omitted