2011-11-27 15 views
17

Ho cercato una soluzione per questo problema per più ore oggi e molte ore di ieri, quindi ho deciso di affrontarlo qui, anche se sembra un problema stupido.Inclusi file JAR nel progetto Eclipse (App Engine)

Situazione: Ho una configurazione del progetto Google AppEngine in Eclipse Java EE. È lì per più settimane, tutto funziona bene, posso eseguire il deployment su App Engine e testare in Eclipse senza problemi.

Ora ho bisogno di aggiungere pacchetti JAR per f.e. Supporto JSON e API di visualizzazione di Google. Ho provato JSON una settimana fa e, poiché non è riuscito, ho appena scaricato i file sorgente e li ho aggiunti alla mia fonte. Ma ora con le cose di visualizzazione, sono troppi file di origine quindi ho bisogno che funzionino i JAR.

Quello che ho fatto:

  • scaricati i file JAR.
  • li ha inseriti in una cartella PROJECT/lib.
  • selezionato e fare clic con il pulsante destro del mouse e fare clic su Crea percorso> Aggiungi al percorso di creazione.

Che cosa è successo: tutto è andato bene, ho potuto importare le classi e creare sottoclassi da loro senza errori. Quindi è chiaro che Eclipse ha riconosciuto l'esistenza delle classi e Eclipse le ha importate con successo.

poi ho cercato di costruirla (Debug Mode) e ottenuto seguente errore (quello che ho ottenuto con JSON troppo):

Nov 27, 2011 11:57:48 AM com.google.apphosting.utils.jetty.JettyLogger warn 
WARNING: failed chartDataServlet: java.lang.NoClassDefFoundError: com/google/visualization/datasource/DataSourceServlet 
Nov 27, 2011 11:57:48 AM com.google.apphosting.utils.jetty.JettyLogger warn 
WARNING: failed c[email protected]727db937{/,/Volumes/Data/eclipse_workspace/kulStats/war}: java.lang.NoClassDefFoundError: com/google/visualization/datasource/DataSourceServlet 
Nov 27, 2011 11:57:48 AM com.google.apphosting.utils.jetty.JettyLogger warn 
WARNING: failed [email protected]: java.lang.NoClassDefFoundError: com/google/visualization/datasource/DataSourceServlet 
Nov 27, 2011 11:57:48 AM com.google.apphosting.utils.jetty.JettyLogger warn 
WARNING: Error starting handlers 
java.lang.NoClassDefFoundError: com/google/visualization/datasource/DataSourceServlet 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:615) 
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) 
at java.net.URLClassLoader.access$000(URLClassLoader.java:58) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:197) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:176) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
at org.mortbay.util.Loader.loadClass(Loader.java:91) 
at org.mortbay.util.Loader.loadClass(Loader.java:71) 
at org.mortbay.jetty.servlet.Holder.doStart(Holder.java:73) 
at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:242) 
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) 
at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685) 
at org.mortbay.jetty.servlet.Context.startContext(Context.java:140) 
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250) 
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517) 
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467) 
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) 
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) 
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
at org.mortbay.jetty.Server.doStart(Server.java:224) 
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) 
at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:191) 
at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:239) 
at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:146) 
at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:164) 
at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48) 
at com.google.appengine.tools.development.DevAppServerMain.<init>(DevAppServerMain.java:113) 
at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:89) 

Caused by: java.lang.ClassNotFoundException: com.google.visualization.datasource.DataSourceServlet 
    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:306) 
    at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:176) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
    ... 35 more 

non so se il fatto che esso stampa la classe con barrato anziché con punti fa parte del problema: com/google/visualization/datasource/DataSourceServlet. Nella seconda parte usa i punti.

Ho cercato un problema per un tempo molto lungo e ho sentito cose sul file classpath. Il mio file .classpath si presenta così:

