I have a Maven project and within that I have a Main.java
class that contains the main()
method that I would like to execute from Windows command prompt. I am using the following command to execute it but it fails with an error message (show below). This program works fine from IDE.
Similar question at stackoverflow Why am I getting a NoClassDefFoundError in Java? has been listed but does not provide a solution. It only explain the problem in a detailed manner.
Please guide.
Command to execute main class:
java -classpath target\jobchain-dataloader.jar com.ebayenterprise.ecp.jobs.Main
Error Log:
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>
Was able to get the program working by adding following plugins in the pom.
The first dependency creates the
META-INF/manifest.mf
file in the jar and the second one creates thelib
folder in the existingtarget
directory and copies all the dependencies in there.