2010-05-19 17 views
6

Sono uno sviluppatore .NET, ma per il mio progetto corrente ho bisogno di utilizzare Google Caja, un progetto Java. Uh Oh!Impossibile avviare java progam! NoClassDefFoundError?

Ho seguito la guida su http://code.google.com/p/google-caja/wiki/RunningCaja sul mio computer Windows, ma non riesco a far funzionare il programma. La riga di comando che suggeriscono non ha funzionato, così ho cd'd nella directory formica-giare e ha cercato di correre 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 

Che cosa significa tutto questo?

Ho anche provato il file: /// d: /java/caja/svn-changes/pristine/ant-jars/test.htm invece di test.htm. Guardando alla fonte, sembra che il file param è un Uri ...

Ho anche provato in esecuzione su IKVM pluginc e poi non preoccuparsi di Java, ma che si avvicinò con la ClassDefNotFoundException troppo ...

grazie!

modifica: grazie a tutti per l'aiuto finora :) ancora bloccato. per favore perseverare con me, questo potrebbe essere l'inizio di uno sviluppatore .net che passa alle bellissime tecnologie 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 

C'è un modo per eseguirlo dato il codice nel file build.xml?

risposta

10

Java sta cercando di caricare la classe org.apache.commons.cli.ParseException, ma non riesco a trovarlo. Questo suggerisce che non stai impostando correttamente il classpath.

Questa particolare classe proviene dalla libreria CLI di Apache Commons, quindi dai un'occhiata a un vaso chiamato qualcosa come cli.jar o commons-cli.jar. Potrebbe trovarsi in una directory separata lib. Se ci sono altri barattoli nello stesso posto, probabilmente dovrai aggiungerli anche tu.

Edit: guardando il file build.xml, utilizza il seguente percorso di classe:

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

Quindi è necessario includere tutti quei vasi nell'argomento cp quando si chiama Java.

Edit # 2: Come Ash ha sottolineato, non è possibile utilizzare -cp con -jar, quindi è necessario mettere il pluginc.jar nel classpath come bene e specificare manualmente la classe principale (così java -cp ...;pluginc.jar com.google.classname -i etc). Probabilmente sarebbe più facile ottenere formiche che fare tutto questo manualmente;)

+0

L'esecuzione di formica è ok per compilare tutto. posso usare lo script ant per eseguire com.google.caja.plugin.PluginCompilerMain.main? – mcintyre321

+1

+1 Bel riassunto dei problemi qui – Ash

+0

@ mcintyre321 - se hai un form ant, allora 'ant jars' dovrebbe scaricare tutti i jar in una directory per te. Puoi quindi usare '-cp dir/*' per includerli tutti (dove 'dir' è la directory in cui li inserisce), il che semplifica molto le cose. – Chris

0

Prova questa

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

Non penso di avere un% classpath% - tutti i documenti che ho letto durante l'impostazione suggerivano che avrebbe potuto risolverlo? – mcintyre321

+1

Questo non funzionerà; l'opzione '-classpath' viene ignorata quando si usa l'opzione' -jar', come spiegato da Ash. – Jesper

+0

Impostare classpath nel manifest del proprio jar utilizzando Class-Path: attributo. La sintassi sarà Class-Path: [jar 1] [jar 2] ... –

6

Si noti inoltre che quando si utilizza l'opzione -jar, tutte le altre impostazioni di CLASSPATH vengono ignorate. Vedere http://java.sun.com/javase/6/docs/technotes/tools/windows/java.html:

Quando si utilizza questa opzione, il file JAR è la fonte di tutte le classi di utenti, e le altre impostazioni di percorso classe utente vengono ignorati.

Problemi correlati