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

标签 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 长大的,在我们自己编写代码的时代。 ;)

更新:

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

在本地,我可以看到我的云端点 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) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at 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 ,但我可以让它抛出与我之前部署的简单版本相同的异常。 我想知道我是否取得了任何进展。

最佳答案

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

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

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

您的云端点可以在 default/WEB-INF/web.xml 中声明,如appstart's web.xml .

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

关于java - 将简单的 AppEngine Java 项目转换为使用模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34184175/

相关文章:

java - 如何在sql表中存储jsp文件并执行它?

java - 如何在Java中使用ThreadLocalRandom.current().ints(int,int)来查找与特定表达式匹配的特定数字?

java - 部署时出现 GAE 端点错误 500

android - 从 GAE 开发服务器使用 Firestore 时出现未经验证的异常

java - 如何使用 Spring WebSocket 向 STOMP 客户端发送错误消息?

java - fragment ,一些提示

java - 我可以在 GAE 上使用 Spring 吗?

google-app-engine - 我想知道如何使用GAE进行访问控制

python - <a></a> 标签放在引号中时不会呈现

python - 获取导入错误 : No module named control when following google cloud endpoint tutorial