这个问题类似于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目录放在与default
和module
相同的级别。编译的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,但我可以让它抛出与之前部署的简单版本相同的异常。 我想知道我是否取得了任何进展。
答案 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为例)。您的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章)中给出的说明,并逐渐添加了我的旧代码。这很有用,我不再得到空指针异常(不知道是什么导致它)。
要注意的一些要点:
-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项目模块化。