wheaties
wheaties

Reputation: 35970

Running Java program from Python

I've looked here, here, here, and here.

While informative they just didn't quite have enough for me to discover the root of my problem. My code isn't contained within a JAR file and the customer has requested we do not ship it as such.

I built the application in Eclipse and from there it runs fine. I've set up a script that will modify the main method of one of the java files for testing purposes. I want to run the application using a call from Python after I modify it. However, from the command line when I attempt to call the program using java or java -cp . I get the following error:

Exception in thread "main" java.lang.NoClassDefFoundError: DemoAPIFunctionality
Caused by: java.lang.ClassNotFoundException: DemoAPIFunctionality
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    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)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: DemoAPIFunctionality.  Program will exit.

My project depends on several JARs, which are not within the root directory, and a DLL file, again not in the root directory. I'm hoping it's related to the location of one of those but I'm not sure and am making little headway. Here is DemoAPIFunctionality.java:

public class DemoAPIFunctionality
{
  public final static void main(String[] args)
  {
    DemoAPIFunctionality demo = new DemoAPIFunctionality();

I'd happily list any more information if it will help you help me. (No, I'm not a sports agent.) What do I need to do to get it to work at least from the command line?

Thanks in advance.

Upvotes: 4

Views: 6094

Answers (3)

kalegs
kalegs

Reputation: 31

Easy workaround, hint and shortcut. Dont use any path when calling java classname from within python. eg. commands.getstatusoutput("java -cp $CLASSPATH clusterize")

Upvotes: 3

Andreas Dolk
Andreas Dolk

Reputation: 114767

You didn't mention that your python script actually compiles the java source file after applying the edits.

Eclipse will compile it automatically (build-in builder) but of course, outside of the IDE you have to call javac before you can execute the class. java will not work on source files.

EDIT

I don't know you actual experience in java - but that's how it usually works on the command line.

Assuming, you have a java class com.example.Hello with a main method and a file structure like

/dev/bin/com/example/Hello.class

then you cd to /dev/bin and do a java com.example.Hello. Note that the package name (com.example) is always mapped to a folder structure (com/example). If you do the above command and java can't find Hello.class in the folder ./com/example, then it will throw the NoClassDefFoundError.

Upvotes: 3

Bozho
Bozho

Reputation: 597036

  1. having classes in the default package (i.e. no package) is discouraged
  2. you must call java -cp . from the root directory of your project - i.e. the directory where your .class file resides, or when you create packages, the directory, where the com (org, etc) subdirectory resides.
  3. you must refer to the class by it full qualified name - i.e. com.package.ClassName
  4. you'd better use an IDE - for educational purposes there's BlueJ and JCreator. Eclipse and NetBeans are more powerful and complex.

Upvotes: 4

Related Questions