(带有 Log4j2 的 Springboot Gradle,可执行 Jar)无法找到或加载主类

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

当我使用

java -jar .\QuartzScheduler-0.0.1-SNAPSHOT.jar

执行 jar 时遇到以下错误
Error: Could not find or load main class com.quartz.QuartzSchedulerApplication
Caused by: java.lang.ClassNotFoundException: com.quartz.QuartzSchedulerApplication

这是我的 build.gradle 的一个片段,请帮助阐明这一点。

build.gradle

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

group = 'com.quartz'
version = '0.0.1-SNAPSHOT'

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-quartz'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-jdbc:2.4.1'
    implementation 'org.apache.logging.log4j:log4j-api:2.20.0'
    implementation 'org.apache.logging.log4j:log4j-core:2.20.0'
    implementation 'org.apache.logging.log4j:log4j-slf4j-impl:2.20.0'
    implementation files('C:\\Program Files\\Microsoft JDBC DRIVER 12.6 for SQL Server\\sqljdbc_12.6\\enu\\jars\\mssql-jdbc-12.6.3.jre11.jar')
    runtimeOnly 'com.microsoft.sqlserver:mssql-jdbc'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.withType(Jar) {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE

    manifest {
        attributes["Main-Class"] = "com.quartz.QuartzSchedulerApplication"
    }
}

jar {
    enabled = true
    archiveClassifier = ''

    manifest {
        attributes 'Main-Class' : "com.quartz.QuartzSchedulerApplication"
    }

    from {
        configurations.runtimeClasspath.collect {it.isDirectory() ? it : zipTree(it)}
    }
}

tasks.named('test') {
    useJUnitPlatform()
}

QuartzSchedulerApplication.class

package com.quartz;

import com.quartz.info.TriggerInfo;
import com.quartz.jobs.HelloWorldJob;
import com.quartz.services.SchedulerService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class QuartzSchedulerApplication {

    private static final Logger LOG = LogManager.getLogger(QuartzSchedulerApplication.class);

    private final SchedulerService scheduler;

    @Autowired
    public QuartzSchedulerApplication(SchedulerService scheduler) {
        this.scheduler = scheduler;
    }

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

    public void scheduleJobs() {
        final TriggerInfo info = new TriggerInfo();

        info.setCronExp("5 0/1 * * * ?"); // Run every min, at 5th second
        info.setCallbackData("HelloWorldJob");
        scheduler.schedule(HelloWorldJob.class, info);
        LOG.debug("test");
    }
}


我开始使用 Log4j 构建我的 Quartz 项目,并且取得了成功。 另外,我验证了 jar 文件包含我的主类,并且清单文件也存在。当我使用 bootJar 运行应用程序时,它也成功了。 我还尝试使用 java -cp .\QuartzScheduler-0.0.1-SNAPSHOT.jar com.quartz.QuartzSchedulerApplication 执行 jar 文件。 不确定是否是由于 JDBC 的实现所致。

抱歉,我没有在我的问题中添加Log4j2的要求。虽然我可以通过删除 jar 任务和 jar 任务配置来执行我的 jar 文件,但我的 Log4j2 日志记录不再起作用。我知道这一点是因为我隔离了我的应用程序,与上面相同,只是没有 JDBC 并且日志记录工作正常。有什么建议吗?

spring-boot jdbc build.gradle log4j2 executable-jar
1个回答
1
投票

问题出在你的构建文件上。您正在处理 Gradle Spring Boot 插件所做的工作。接下来,您混合来自不同 Spring Boot 版本的模块也永远不会这样做。

解决方案非常简单,简化/清理你的

build.gradle

  1. spring-boot-starter-jdbc
  2. 中删除版本
  3. 删除
    jar
    任务和
    jar
    任务配置。
  4. 删除重复的
    mssql-jdbc
    依赖项(删除文件一个)
plugins {
    id 'java'
    id 'org.springframework.boot' version '3.3.1'
    id 'io.spring.dependency-management' version '1.1.5'
}

group = 'com.quartz'
version = '0.0.1-SNAPSHOT'

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-quartz'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    implementation 'org.apache.logging.log4j:log4j-api:2.20.0'
    implementation 'org.apache.logging.log4j:log4j-core:2.20.0'
    implementation 'org.apache.logging.log4j:log4j-slf4j-impl:2.20.0'
    runtimeOnly 'com.microsoft.sqlserver:mssql-jdbc'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
    useJUnitPlatform()
}

现在只需像平常一样使用

./gradlew build
构建您的 jar,Spring Boot 会自动为您创建一个可以使用
java -jar QuartzScheduler-0.0.1-SNAPSHOT.jar
运行的 jar。

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