Notes for Java / javac users.

(I use Java as a better C++ and don't use any of the awt/swing stuff, so I can't help there, sorryStuartYeates)

MakeFile rules

make(1) and Java don't play very well together, because unless you're careful you end up starting a new VirtualMachine for every file you want to compile (see the 'classes' target below for a complete hack). Remember that tabs and spaces get confused when cutting and pasting (see MakeFile).


#make a .class file from a .java file
       $(JAVAC) $(JAVACOPTIONS) $<

# JAVACC stuff

#name/location of javacc executable

#javacc options

# build a java file from a JavaCC file %.jj

# a target that builds all the .java files in sight
       $(JAVAC) $(JAVACOPTIONS) *.java */*.java */*/*.java

Tool support

  1. JavaDoc is your friend.
  2. Ant is your friend.
  3. JavaDeps is your friend.
  4. Eclipse IDE is your friend (supersedes JavaDeps and integrates Ant and JavaDoc)


Sometimes javac/Java complains that it can't find files which are plainly there or complains that they're in the wrong place. This is almost always a classpath or a package interaction problem. If the file is not in a package and is in the current directory:

  1. Check that the current directory is in the classpath
  2. Check whether you need to specific ClassName or
  3. Check spelling. Spelling matters.

If the file is in a package:

  1. Check the above points
  2. Check that the the file is in /some/path/to/a/dircetory/some/package/heirarchy/ and is called ClassName and in /some/package/heirarchy/ package
  3. Check that /some/path/to/a/dircetory/ is in the the classpath
  4. Check that the current directory is not in the classpath
  5. Check the package name again

The public type SomeClassName must be defined in its own file

Check to make sure that the filename of the .java file has the same name as the class inside the file.

How do I run a jar file?

A JAR file (or Java Archive) is a zip file used to distribute a set of compiled Java classes with some associated metadata. It might be just a library, but could also be an application; in that case, you have to run it via the JVM:

java -jar $JAR_FILE