Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error: Could not find or load main class [duplicate]

Tags:

java

linux

I am having trouble compiling and running my Java code, intended to allow me to interface Java with a shared object for Vensim, a simulation modeling package.

The following code compiles without error:

javac -d . -cp ./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel.java     VensimHelper.java VensimException.java VensimContextRepository.java 

However, when I try to run the following:

java -cp ./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars 

I get the following error: "Error: Could not find or load main class SpatialModel ". My SpatialModel.java code does contain a 'main' method (below), so I'm not sure what the problem is - can anyone please help me out? Thanks.

import java.io.File; import java.text.NumberFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.List;  import org.apache.log4j.Logger;  public class SpatialModel {      private VensimHelper vh;      public static final String DLL_LIBNAME_PARAM = "vensim_lib_nam";      public static final String MODEL_PATH_PARAM = "vensim_model_path";      private final static int VENSIM_CONTEXT_CREATION_MAX_FAILURE_COUNT = 10;      public SpatialModel() throws SpatialException {          String libName = System.getProperty(DLL_LIBNAME_PARAM);         String modelPath = System.getProperty(MODEL_PATH_PARAM);                  if(libName == null || libName.trim().equals("")) {             log.error("Vensim library name has to be set with -D" + DLL_LIBNAME_PARAM);             throw new SpatialException("Vensim library name has to be set with -D" + DLL_LIBNAME_PARAM);         }          if(modelPath == null || modelPath.trim().equals("")) {             log.error("Model path has to set with -D" + MODEL_PATH_PARAM);             throw new SpatialException("Model path ahs to be set with -D" + MODEL_PATH_PARAM);         }          for (int i = 0; i < VENSIM_CONTEXT_CREATION_MAX_FAILURE_COUNT && vh == null; i++) {             try {                 log.info("creating new vensim helper\n\tdll lib: " + libName + "\n\tmodel path: " + modelPath);                 vh = new VensimHelper(libName, modelPath);             } catch (Throwable e) {                 log.error("An exception was thrown when initializing Vensim, try: " + i, e);             }         }         if (vh == null) {             throw new SpatialException("Can't initialize Vensim");         }      }      public static void main(String[] args) throws VensimException {          long before = System.currentTimeMillis();            String libName = System.getProperty(DLL_LIBNAME_PARAM);         String modelPath = System.getProperty(MODEL_PATH_PARAM);          if (libName == null) {             libName = "libvensim";         }         if(modelPath == null) {             modelPath = "~/BassModel.vmf";         }          System.setProperty(DLL_LIBNAME_PARAM, libName);         System.setProperty(MODEL_PATH_PARAM, modelPath);          if (args.length > 0 && args[0].equals("info")) {             System.out.println(new VensimHelper(libName, modelPath).getVensimInfo());         } else if (args.length > 0 && args[0].equals("vars")) {             VensimHelper helper = new VensimHelper(libName, modelPath);             String[] vars = helper.getVariables();             for (String var : vars) {                 System.out.println(helper.getVariableInfo(var));             }         } else {              File f = new File(".");             System.out.println(f.getAbsolutePath());              SpatialModel sm = new SpatialModel();         }          System.out.println("Execution time: " + (System.currentTimeMillis() - before));     }  } 
like image 403
Dave Avatar asked Sep 20 '11 13:09

Dave


People also ask

What is the error could not find or load main class in Java?

When you get the message "Could not find or load main class ...", that means that the first step has failed. The java command was not able to find the class. And indeed, the "..." in the message will be the fully qualified class name that java is looking for.

Could not find the main class program will exit?

There are two ways to do it: Reinstall the new JRE. It should then fix the file association in the OS. Fix the file association manually.


2 Answers

You must ensure that you add the location of your .class file to your classpath. So, if its in the current folder, add . to your classpath. Note that the Windows classpath separator is a semi-colon, i.e. a ;.

like image 146
Saket Avatar answered Sep 17 '22 15:09

Saket


If the class is in a package

package thepackagename;  public class TheClassName {   public static final void main(String[] cmd_lineParams)  {      System.out.println("Hello World!");   }  } 

Then calling:

java -classpath . TheClassName 

results in Error: Could not find or load main class TheClassName. This is because it must be called with its fully-qualified name:

java -classpath . thepackagename.TheClassName 

And this thepackagename directory must exist in the classpath. In this example, ., meaning the current directory, is the entirety of classpath. Therefore this particular example must be called from the directory in which thepackagename exists.

To be clear, the name of this class is not TheClassName, It's thepackagename.TheClassName. Attempting to execute TheClassName does not work, because no class having that name exists. Not on the current classpath anyway.

Finally, note that the compiled (.class) version is executed, not the source code (.java) version. Hence “CLASSPATH.”

like image 28
aliteralmind Avatar answered Sep 19 '22 15:09

aliteralmind