我的目标是建立一个简单的多模块项目,它使用 Spring Boot 2、Gradle 4.x 和 Vaadin 8.x 作为 UI。Vaadin 目前仅用于其中一个子项目,其他子项目提供服务或只是库。
我从这个非常好的 Spring 教程开始,它(尽管使用了较旧的 Gradle 语法)生成了一个工作测试项目。它包含一个“libaray”子项目和一个“应用程序”子项目,具体取决于前者。“bootRun”和“bootJar”Gradle 任务都像魅力一样工作,并且在我将一些配置集中在父 build.grade 中后仍然有效。
然后我将Vaadin Gradle Plugin添加到“应用程序”项目并更改端点以显示一个简单的 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);
}
}
hello.app.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.properties
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}") }
}
相关分类