这个问题类似于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
下,与 default
和 module
处于同一级别。编译后的 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/