2012-01-21 3 views
18

Ho cercato una soluzione a questa settimana e mentre ci sono state soluzioni a problemi simili non ce ne sono che risolvono direttamente questo problema.Java Google App Engine e Google Cloud SQL in esecuzione sul server di sviluppo locale

Ho creato un progetto di applicazione Web utilizzando Google App Engine e Google Cloud SQL. Esecuzione dell'applicazione GAE utilizzando il plug-in di eclissi Google e un server MySQL locale, l'applicazione funziona alla grande.

Quando si esegue l'applicazione dalla riga di comando con: -

sudo /opt/appengine-java-sdk-1.6.1/bin/dev_appserver.sh --jvm_flag=-Drdbms.server=local --jvm_flag=-Drdbms.driver=com.mysql.jdbc.Driver --jvm_flag=-Drdbms.url=jdbc:mysql://localhost:3306/twincam?user=root --port=7070 /home/ben/workspace/Twincam/war 

ottengo il seguente: -

java.lang.IllegalStateException: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 
at com.google.appengine.api.rdbms.dev.LocalRdbmsServiceLocalDriver.registerDriver(LocalRdbmsServiceLocalDriver.java:95) 

ho il classpath riferimento alla mysql-connector.jar si trova in/Twincam /war/WEB-INF/lib/mysql-connector-java-5.1.1-bin.jar referenziato dalla mia libreria utente come nel seguente file .classpath e struttura di directory: -

<?xml version="1.0" encoding="UTF-8"?> 
<classpath> 
    <classpathentry kind="src" path="src"/> 
    <classpathentry kind="con" path="com.google.appengine.eclipse.core.GAE_CONTAINER"/> 
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> 
    <classpathentry kind="lib" path="war/WEB-INF/lib/mysql-connector-java-5.1.18-bin.jar"/> 
    <classpathentry kind="lib" path="war/WEB-INF/lib/gson-2.1-javadoc.jar"/> 
    <classpathentry kind="lib" path="war/WEB-INF/lib/gson-2.1-sources.jar"/> 
    <classpathentry kind="lib" path="war/WEB-INF/lib/gson-2.1.jar"/> 
    <classpathentry kind="output" path="war/WEB-INF/classes"/> 
</classpath> 

enter image description here

Update: ho controllato i permessi dei file e tutti sono impostati al valore predefinito 664, quindi sono sicuro che questo non è il problema.

risposta

36

Ho avuto lo stesso problema.

Ho risolto il problema eliminando mysql .jar in appengine-java-sdk-x.x.x/lib/impl.

+0

@MattFenwick, dove posso trovare appengine-java-sdk-xxx/lib/impl? Io uso eclipse in windows .. –

+0

@AlonShmiel guarda nelle proprietà di eclissi> google> motore app> configura sdk – auval

2

AFAIK Se si utilizza GAE, non è possibile utilizzare il driver JDBC. Non so come potrebbe funzionare in eclissi mentre la classe Socet è limitata in GAE. Dovresti usare il driver GAE interno invece JDBC mysql.

com.google.appengine.api.rdbms.AppEngineDriver 

Poi, in eclisse si potrebbe configurare la connessione al db mysql locale come in example Vedi anche example come è configurato

Compilare come puro GWT e la messa in Tomcat con JDBC, dovrebbe funzionare , ma non come applicazione GAE.

+0

