我正在尝试构建一个可执行 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。
我用我的提案创建了一个 PR:https://github.com/qnguba/testGradle1/pull/1/files
我也尝试解释一下Readme.md文件中的配置。
据我了解,您的项目 SpringBoot 应用程序是 main 子项目的一部分。它应该像这样配置和处理(除非我错过了您非常不寻常的要求)。恕我直言,您应该在设置项目时遵循标准约定。 Jar 文件将在
code/main/build/libs
文件夹中创建,您应该从那里运行它。
按照 SpringBoot Gradle 插件文档中的说明在子项目中配置主类:https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/#packaging-executable.configuring。主班
构建您的项目:
./gradlew clean build
执行主子项目的启动jar文件:
java -jar code/main/build/libs/main-1.0-SNAPSHOT.jar