从 gradle 多项目构建 spring boot 应用程序的可执行 jar

问题描述 投票:0回答:1

我正在尝试构建一个可执行 jar 来运行我的 Spring 应用程序。 我在这里上传了一个 MWE:https://github.com/qnguba/testGradle1(请注意,MWE 仅包含“code”文件夹中的子项目“main”)

父 build.gradle 看起来像这样:

plugins {
    id 'org.springframework.boot' version '3.2.1'
    id 'io.spring.dependency-management' version '1.1.4'
    id 'java'
}

apply plugin: 'io.spring.dependency-management'
apply plugin: 'application'


group = 'org.example'
version = '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web')
}

tasks.test {
    useJUnitPlatform()
}

bootJar {
    manifest {
        attributes(
                'Class-Path': configurations.runtimeClasspath.files.collect { it.getName() }.join(' '),
                'Main-Class': 'org.example.Main'
        )
    }
}
sourceSets {
    main {
        java {
            srcDirs = ['./code/main/src/main/java']
        }
    }
}

子项目build.gradle如下所示:

plugins {
    id 'org.springframework.boot' version '3.2.1'
    id 'io.spring.dependency-management' version '1.1.4'
    id 'java'
}

apply plugin: 'io.spring.dependency-management'


group = 'org.example'
version = '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}
test {
    useJUnitPlatform()
}

gradle.taskGraph.whenReady {
    tasks.withType(JavaExec) {
        if (name.endsWith(".main()")) {
            println("Setting executable to java launcher for ${name}")
            it.setExecutable(javaLauncher.get().executablePath.asFile.absolutePath)
        }
    }
}

dependencies {

    implementation('org.springframework.boot:spring-boot-starter-web')
}

Main.java 看起来像这样:

package org.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(scanBasePackages = "org.example")
public class Main {

    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

当我运行 gradle jar 或 gradle bootJar 任务时,我得到一个可执行 jar,但当我执行它时,出现以下错误:

java -jar testGradle-1.0-SNAPSHOT.jar 
Error: Could not find or load main class org.example.Main
Caused by: java.lang.ClassNotFoundException: org.example.Main

我添加了sourceSets以使bootJar的构建最终编译,但我不确定这是否从jar文件中排除了spring。

java spring-boot gradle executable-jar multi-project
1个回答
0
投票

我用我的提案创建了一个 PR:https://github.com/qnguba/testGradle1/pull/1/files

我也尝试解释一下Readme.md文件中的配置。

据我了解,您的项目 SpringBoot 应用程序是 main 子项目的一部分。它应该像这样配置和处理(除非我错过了您非常不寻常的要求)。恕我直言,您应该在设置项目时遵循标准约定。 Jar 文件将在

code/main/build/libs
文件夹中创建,您应该从那里运行它。

  1. 按照 SpringBoot Gradle 插件文档中的说明在子项目中配置主类:https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/#packaging-executable.configuring。主班

  2. 构建您的项目:

    ./gradlew clean build

  3. 执行主子项目的启动jar文件:

    java -jar code/main/build/libs/main-1.0-SNAPSHOT.jar

© www.soinside.com 2019 - 2024. All rights reserved.