You have lots of *.jar files in

WEB-INF/lib/<lots of .jar files here>

and some .java files in

WEB-INF/src/mypkg/<some .java files here>

This is how to compile the application which requires .jar files from one directory and .java files from another. The generated .class files are placed in WEB-INF/classes/. Rhe compiler creates the packages/directories accordingly.

The class that contains the public static void main method is Main inside the package mypkg. To run the application, it is necessary to load the .class files and all those .jar files.

Compile:

javac -classpath 'WEB-INF/lib/*' WEB-INF/src/mypkg/*.java -d WEB-INF/classes/

Run:

java -classpath 'WEB-INF/lib/*:WEB-INF/classes/' mypkg.Main

To compile, and this is the most important part, note the single quotes to prevent * from being expanded by the shell. javac needs itself to interpret the glob (). You *must prevent the shell from expanding the * and let javac take care of the glob the way it pleases.

To run the application, note that we specified the .jar files path and the .class files path using the -classpath option and separated both directories using :. On windows it would be ;.

The next command line should run a java application, but it is wrong and won’t work. Assume a *nix environment.

java -classpath '/path/to/jarfiles/*:/path/to/classfiles/somepkg/*' somepkg/Main

javac only needs to know the base directory for class files, and the package hierarchy should not be specified at the command line. javac handles the package automatically. We are using

/path/to/classfiles/somepkg/

but it should simply be:

/path/to/classfiles/

The other problem is the glob in /path/to/classfiles/*. That is used only to specify jar files. Again, for class files, javac just needs to know their base directory. It then automatically looks for packages and filenames ending with .class inside that base directory. It recurses through deeper directories as necessary.

A third proplem is somepkg/Main, which should be somepkg.Main.

The correct command is:

java -classpath '/path/to/jarfiles/*:/path/to/classfiles/' somepkg.Main

The directory strcucture is really /proj/somepkg/Main.class, but when running java applications packages (which are directories on the filesystem) are specified using dot notation, not path separator notation. So, if you have

~/proj/pkg1/subpkg/Main.class

You specify this to run the program using the java command:

java pkg1.subpkg.Main

Or, if using other .jar and .class files:

java -classpath 'WEB-INF/lib/*:WEB-INF/classes/' pkg1.subpkg.Main