2010-05-19 3 views
6

Je suis un développeur .NET, mais pour mon projet actuel, je dois utiliser Google Caja, un projet Java. Euh-oh!Impossible d'exécuter java progam! NoClassDefFoundError?

J'ai suivi le guide au http://code.google.com/p/google-caja/wiki/RunningCaja sur ma machine Windows, mais je n'arrive pas à lancer le programme. La ligne de commande qu'ils suggèrent ne fonctionnait pas, donc je cd'd dans le répertoire de fourmis jarres et a essayé de courir 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 

Quoi que tout au sujet?

J'ai aussi essayé file: /// d: /java/caja/svn-changes/pristine/ant-jars/test.htm au lieu de test.htm. En regardant la source, il semble que le fichier est un Uri param ...

J'ai aussi essayé de courir IKVM sur pluginc et puis ne pas se soucier de java, mais qui est venu avec le ClassDefNotFoundException aussi ...

merci!

edit: merci à tous pour l'aide jusqu'ici :) toujours coincé. persévérez avec moi, cela pourrait être le début d'un développeur .net passer à de belles technologies 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 

Y at-il un moyen de l'exécuter en raison du code dans le fichier build.xml?

Répondre

10

Java essaie de charger la classe org.apache.commons.cli.ParseException, mais il ne peut pas le trouver. Cela suggère que vous ne définissez pas le chemin de classe correctement.

Cette classe particulière provient de la bibliothèque Apache Commons CLI, alors jetez un coup d'œil autour d'un jar nommé quelque chose comme cli.jar ou commons-cli.jar. Il peut être dans un répertoire séparé lib. S'il y a d'autres jarres au même endroit, vous aurez probablement besoin de les ajouter aussi.

Edit: regarder le fichier build.xml, il utilise le classpath suivant:

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

Ainsi, vous aurez besoin d'inclure tous ces pots dans l'argument cp lorsque vous appelez java.

Edit # 2: Comme Ash a souligné, vous ne pouvez pas utiliser -cp avec -jar, vous aurez donc besoin de mettre le pluginc.jar sur le classpath et spécifier manuellement la classe principale (si java -cp ...;pluginc.jar com.google.classname -i etc). Il serait probablement plus facile de faire fonctionner la fourmi que de faire tout cela manuellement;)

+0

Ant est OK pour tout compiler. puis-je utiliser le script ant pour exécuter com.google.caja.plugin.PluginCompilerMain.main? – mcintyre321

+1

+1 Bon résumé des problèmes ici – Ash

+0

@ mcintyre321 - Si vous avez une fourmi qui fonctionne, alors 'ant jars' devrait vider tous les jars dans un répertoire pour vous. Vous pouvez ensuite utiliser '-cp dir/*' pour les inclure tous (où 'dir' est le répertoire dans lequel ils sont placés), ce qui simplifiera beaucoup les choses. – Chris

0

Essayez cette

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

Je ne pense pas avoir un% classpath% - tous les documents que j'ai lus lors de la configuration suggèrent que cela crée des problèmes pour en créer un? – mcintyre321

+1

Cela ne va pas fonctionner; l'option '-classpath' est ignorée lorsque vous utilisez l'option' -jar', comme l'explique Ash. – Jesper

+0

Définissez le classpath dans le manifeste de votre jar en utilisant l'attribut Class-Path:. Syntaxe sera Class-Path: [jar 1] [jar 2] ... –

6

Notez également que lorsque vous utilisez l'option -jar, tous les autres paramètres CLASSPATH sont ignorés. Voir http://java.sun.com/javase/6/docs/technotes/tools/windows/java.html:

Lorsque vous utilisez cette option, le fichier JAR est la source de toutes les classes d'utilisateurs et d'autres paramètres de chemin de classe d'utilisateur sont ignorées.

Questions connexes