Не могу запустить Java-программу! NoClassDefFoundError? - PullRequest
7 голосов
/ 19 мая 2010

Я разработчик .NET, но для моего текущего проекта мне нужно использовать Google Caja, Java-проект. Ой-ой!

Я следовал инструкциям на http://code.google.com/p/google-caja/wiki/RunningCaja на моем компьютере с Windows, но не могу запустить программу. Предлагаемая ими командная строка не работает, поэтому я перешел в каталог 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

О чем это все?

Я также попробовал файл: /// d: /java/caja/svn-changes/pristine/ant-jars/test.htm вместо test.htm. Глядя на источник, кажется, что файл param является Uri ...

Я также пытался запустить IKVM на плагине, а затем не беспокоиться о Java, но это тоже привело к исключению ClassDefNotFoundException ...

спасибо!

edit: спасибо всем за помощь до сих пор :) все еще застрял. Пожалуйста, продолжайте со мной, это может быть началом перехода разработчика .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 ]

11 голосов
/ 19 мая 2010

Java пытается загрузить класс org.apache.commons.cli.ParseException, но не может его найти. Это говорит о том, что вы неправильно устанавливаете путь к классам.

Этот конкретный класс происходит из библиотеки CLI Apache Commons, так что посмотрите на jar с именем что-то вроде cli.jar или commons-cli.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>

Так что вам нужно будет включить все эти jar в аргумент cp при вызове java.

Редактирование # 2: Как заметил Эш, вы не можете использовать -cp с -jar, поэтому вам нужно также поместить pluginc.jar в путь к классам и вручную указать основной класс (поэтому 1015 *). Вероятно, было бы легче заставить муравья работать, чем делать все это вручную;)

6 голосов
/ 19 мая 2010

Также обратите внимание, что при использовании опции -jar все остальные настройки CLASSPATH игнорируются. См http://java.sun.com/javase/6/docs/technotes/tools/windows/java.html:

Когда вы используете эту опцию, файл JAR является источником всех пользовательских классов, а другие параметры пути к классам пользователей игнорируются.

0 голосов
/ 19 мая 2010

Похоже, вам нужно указать путь к ApacheCommons библиотеке вашей CLASSPATH .

0 голосов
/ 19 мая 2010

Попробуйте это

java -classpath .;%classpath%; -jar pluginc.jar -i test.htm
...