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?
lang. NoClassDefFoundError, which means the Class Loader file responsible for dynamically loading classes can not find the . class file. So to remove this error, you should set your classpath to the location where your Class Loader is present.
1) The class is not available in Java Classpath. 2) You might be running your program using the jar command and class was not defined in the manifest file's ClassPath attribute. 3) Any start-up script is an overriding Classpath environment variable. 4) Because NoClassDefFoundError is a subclass of java.
To resolve module dependency, we use the module path. However, adding external jars in the module path does not make them available for the class loader. Hence the class loader considers them as missing dependencies and throws the NoClassDefFoundError.
In the case of NoClassDefFoundError, the class was present at compile time, but Java runtime could not find it in Java classpath during runtime.
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 ;)
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.
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