使用java-classpath命令执行主类时发生NoClassDefFoundError
我有一个Maven项目,其中有一个使用java-classpath命令执行主类时发生NoClassDefFoundError,java,maven,command-line,Java,Maven,Command Line,我有一个Maven项目,其中有一个Main.java类,它包含我想从Windows命令提示符执行的Main()方法。我正在使用下面的命令执行它,但它失败并显示错误消息(如下所示)。这个程序在IDE中运行良好 stackoverflow的类似问题已列出,但未提供解决方案。它只是详细地解释了这个问题 请导游 执行主类的命令: java -classpath target\jobchain-dataloader.jar com.ebayenterprise.ecp.jobs.Main C:\offi
Main.java
类,它包含我想从Windows命令提示符执行的Main()
方法。我正在使用下面的命令执行它,但它失败并显示错误消息(如下所示)。这个程序在IDE中运行良好
stackoverflow的类似问题已列出,但未提供解决方案。它只是详细地解释了这个问题
请导游
执行主类的命令:
java -classpath target\jobchain-dataloader.jar com.ebayenterprise.ecp.jobs.Main
C:\office-data\v11-Projects\jobchain-dataloader>java -classpath target\jobchain-dataloader.jar com.ebayenterprise.ecp.jobs.Main
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/quartz/ScheduleBuilder
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.privateGetMethodRecursive(Unknown Source)
at java.lang.Class.getMethod0(Unknown Source)
at java.lang.Class.getMethod(Unknown Source)
at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.quartz.ScheduleBuilder
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 7 more
错误日志:
java -classpath target\jobchain-dataloader.jar com.ebayenterprise.ecp.jobs.Main
C:\office-data\v11-Projects\jobchain-dataloader>java -classpath target\jobchain-dataloader.jar com.ebayenterprise.ecp.jobs.Main
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/quartz/ScheduleBuilder
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.privateGetMethodRecursive(Unknown Source)
at java.lang.Class.getMethod0(Unknown Source)
at java.lang.Class.getMethod(Unknown Source)
at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.quartz.ScheduleBuilder
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 7 more
Main.java
package com.ebayenterprise.ecp.jobs;
public class Main {
private static final Logger LOG = Logger.getLogger(Main.class);
public static void main(String[] args) throws SchedulerException {
LOG.debug("Scheduler started sucessfully.....");
//get scheduler instance
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
//get scheduling time details
Properties props = loadProperties("scheduler.properties");
int mins = Integer.parseInt(props.getProperty("mins"));
//kick off job
scheduler.scheduleJob(getJobDetail(RecurringDataLoader.class), getJobTrigger(mins));
}
public static JobDetail getJobDetail(Class z) {
return JobBuilder.newJob(z).withIdentity(RECURRING_DATA_LOADER_JOB, DATA_LOADER_JOB_GRP).build();
}
//create a simple trigger
public static Trigger getJobTrigger(int mins) {
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(RECURRING_DATA_LOADER_TRIGGER, DATA_LOADER_TRIGGER_GRP)
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInMinutes(mins)
.repeatForever())
.build();
return trigger;
}
}
pom.xml
<dependencies>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc7</artifactId>
<version>7.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.2-1004-jdbc41</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
</dependencies>
com.oracle
ojdbc7
7
运行时
org.postgresql
postgresql
9.2-1004-jdbc41
运行时
org.mongodb
mongo java驱动程序
3.1.0
org.quartz-scheduler
石英
2.2.1
org.codehaus.jackson
杰克逊地图绘制者
1.9.13
通过在pom中添加以下插件,可以让程序正常工作
第一个依赖项在jar中创建META-INF/manifest.mf
文件,第二个依赖项在现有target
目录中创建lib
文件夹,并复制其中的所有依赖项
<plugin>
<!-- Build an executable JAR -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.ebayenterprise.ecp.jobs.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<!-- Build an executable JAR with runtime dependencies so that this program can be executed from command line using java -jar command -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
org.apache.maven.plugins
maven jar插件
2.6
真的
解放党/
com.ebayenterprise.ecp.jobs.Main
org.apache.maven.plugins
maven依赖插件
2.10
复制依赖项
包裹
复制依赖项
${project.build.directory}/lib
假的
假的
真的
此链接的可能重复以更详细的方式解释了问题,但未提供解决方案。我已经用下面的解决方案回答了我自己的问题。最新版本与此类似,但仅供参考: