将简单的AppEngine Java项目转换为使用模块

时间:2015-12-09 16:40:58

标签: java google-app-engine google-cloud-endpoints gae-module app-engine-modules

这个问题类似于this one,但这并没有解决我的问题。

我有一个非常简单的Google AppEngine / Java应用程序。它自2011年开始运行,不使用我认为不需要的maven或其他花哨的东西。最近,我在此应用程序中添加了Cloud Endpoints。我没有使用生成的endpoint-libs,因为我似乎不需要它,没有它就一切正常。

该应用程序有一段时间的前端和后端。我现在正在尝试将这些转换为模块:前端将成为默认模块,后端将成为另一个模块。

我的旧项目的结构是这样的:

project
 |- src
 |   |- ... Java source files ...
 |
 |- war
 |   |- WEB-INF
 |   |   |- appengine.xml
 |   |   |- backends.xml
 |   |   |- cron.xml
 |   |   |- web.xml

我通过为Java类提供正确的注释来实现云端点。没有花哨的maven产生魔力。

我知道我需要为每个模块创建一个目录,如下所示:

project
 |- default
 |   |- WEB-INF
 |   |   |- appengine.xml
 |   |   |- cron.xml
 |   |   |- web.xml
 |
 |- module
 |   |- WEB-INF
 |   |   |- appengine.xml
 |   |   |- web.xml
 |
 |- META-INF
 |   |- appengine-application.xml
 |   |- application.xml

我的问题是:

  • 我应该在哪里放置src目录?
  • 我应该在default/WEB-INF/web.xml
  • 中声明我的云端点类
  • 每个模块都有自己的WEB-INF/cron.xml

如果我似乎不知道自己在做什么,那可能是对的,但我不想把所有东西放在maven pom文件中,写gradle脚本等等,而是专注于实际应用。这可能是因为我在vi和emacs长大,在我们自己编写代码的时候。 ;)

更新

我将project下的src目录放在与defaultmodule相同的级别。编译的Java类出现在default/WEB-INF/classes下,这表明我做了一些正确的事情。 GAE在*.api中生成一个default/WEB-INF文件,这是我以前没有使用模块时看不到的。

在本地,我可以看到我的云端点API,我可以使用它们。当我部署到AppEngine并尝试使用API​​资源管理器时,我得到一个例外:

  在com.google.api.server.spi.SystemServiceServlet的com.google.api.server.spi.SystemServiceServlet.execute(SystemServiceServlet.java:100)上的

/ _ ah / spi / BackendService.getApiConfigs java.lang.NullPointerException。 doPost(SystemServiceServlet.java:71)位于javax.servlet.http.HttpServlet.service(HttpServlet.java:637)的javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

...诸如此类

我确实添加了OAuth2凭据,并将其设置在我的云端点配置中。 我找不到SystemServiceServlet的代码,但我的猜测是它无法找到我的API类(在default/WEB-INF/web.xml中配置)。

另一个更新:

我了解到AppEngine模块需要企业归档(ear)结构,并且像简单的GAE应用程序一样部署是行不通的。 没有按下按钮'部署。 我按照Programming Google App Engine with Java中的说明进行操作,最后得到了一堆Eclipse项目。它更像是enterprisey,但我可以让它抛出与之前部署的简单版本相同的异常。 我想知道我是否取得了任何进展。

3 个答案:

答案 0 :(得分:4)

我创建了Appstart(https://github.com/omerio/appstart)基于样板文件的多模块App Engine应用程序,该应用程序演示了包括Cloud Endpoints在内的一些技术的使用,并且有3个模块,一个fronend模块,后端模块和公共模块模块,包括模块之间共享的所有公共类。

项目设置在父文件夹' appstart'与父母maven POM。您可以轻松签出项目,删除您不需要的内容,添加代码,您应该有一个多模块项目。或者,您可以构建类似于appstart的代码。在这种情况下,您需要执行以下操作:

  • 在您的项目文件夹中添加一个包含<packaging>pom</packaging>的父pom并向其添加模块(请参阅appstart parent pom作为示例)。
  • 对于每个模块,都包含一个包含父元素<parent>的pom(以appstart-frontend pom为例)。
  • 您需要创建一个带耳包的项目(Enterprise ARchive),这有助于一次性部署所有模块(参见appstart-ear as an example

您的Cloud端点可以使用appstart's web.xml在默认/ WEB-INF / web.xml中声明。

appstart-frontend还包含一个示例cron.xml。必须将cron.xml文件添加到App Engine docs中提到的默认模块中。要在模块上调用cron作业,只需在cron.xml中包含<target>my-module</target>元素。

答案 1 :(得分:2)

虽然文档强烈建议你需要耳朵来做这件事,但你不会。 您只需在appengine-web.xml中添加模块定义,您的war就会部署到指定的模块。默认模块:

<module>default</module>

对于后端

<module>backend</module>
<manual-scaling> ... </manual-scaling>

这有利于在默认和其他模块上使用相同的代码,但需要某种方式在部署时切换它(不用磨削我的齿轮更多我使用maven配置文件),你可以只有另一个分支或手动操作。然后你应该能够正常部署,但是你需要做两次。

这是我见过的最简单的移民路径,如果你已经发生过战争,那么设置耳朵会很痛苦。

答案 2 :(得分:0)

最后,我密切关注Programming Google App Engine with Java(第5章)中给出的说明,并逐渐添加了我的旧代码。这很有用,我不再得到空指针异常(不知道是什么导致它)。

要注意的一些要点:

  • 模块不共享代码。在Eclipse中,您可以在一个项目中创建一个链接到另一个项目中的源文件夹。这是分享我能找到的代码的最佳方式。
  • 您必须在Eclipse中使用Java EE透视图。这有一个&#39;服务器&#39;选项卡,其中包含一个带有&#34;部署到远程服务器的GAE按钮&#34;菜单条目。这是部署模块的方法。 &#34; Google / Deploy to AppEngine&#34;上下文菜单条目不适用于模块/企业项目。
  • cron.xml和datastore-indexes.xml等特殊文件必须位于&#39;默认&#39;的WEB-INF目录中。模块。
  • Google服务器上的
  • Routing URLs to modules与开发服务器非常不同。
  • 在开发服务器上,本地数据存储区位于Eclipse目录中的某个位置。在服务器配置中通过changing the working directory进行修复:双击服务器。这将打开一个“服务器编辑器”。填写其他VM参数:-Ddatastore.backing_store=/C:/wherever/local_db.bin

我项目的目录结构现在如下所示:

project
 |- default
 |   |- src
 |   |- WebContent
 |   |   |- WEB-INF
 |   |   |   |- appengine.xml
 |   |   |   |- cron.xml
 |   |   |   |- web.xml
 |
 |- module
 |   |- WebContent
 |   |   |- <HTML, CSS etcetera>
 |   |   |- WEB-INF
 |   |   |   |- appengine.xml
 |   |   |   |- web.xml
 |
 |- ear     (the EAR project)
 |   |- EarContent
 |   |   |- META-INF
 |   |   |   |- appengine-application.xml
 |   |   |   |- application.xml

大部分内容是按照上述书中的说明生成的。

我希望这会帮助其他人努力使他们的AppEngine项目模块化。