7

我是一名 .NET 开发人员,但对于我当前的项目,我需要使用 Java 项目 Google Caja。哦哦!

我在我的 Windows 机器上遵循了http://code.google.com/p/google-caja/wiki/RunningCaja上的指南,但无法让程序运行。他们建议的命令行不起作用,所以我进入 ant-jars 目录并尝试运行 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

那是怎么回事?

我也试过 file:///d:/java/caja/svn-changes/pristine/ant-jars/test.htm 而不是 test.htm。查看源代码,文件参数似乎是一个 Uri ...

我也尝试过在 pluginc 上运行 IKVM,然后不用担心 java,但这也出现了 ClassDefNotFoundException ......

谢谢!

编辑:感谢大家到目前为止的帮助:) 仍然卡住了。请和我一起坚持,这可能是 .net 开发人员转向漂亮的 OSS 技术的开始!

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

鉴于 build.xml 文件中的代码,有什么方法可以让它运行吗?

4

4 回答 4

11

Java 试图加载 org.apache.commons.cli.ParseException 类,但找不到它。这表明您没有正确设置类路径。

该特定类来自 Apache Commons CLI 库,因此请查看名为 cli.jar 或 commons-cli.jar 之类的 jar。它可能位于单独的lib目录中。如果同一个地方有其他罐子,您可能也需要添加它们。

编辑:查看 build.xml 文件,它使用以下类路径:

  <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>

cp因此,在调用 java.util 时,您需要在参数中包含所有这些 jar 。

编辑#2:正如 Ash 指出的那样,您不能使用-cpwith -jar,因此您还需要将 thepluginc.jar放在类路径上并手动指定主类(so java -cp ...;pluginc.jar com.google.classname -i etc)。让 ant 工作可能比手动完成所有这些工作更容易;)

于 2010-05-19T12:04:56.103 回答
6

另请注意,当您使用该-jar选项时,所有其他 CLASSPATH 设置都将被忽略。看http://java.sun.com/javase/6/docs/technotes/tools/windows/java.html

使用此选项时,JAR 文件是所有用户类的来源,其他用户类路径设置将被忽略。

于 2010-05-19T12:07:00.617 回答
0

尝试这个

java -classpath .;%classpath%; -jar pluginc.jar -i test.htm
于 2010-05-19T12:04:37.017 回答
0

看起来您需要将ApacheCommons库的路径放到您的CLASSPATH中。

于 2010-05-19T12:06:03.783 回答