首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Spring从Gradle多模块项目构建的Jar无法工作

用Spring从Gradle多模块项目构建的Jar无法工作
EN

Stack Overflow用户
提问于 2021-05-13 11:38:26
回答 1查看 2.8K关注 0票数 2

我创建了一个由控制器、服务、存储库三个模块组成的弹簧引导级多模块项目.主文件位于控制器模块中,命名为MySpringBootApplication.

我可以构建这个项目(使用gradle构建)并获得jar文件。但是,在命令行中启动这个jar之后,我接受了下一个错误:

代码语言:javascript
复制
Error: Could not find or load main class com.epam.esm.config.MySpringBootApplication Caused by: java.lang.ClassNotFoundException: com.epam.esm.config.MySpringBootApplication.

为了修复这个错误,我将Main-Class属性添加到主build.gradle中的MANIFEST.MF文件中,但是这个操作没有帮助。有人能帮忙吗?

主BUILD.GRADLE文件

代码语言:javascript
复制
        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()
            }
        }

SETTINGS.GRADLE

代码语言:javascript
复制
    rootProject.name = 'module'
    include('repository', 'service', 'controller')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-13 13:19:05

Spring应用程序可执行的jar文件是由bootJar任务构建的,因此通过jar添加主类信息也是行不通的。

bootJar任务尝试创建一个可执行的jar,这需要一个main()方法。因此,您需要禁用bootJar任务,并且只为没有可执行的jar模块启用jar任务(它创建一个普通jar而不是可执行jar)。

由于您是在subprojects部分下完成的,所以controller模块也将生成一个标准jar。您可以为所有模块生成标准jars,但不包括controller模块,如下所示:

代码语言:javascript
复制
subprojects {
    
    if (it.name != 'controller') {
        bootJar {
            enabled = false
        }

        jar {
            enabled = true
        }
    }
}    

此外,您还必须删除下面的jar部分

代码语言:javascript
复制
 jar {
        enabled = true
        manifest {
            attributes(
                    "Main-Class": "com.myproject.config.MySpringBootApplication")
        }
    }

并替换

代码语言:javascript
复制
bootJar {
    enabled = false
}

使用

代码语言:javascript
复制
    bootJar {
        mainClassName = 'com.myproject.config.MySpringBootApplication'
    }

参考文献

创建多模块项目

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67518597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档