<?xml version="1.0" encoding="UTF-8"?> 
<classpath> 
    <classpathentry kind="src" path="src"/> 
    <classpathentry kind="src" output="test-classes" path="test"/> 
    <classpathentry kind="con" path="com.google.appengine.eclipse.core.GAE_CONTAINER"/> 
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> 
    <classpathentry kind="con" path="com.google.appengine.eclipse.core.GAE_CONTAINER/App Engine (1)"/> 
    <classpathentry kind="lib" path="war/WEB-INF/lib/chart-datasource/lib/commons-lang-2.4.jar"/> 
    <classpathentry kind="lib" path="war/WEB-INF/lib/chart-datasource/lib/commons-logging-1.1.1.jar"/> 
    <classpathentry kind="lib" path="war/WEB-INF/lib/chart-datasource/lib/opencsv-1.8.jar"/> 
    <classpathentry kind="lib" path="war/WEB-INF/lib/chart-datasource/visualization-datasource-1.1.1.jar"/> 
    <classpathentry kind="output" path="war/WEB-INF/classes"/> 
</classpath> 

Solo il war/WEB-INF/classes non esiste ..

Ow, un'altra cosa: ho trovato documenti su App Engine specifico e che a volte citato la cartella war/WEB-INF/lib, così ho provato mettendolo anche lì. Ovviamente dopo l'eliminazione dal percorso di costruzione e la lettura dopo lo spostamento. (È la versione del file classpath che ho incollato).

Qualcuno ha un'idea di come questo può essere risolto? Riassunto: Eclipse riconosce i JAR importati, ma costruire riesce per qualche motivo ...

EDIT: soluzione ho trovato il seguente:

  • JAR devono essere in WEB-INF/lib
  • I JAR non devono trovarsi in cartelle all'interno di lib, tutto nella cartella radice WEB-INF/lib. Ho avuto il mio in una cartella separata e questo non ha funzionato.
  • Ho fatto Source> Clean Up e Source> Gestisci le importazioni e ha funzionato.

risposta

21

Sei sulla strada giusta.Dal momento che l'app, una volta distribuita in Appengine, è pacchettizzata come una guerra (archivio di applicazioni Web), i jar della libreria devono essere in WEB-INF/lib. Dovresti assicurarti che i tuoi vasi ci siano e quindi aggiungere quei vasi al tuo percorso di costruzione di eclissi. Prova a fare un'operazione "pulita" sul progetto e ricostruiscila per assicurarti che le librerie siano nel pacchetto.

+0

Operazione pulita? Come lo faccio? Im relativamente nuovo per Eclipse in realtà. E costruire? Quando faccio clic sul pulsante di debug o di esecuzione, il progetto viene ricostruito, no? –

+1

Posso aggiornare qui da qualche parte il post con la soluzione? Ho trovato il seguente: - I JAR dovrebbero essere effettivamente in WEB-INF/lib - I JAR non dovrebbero essere in cartelle all'interno di lib, tutti nella cartella WEB-INF/lib radice. Ho avuto il mio in una cartella separata e questo non ha funzionato. - Ho fatto Source> Clean Up e Source> Gestisci le importazioni e ha funzionato in seguito :) –

+0

A volte eclipse non riesce a copiare i jar specificati nel percorso di build nella cartella WEB-INF/lib. nel mio caso, le voci della libreria sotto l'ordine e la scheda di esportazione dell'impostazione del percorso di generazione vengono deselezionate (non so perché) quindi le ho controllate tutte e risolvo il problema. –

4

questa soluzione che:

  • sorgente della copia (file .jar) in una guerra cartella lib/WEB-INF/
2

Hai ancora bisogno di aggiungere i file jar nel percorso Java build evitare errori di compilazione dopo aver aggiunto i file alla cartella war/WEB-INF/lib!

1

Copia incolla i file .jar in war/WEB-INF/lib e poi vai su Proprietà (del progetto in Eclipse) -> Percorso build Java -> Aggiungi JAR -> Seleziona i file .jars correlati il progetto attuale. Dovresti essere tutto pronto!

0

Potrebbe essere "un po '" troppo tardi per questo, ma in eclissi non è necessario copiare manualmente. Fare clic con il tasto destro sul progetto -> Percorso di creazione -> Configura percorso di creazione ... -> selezionare Deployment Assembly (a sinistra). Aggiungi i tuoi barattoli qui e saranno inclusi durante la distribuzione.

Problemi correlati