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

19

我已经花了一周时间研究解决这个问题,虽然有类似问题的解决方案,但没有直接解决并纠正这个问题的方法。

我使用Google App Engine和Google Cloud SQL创建了一个Web应用程序项目。 使用Eclipse Google插件和本地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)

我已经在classpath中引用了mysql-connector.jar,该文件位于/Twincam/war/WEB-INF/lib/mysql-connector-java-5.1.18-bin.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>
更新:我检查了文件权限,所有权限都设置为默认的 664,所以我相信这不是问题的原因。

在此输入图片描述

更新:我检查了文件权限,发现它们都设置为默认的 664,所以我相信这并不是问题的原因。

5个回答

36

我也遇到了同样的问题。

我将mysql .jar文件放入appengine-java-sdk-x.x.x/lib/impl文件夹中,问题得以解决。


@MattFenwick,我在Windows上使用Eclipse,你知道我该在哪里找到appengine-java-sdk-x.x.x/lib/impl吗? - Alon Shmiel
@AlonShmiel 在 Eclipse 属性中查找 > Google > App Engine > 配置 SDK。 - Amir Uval

9
马特的回答对我很有帮助,我相信这是一个更完整的解释。
我可以证实,在开发模式下运行的 Google App Engine 中,您可以使本地 MYSQL 实例工作,以避免承担与 Google 的 Cloud SQL 选项相关的即将到来的成本,同时进行开发。
首先,如马特所说,您必须将 mysql-connector jar 放入 APPENGINE_HOME/lib/impl 中。
我在 Windows 上。我通过首先找到我的 SDK 所在位置来做到这一点。在我的项目中,我在“包资源管理器”中右键单击“App Engine SDK [App Engine - 1.6.4]”,然后从下拉菜单中选择“属性”,并在弹出的窗口中单击蓝色的“配置 SDK…”链接。
这会显示我的 App Engine SDK 的位置。在 Windows Explorer 窗口中转到该文件夹,打开 lib/impl 并放入从 GAE Eclipse 项目复制的 mysql-connector jar。我的路径是:
C:\Software\eclipse\plugins\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 文档,如果您不理解/使用此信息,则会尝试使用 mysql jdbc 字符串,并因 GAE 无法访问端口 3306 而遇到套接字权限错误,除非您按照我所描述的方式操作:

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

(我上传了 4 张图像以帮助说明,但直到我完成后才告诉我您需要 10 个声望点才能加载图像——天哪)

感谢您指出URL的问题。我认为文档中有点不清楚。对于所有花费时间来弄清楚为什么会收到AccessRestrictedExceptions的人:在启用AppEngine时,请勿使用直接URL连接到MySQL实例。请使用标准的“Google URL”,例如jdbc:google:rdbms://instance_name/guestbook,App Engine将在运行时替换它。 - Wojciech Owczarczyk
@mark scheel,你是我今天的英雄。在这个令人烦恼的错误问题上,我一直束手无策,直到找到了你的答案。 - LostPuppy
我仍然在这个问题上遇到很多麻烦。有人可以帮帮我吗?http://stackoverflow.com/questions/36257087/java-mysql-connection-throws-a-java-lang-exceptionininitializererror - Jay

2

据我所知,如果您正在使用GAE,则无法使用JDBC驱动程序。我不知道在GAE中限制了Socket类的情况下,它如何在Eclipse中工作。您应该使用内部GAE驱动程序而不是mysql JDBC。

com.google.appengine.api.rdbms.AppEngineDriver

然后,在eclipse中,您可以按照示例配置与本地mysql db的连接。 同时,请查看此示例以了解如何进行配置。 将其编译为纯GWT并放入带有JDBC的Tomcat中应该有效,但不适用于GAE应用程序。

谢谢回复,但是第一个链接明确提供了一个用于在eclipse中使用的JDBC驱动程序下载链接。我使用的VM参数直接来自这里,并且还引用了mysql-connector-java-5.1.18-bin.jar中的一个包。 - Ben B

1
我刚在一台新机器上安装了Eclipse + GPE4.2,并使用GAE SDK1.7.5和Juno Service Release 1 Build id: 20121004-1855。我被迫将JDBC驱动程序复制到appengine-java-sdk-x.x.x/lib/impl,最初我忘记这一步,花了约两天时间调试我的代码。
如果GPE页面问题有更多的信息可用,那就太好了。希望能够在Google上找到更多信息。

0

在认真阅读了大家为我写的所有内容以及其他资料后,我终于能够使用GAE从我的Google SQL Cloud实例的表中列出数据了。我只是按照这些步骤进行操作,然后就成功了!...

1.- 我按照这个示例:[ 使用App Engine Java SDK与Google Cloud SQL]

在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.- 我按照此处描述的方式配置了项目 创建支持Cloud SQL的新Web应用程序

4.- 我按照此处描述的方式配置了我的Google SQL实例 配置访问权限

5.- 最后,我按照此处描述的方式部署了项目 上传您的应用程序

我可以在本地运行它,而且也很好用。

希望这有所帮助,谢谢!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接