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)); } }
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.
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.
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 ;
.
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.”
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With