2

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

我有一个非常简单的 Google AppEngine / Java 应用程序。它自 2011 年以来一直在运行,并且不使用 maven 或其他我认为不需要的花哨的东西。最近,我向此应用程序添加了 Cloud Endpoints。我没有使用 generated 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 的陪伴下长大,那时我们自己编写代码。;)

更新:

我将 src 目录与和project放在同一级别下。编译后的 Java 类出现在 下,这表明我做对了。GAE 在 中生成一个文件,我以前在不使用模块时没有看到该文件。defaultmoduledefault/WEB-INF/classes*.apidefault/WEB-INF

在本地,我可以看到我的云端点 API,并且可以使用它们。当我部署到 AppEngine 并尝试使用 API 资源管理器时,出现异常:

/_ah/spi/BackendService.getApiConfigs java.lang.NullPointerException at com.google.api.server.spi.SystemServiceServlet.execute(SystemServiceServlet.java:100) at com.google.api.server.spi.SystemServiceServlet.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 应用程序那样进行部署是行不通的。没有“一键式”部署。我按照使用 Java 编程 Google App Engine中的说明进行操作,最终得到了一堆 Eclipse 项目。它相当企业化,但我可以让它抛出与我之前部署的简单版本相同的异常。我想知道我是否取得了任何进展。

4

3 回答 3

4

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

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

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

您的 Cloud Endpoints 可以在您的 default/WEB-INF/web.xml 中声明,就像appstart 的 web.xml一样。

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

于 2015-12-09T17:32:33.550 回答
2

虽然文档强烈建议您需要耳朵来执行此操作,但您不需要。您只需在 appengine-web.xml 中添加一个模块定义,您的战争就会部署到指定的模块。默认模块:

<module>default</module>

对于后端

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

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

这是我见过的最简单的迁移路径,如果您已经打过仗,那么设置耳朵会很痛苦。

于 2015-12-10T21:14:47.703 回答
0

最终,我严格按照使用 Java 编程 Google App Engine(第 5 章)中给出的说明,逐渐添加了我的旧代码。这行得通,我不再得到空指针异常(不知道是什么原因造成的)。

需要注意的几点:

  • 模块不共享代码。在 Eclipse 中,您可以在一个项目中创建指向另一个项目中源文件夹的链接。这是我能找到的共享代码的最佳方式。
  • 您必须在 Eclipse 中使用 Java EE 透视图。这有一个“服务器”选项卡,其中包括一个带有“部署到远程服务器”菜单条目的 GAE 按钮。这是部署模块的方式。“Google / Deploy to AppEngine”上下文菜单条目不适用于模块/企业项目。
  • cron.xml 和 datastore-indexes.xml 等特殊文件必须位于“默认”模块的 WEB-INF 目录中。
  • 将 URL 路由到Google 服务器上的模块与开发服务器有很大不同。
  • 在开发服务器上,本地数据存储隐藏在 Eclipse 目录中的某个位置。通过更改服务器配置中的工作目录来解决此问题:双击服务器。这将打开一个“服务器编辑器”。填写 Additional 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 项目模块化的人。

于 2016-02-21T11:42:02.870 回答