在本地开发服务器上运行的Java Google App Engine和Google Cloud SQL

时间:2012-01-21 11:41:28

标签: google-app-engine google-cloud-sql

我整个星期都在研究这个问题的解决方案,虽然已经有类似问题的解决方案,但没有一个能够直接解决和纠正这个问题。

我使用Google App Engine和Google Cloud SQL创建了一个Web应用程序项目。 使用eclipse谷歌插件和本地MySQL服务器运行GAE应用程序,应用程序运行良好。

使用以下命令从命令行运行应用程序时: -

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

我得到以下内容: -

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

我的类路径引用了我的用户库引用的/Twincam/war/WEB-INF/lib/mysql-connector-java-5.1.18-bin.jar中的mysql-connector.jar,如下所示。 classpath文件和目录结构: -

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

更新:我检查了文件权限,并且都设置为默认值664,所以我确信这不是问题。

5 个答案:

答案 0 :(得分:36)

我遇到了同样的问题。

我通过在appengine-java-sdk-x.x.x / lib / impl中删除mysql .jar解决了这个问题。

答案 1 :(得分:9)

马特的回答给了我很多帮助,我相信这是一个更完整的解释。

我可以验证您是否可以使用本地MYSQL实例与在开发模式下运行的Google App Engine一起使用,以免在开发过程中产生与Google的Cloud SQL选项相关的即将到来的成本。

首先,正如Matt所说,你必须将mysql-connector jar放入APPENGINE_HOME / lib / impl。

我在窗户上。我首先找到我的SDK所在的位置。在我在包浏览器中的eclipse项目中,我右键单击“App Engine SDK [App Engine - 1.6.4]”,从下拉菜单中选择“属性”,然后在弹出的结果中单击蓝色“配置SDK ... “链接。

这显示了我的App Engine SDK的位置。转到Windows资源管理器窗口中的该文件夹,打开lib / impl并放入从GAE eclipse项目复制的mysql-connector jar。我的道路是:

C:\ SOFTWARE \蚀\插件\ com.google.appengine.eclipse.sdkbundle_1.6.4.v201203300216r37 \ AppEngine上的Java-SDK-1.6.4 \ lib中\ IMPL

根据此处的说明(https://developers.google.com/eclipse/docs/cloudsql-createapp),您应该将您的Java代码连接字符串指向prod(jdbc:google:rdbms:// ..而不是jdbc:mysql:// ...)但是你需要进入Eclipse项目属性,Google,App Engine,Google Cloud SQL以及“开发SQL实例(由本地开发服务器使用)”选择单选按钮“使用MySQL实例“。下次启动GAE时,将忽略java代码中的连接字符串,以支持本地MySQL主机。

确保MySQL服务正在运行,你很高兴。

这花了我更长的时间来弄清楚它应该有的。我认为密钥来自Google Docs,如果您不理解/使用此信息,您将尝试使用mysql jdbc字符串并遇到套接字权限错误,因为GAE无法转到端口3306,除非您按照我的描述进行操作:

  

您不需要在代码中显式连接到Development SQL实例 - 这是在开发服务器中运行应用程序时自动完成的。要连接的开发SQL实例在运行时通过GPE通过VM参数自动传递到开发服务器。

(我上传了4张图片来帮助解释这个问题,只有在我完成之后它告诉我你需要10个声望点来加载图片 - jeesh)

答案 2 :(得分:2)

AFAIK如果您使用的是GAE,则无法使用JDBC驱动程序。我不知道它如何在日食中起作用,而Socet类在GAE中受到限制。 您应该使用内部GAE驱动程序而不是mysql JDBC。

com.google.appengine.api.rdbms.AppEngineDriver

然后,在eclipse中,您可以配置与example中的本地mysql数据库的连接 另请参阅此example如何配置

编译为纯GWT并使用JDBC将其放入Tomcat应该可以,但不能作为GAE应用程序。

答案 3 :(得分:1)

我刚刚在Juno Service Release 1 Build id:20121004-1855上使用GAE SDK1.7.5在新机器上安装了Eclipse + GPE4.2,并被迫在appengine-java-sdk-xxx / lib /上复制JDBC驱动程序IMPL。 最初我忘记了这一点,我花了大约2天时间调试我的代码。

如果有更多有关GPE页面问题的信息,那就太好了。能够向Google提供更多信息会很高兴。

答案 4 :(得分:0)

嗯,在阅读了所有为你们写的内容,并阅读了另外一些内容后,我终于可以从GAE的Google SQL Cloud实例表中列出我的数据了,我只是按照这个陡峭的方式进行操作!...

1.-我按照这个例子:[Using Google Cloud SQL with App Engine Java SDK

但是在guestbook.jsp中我添加了这一行:

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

然后我将URL连接更改为此,在我的情况下没有用户名。

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

我也评论了这一行

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

2.-如上所述,我复制了mysql-connector.jar,将其放入appengine-java-sdk-x.x.x / lib / impl。

3.-我按照此处所述配置项目Create a New Web App with Cloud SQL Support

4.-我按照Configuring Access

中的描述配置了我的Google SQL实例

5.-最后,我按照Uploading Your Application

所述部署了项目

我可以在本地运行它也很有效。

嗯,我希望这有帮助,谢谢!

相关问题