当我使用
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 并且日志记录工作正常。有什么建议吗?
问题出在你的构建文件上。您正在处理 Gradle Spring Boot 插件所做的工作。接下来,您混合来自不同 Spring Boot 版本的模块也永远不会这样做。
解决方案非常简单,简化/清理你的
build.gradle
。
spring-boot-starter-jdbc
jar
任务和 jar
任务配置。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。