Grazie per la risposta, ma il primo [collegamento] (http://code.google.com/intl/pl-PL/eclipse/docs/cloudsql-createapp.html) fornisce esplicitamente un collegamento per scaricare il driver JDBC per utilizzare con eclissi. Gli argomenti VM che ho usato provengono direttamente da [qui] (https://developers.google.com/cloud-sql/docs/developers_guide_java#without_eclipse) e fanno anche riferimento a un pacchetto all'interno di mysql-connector-java-5.1.18-bin .jar –

9

La risposta di Matt mi ha aiutato molto, credo che questa sia una spiegazione più completa.

Posso verificare che è possibile ottenere un'istanza MySQL locale per lavorare con Google App Engine in esecuzione in modalità di sviluppo, in modo da non sostenere i costi imminenti associati all'opzione Cloud SQL di Google, durante lo sviluppo.

In primo luogo, come ha detto Matt, è necessario inserire il jar del connettore mysql in APPENGINE_HOME/lib/impl.

Sono su Windows. L'ho fatto trovando innanzitutto dove si trova il mio SDK. Nel mio progetto in eclipse in explorer di pacchetti ho fatto clic con il pulsante destro del mouse su "App Engine SDK [App Engine - 1.6.4]", seleziono Proprietà dal menu a discesa e nel risultante pop-up fai clic sul blu "Configura gli SDK ... "link.

Questo rivela la posizione del mio SDK App Engine. Vai a quella cartella in una finestra di Windows Explorer, apri lib/impl e rilascia il tuo jar mysql-connector, copiato dal tuo progetto eclisse GAE.Il mio percorso è stato:

C: \ Software \ eclipse \ plugins \ com.google.appengine.eclipse.sdkbundle_1.6.4.v201203300216r37 \ AppEngine-java-sdk-1.6.4 \ lib \ impl

Per la istruzioni qui (https://developers.google.com/eclipse/docs/cloudsql-createapp) si dovrebbe lasciare la stringa di connessione del codice java puntata su prod (jdbc: google: rdbms: // ... invece di jdbc: mysql: // ...) MA devi accedere alle proprietà del progetto Eclipse, Google, App Engine, Google Cloud SQL e in "Istanza SQL di sviluppo (utilizzata dal server di sviluppo locale)" seleziona il pulsante di opzione "Usa istanza MySQL". La prossima volta che avvierai GAE, la stringa di connessione nel tuo codice java verrà ignorata a favore dell'host MySQL locale.

Assicurati che il servizio MySQL sia in esecuzione e sei a posto.

Questo mi ha portato più tempo a capire di quanto avrebbe dovuto. Penso che la chiave provenga da Google Docs, se non capisci/usi queste informazioni proverai e userai una stringa jdbc mysql e incapperai in errori di autorizzazione del socket perché GAE non può accedere alla porta 3306 a meno che tu non faccia come descrivo :

Non è necessario connettersi esplicitamente all'istanza di Sviluppo SQL nel codice, operazione eseguita automaticamente quando si esegue l'applicazione nel server di sviluppo. L'istanza di sviluppo SQL a cui connettersi viene passata automaticamente al tuo server di sviluppo tramite argomenti VM da GPE in fase di runtime.

(ho caricato 4 immagini per aiutare con questa spiegazione, e solo dopo aver finito non mi dirà bisogno di 10 punti reputazione per caricare le immagini - Jeesh)

+0

Grazie per aver sottolineato la cosa sull'URL. Penso che sia un po 'oscuro nei documenti. Per tutti coloro che hanno trascorso un po 'di tempo a capire perché ricevono AccessRestrictedExceptions: ** NON UTILIZZARE L'URL DIRETTO A ISTANTANEA MYSQL QUANDO L'APPARGINA È ABILITATA **. Utilizza lo standard "URL di Google" come * jdbc: google: rdbms: // nome_istanza/guestbook * e il motore dell'app lo sostituirà al volo –

+0

@mark scheel sei il mio eroe del giorno. Mi stavo rompendo la testa con questo fastidioso bug ed ero impotente fino a quando non ti ho trovato a rispondere. – LostPuppy

+0

Grazie ... molto –

1

Ho appena installato Eclipse + GPE4.2 in una nuova macchina che utilizza GAE SDK1.7.5 su Juno Service Release 1 Build id: 20121004-1855 ed è stato costretto a copiare il driver JDBC su appengine-java-sdk-xxx/lib/impl. Inizialmente mi ero dimenticato di questo e ho passato circa 2 giorni a eseguire il debug del mio codice.

Sarebbe bello se ci fossero più informazioni disponibili sui problemi di pagina GPE. Sarebbe bello poter disporre di più informazioni su Google.

0

Bene, dopo leggere tutto scritto per voi ragazzi, e la lettura di un'altra roba ho finalmente in grado di elencare i miei dati da una tabella del mio esempio Google SQL cloud con GAE, mi basta seguire questo pendii e funziona! ...

1.- ho seguito questo esempio: [Using Google Cloud SQL with App Engine Java SDK

ma nel guestbook.jsp ho aggiunto questa linea:

<%@ page import="com.google.appengine.api.rdbms.AppEngineDriver" %> 

Poi ho cambiato il collegamento URL a questo, senza nome utente nel mio caso.

url = "jdbc:google:rdbms:INSTANCE_NAME/DATABASE_NAME"; 

anche ho commentato questa linea

// Class.forName("com.mysql.jdbc.GoogleDriver"); 

2.- Come descritto sopra, ho copiato il mysql-connector.jar cadere in appengine-java-sdk-x.x.x/lib/impl.

3.- Ho configurato il progetto come è descritto qui Create a New Web App with Cloud SQL Support

4.- Ho configurato il mio esempio Google SQL come è descritto qui Configuring Access

5.- Infine ho schierato il progetto come descritto qui Uploading Your Application

posso correre a livello locale e funziona anche bene.

Bene, spero che questo aiuti, thnks!