Can't get java progam to run! NoClassDefFoundError?
Asked Answered
A

4

7

I'm a .NET developer, but for my current project I need to use Google Caja, a Java project. Uh-oh!

I've followed the guide at http://code.google.com/p/google-caja/wiki/RunningCaja on my windows machine, but can't get the program to run. The command line they suggest didn't work, so I cd'd into the ant-jars directory and tried to run plugin.jar:

D:\java\caja\svn-changes\pristine\ant-jars>java -cp . -jar pluginc.jar -i test.htm
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/cli/ParseException
        at com.google.caja.plugin.PluginCompilerMain.<init>(PluginCompilerMain.java:78)
        at com.google.caja.plugin.PluginCompilerMain.main(PluginCompilerMain.java:368)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.cli.ParseException
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        ... 2 more

Whats that all about?

I've also tried file:///d:/java/caja/svn-changes/pristine/ant-jars/test.htm instead of test.htm. Looking at the source, it seems the file param is a Uri...

I've also tried running IKVM on pluginc and then not worrying about java, but that came up with the ClassDefNotFoundException too...

thanks!

edit: thanks everyone for the help so far :) still stuck. please persevere with me, this might be the start of a .net developer switching to beautiful OSS technologies!

d:\java\caja\svn-changes\pristine\ant-jars>java -cp .\*.* com.google.caja.plugin.PluginCompilerMain 
=> NoClassDefFoundError: /\commons-cli/jar

D:\java\caja\svn-changes\pristine\ant-jars>java -cp .\*.*;..\third_party\java\jakarta_commons\*.* com.google.caja.plugin.PluginCompilerMain
=> Could not find the main class: com.google.caja.plugin.PluginCompilerMain

Is there some way I can get it to run given the code in the build.xml file?

Amphora answered 19/5, 2010 at 11:55 Comment(0)
D
11

Java's trying to load the org.apache.commons.cli.ParseException class, but it can't find it. This suggests you're not setting the classpath properly.

That particular class comes from the Apache Commons CLI library, so have a look around for a jar named something like cli.jar or commons-cli.jar. It may be in a separate lib directory. If there are other jars in the same place, you'll probably need to add them, too.

Edit: looking at the build.xml file, it uses the following classpath:

  <path id="classpath.web">
    <pathelement path="${third_party}/java/jsdk2.1/servlet.jar"/>
    <pathelement path="${third_party}/java/jaf/activation.jar"/>
    <pathelement path="${third_party}/java/javamail/mail.jar"/>
    <pathelement path="${third_party}/java/jetty/lib/jetty.jar"/>
    <pathelement path="${third_party}/java/jetty/lib/jetty-util.jar"/>
  </path>
  <path id="classpath.compile">
    <path refid="classpath.web"/>
    <pathelement path="${third_party}/java/jakarta_commons/commons-cli.jar"/>
    <pathelement path="${third_party}/java/json_simple/json_simple.jar"/>
    <pathelement path="${third_party}/java/rhino/js.jar"/>
    <pathelement path="${third_party}/java/xerces/xercesImpl.jar"/>
    <pathelement path="${jars}/htmlparser.jar"/>
  </path>
  <path id="classpath.run">
    <pathelement path="${lib}"/>
    <path refid="classpath.compile"/>
  </path>

So you'll need to include all of those jars in the cp argument when calling java.

Edit #2: As Ash pointed out, you can't use -cp with -jar, so you'll need to put the pluginc.jar on the classpath as well and manually specify the main class (so java -cp ...;pluginc.jar com.google.classname -i etc). It'd probably be easier to get ant working than to do all of this manually ;)

Dropper answered 19/5, 2010 at 12:4 Comment(6)
running ant is ok to compile everything. can I use the ant script to run com.google.caja.plugin.PluginCompilerMain.main?Amphora
@Amphora - if you have ant working, then ant jars should dump all of the jars in one directory for you. You can then use -cp dir/* to include them all (where dir is whatever directory it's putting them in), which'll simplify things quite a lot.Dropper
That particularly class commons from the Apache Commons CLI library. Blub? Didn't you mean to say That particular class comes from the Apache Commons CLI library ? :)Viand
@chris - it already has an ant-jars folder with all the jar files in it. nonetheless running 'java -cp ./* com.google.caja.plugin.PluginCompilerMain' throws "Could not find the main class: ./commons-cli.jar"Amphora
@Amphora - it sounds like your prompt/shell is expanding the *, rather than passing it to Java. I've not touched a windows command prompt in a while, but maybe try putting it in quotes? (e.g., java -cp ".\*" com.google...)Dropper
For an added bonus, running Windows Java under Cygwin requires: java -cp 'commons-cli-1.4.jar;Parser.jar' com.ef.ParserJany
D
6

Also note that when you use the -jar option, all other CLASSPATH settings are ignored. See http://java.sun.com/javase/6/docs/technotes/tools/windows/java.html:

When you use this option, the JAR file is the source of all user classes, and other user class path settings are ignored.

Damales answered 19/5, 2010 at 12:7 Comment(0)
C
0

Try this

java -classpath .;%classpath%; -jar pluginc.jar -i test.htm
Cameroncameroon answered 19/5, 2010 at 12:4 Comment(3)
I dont think I have a %classpath% - all the docs I read while setting this up suggested that it causes problems to set one up?Amphora
This is not going to work; the -classpath option is ignored when you use the -jar option, as Ash explained.Fetishist
Set classpath in the manifest of your jar using Class-Path: attribute. Syntax will be Class-Path: [jar 1] [jar 2]...Cameroncameroon
S
0

Looks like you need to put the path to ApacheCommons library to your CLASSPATH.

Sandpaper answered 19/5, 2010 at 12:6 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.