在 Google AppEngine 中使用 app.yaml
Posted
技术标签:
【中文标题】在 Google AppEngine 中使用 app.yaml【英文标题】:Using app.yaml in Google AppEngine 【发布时间】:2011-05-12 16:19:31 【问题描述】:我正在 AppEngine 上运行 Java 应用,并且我想使用 app.yaml。我已阅读文档并在 WEB-INF 文件夹中创建了一个 app.yaml 应用程序,其中包含以下内容
application: myprojectname
version: 1
runtime: java
api_version: 1
welcome_files:
- index.jsp
- index.html
handlers:
- url: /oblivion/*
servlet: myprojectname.CronUpdater
其中 myprojectname 是项目的名称。
但是当我访问 localhost:8888/oblivion 或 localhost:8888/oblivion/ 我得到一个
HTTP 错误 404
访问 /oblivion 时出现问题。原因:
NOT_FOUND
可能是什么原因?
这是目录的结构(截断)
pratik@pratik-desktop:~/workspace/myprojectname/war$ ls -LR
index.html index.jsp WEB-INF
./WEB-INF:
appengine-generated app.yaml cron.yaml logging.properties
appengine-web.xml classes lib web.xml
...
【问题讨论】:
你也不需要 'api_version: 1' 行 【参考方案1】:在 appengine 中,有两种环境类型(截至目前):
灵活的环境 标准环境你不能同时使用appengine-web.xml
和app.yaml
:
app.yaml
来配置所有appengine需要知道的东西
标准环境使用appengine-web.xml
和logging.properties
这里我假设您想在“灵活环境”模式下使用 appengine。通常,app.yaml
位于 appengine
文件夹中,就在您的 main
文件夹中。
从Google Cloud Platform doc,你应该有:
myprojectname/
[pom.xml] (optional, only if you use maven)
[build.gradle] (optional, only if you use gradle)
[index.yaml] (optional, only if you use cloud datastore)
[cron.yaml] (optional, only if you use cron job)
[dispatch.yaml] (optional, only if you route to services)
src/main/
appengine/
app.yaml
java/
com.example.mycode/
MyCode.java
webapp/
[index.html]
[index.jsp]
WEB-INF/
[web.xml]
最后一件事:应在web.xml
文件中定义处理程序。在app.yaml
中,您应该只有:
handlers:
- url: /.*
script: this field is required, but ignored
在你的web.xml
中是这样的:
<servlet>
<servlet>
<servlet-name>CronUpdater</servlet-name>
<servlet-path>myprojectname.CronUpdater</servlet-path>
</servlet>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CronUpdater</servlet-name>
<url-pattern>/oblivion/*</url-pattern>
</servlet-mapping>
希望这会有所帮助!
【讨论】:
此处的文档:cloud.google.com/appengine/docs/standard/java11/… 建议对于标准环境,您将 appengine-web.xml 替换为 app.yaml。我知道这个答案很旧,但可能需要更新?【参考方案2】:您需要列出 servlet 的完整包和类,而不是使用 myprojectname.CronUpdater。所以如果 CronUpdater 在包中
com.mycompany.servlets
你需要放
servlet: com.mycompany.servlets.CronUpdater
在您的 app.yaml 中。
【讨论】:
但是当我运行服务器时。使用 Run -> Run.. 它编译,就好像它忽略了 .yaml 文件。 当然可以编译,javac 不知道 app.yml 文件。您需要输入 servlet 的完全限定类名,否则容器将找不到您的代码。以上是关于在 Google AppEngine 中使用 app.yaml的主要内容,如果未能解决你的问题,请参考以下文章
本地 Google App Engine:ImportError:没有名为 google.cloud.bigquery 的模块
在 Google AppEngine 中使用 app.yaml
在 Google AppEngine 中读取 Java 资源文件
使用 Google AppEngine 创建 Java Web 服务