java - 使用 Spring Boot 从 Gradle 多模块项目构建的 Jar 不起作用
问题描述
我创建了 spring-boot gradle 多模块项目,它由 3 个模块组成:控制器、服务、存储库。主文件位于 Controller-module 中并命名为 MySpringBootApplication。
我可以构建这个项目(使用 gradle build)并且可以获得 jar 文件。但是在命令行中启动这个 jar 之后,我遇到了下一个错误:
Error: Could not find or load main class com.epam.esm.config.MySpringBootApplication Caused by: java.lang.ClassNotFoundException: com.epam.esm.config.MySpringBootApplication.
为了修复这个错误,我在 main的MANIFEST.MFMain-Class
文件中添加了属性,但这个操作没有帮助。那么有人可以帮忙吗?build.gradle
主构建.gradle 文件
plugins {
id 'java'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'org.springframework.boot' version '2.4.3'
id 'application'
}
group = 'com.myproject'
version = 'snapshot-1.0.0'
repositories {
mavenCentral()
}
bootJar {
enabled = false
}
jar {
enabled = true
manifest {
attributes(
"Main-Class": "com.myproject.config.MySpringBootApplication")
}
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-parent', version: '2.4.3', ext: 'pom'
}
test {
useJUnitPlatform()
}
subprojects {
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'java'
group = 'com.epam.esm'
version = '1.0.0'
repositories {
mavenCentral()
}
bootJar {
enabled = false
}
jar {
enabled = true
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-hateoas'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-security'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation group: 'org.hibernate', name: 'hibernate-envers', version: '5.4.27.Final'
implementation group: 'javax.validation', name: 'validation-api', version: '2.0.1.Final'
implementation group: 'org.openidentityplatform.commons', name: 'json-web-token', version: '2.0.11'
compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.18'
annotationProcessor 'org.projectlombok:lombok'
implementation group: 'io.jsonwebtoken', name: 'jjwt', version: '0.9.1'
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-parent', version: '2.4.3', ext: 'pom'
}
test {
useJUnitPlatform()
}
}
设置.gradle
rootProject.name = 'module'
include('repository', 'service', 'controller')
解决方案
Spring Boot应用程序的可执行jar 文件是由bootJar
任务构建的,因此添加主类信息jar
也不起作用。
该
bootJar
任务尝试创建一个可执行的 jar,这需要一个 main() 方法。因此,您只需要禁用该bootJar
任务并启用 jar 任务(创建一个普通的 jar 而不是一个可执行的 jar)只为您没有可执行的 jar 模块。
由于您在subprojects
部分下进行了操作,因此该controller
模块也将生成一个标准jar。您可以为所有模块生成标准jarcontroller
,但不包括模块,如下所示:
subprojects {
if (it.name != 'controller') {
bootJar {
enabled = false
}
jar {
enabled = true
}
}
}
此外,您必须删除以下jar
部分
jar {
enabled = true
manifest {
attributes(
"Main-Class": "com.myproject.config.MySpringBootApplication")
}
}
并更换
bootJar {
enabled = false
}
和
bootJar {
mainClassName = 'com.myproject.config.MySpringBootApplication'
}
参考
推荐阅读
- audio - 用于无损操作(例如剪切、淡入淡出)的 DAW 音频插件开发
- android - 如何将整个 TextView(不是其中的文本)对齐到父级的右侧
- c++ - 人们如何在异常退出之前释放所有内存?
- javascript - Node JS mysql循环查询推送到数组
- c# - c# 如何使用 ObjectSerializer 将字符串转换为布尔值
- wpf - 根据其他单元格值的值更改 WPF Gridcell 的单元格格式
- reactjs - 使用材质 UI 在表格上创建标题行
- blazor - 如何确保使用@bind- 设置组件参数?
- php - 使用带有标头的 GuzzleHttp 的正确方法
- sql - 获取 SQL 中列的总和 - 列不是直接来自表,而是已计算