在 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.xmlapp.yaml

灵活的环境使用app.yaml来配置所有appengine需要知道的东西 标准环境使用appengine-web.xmllogging.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 服务

是否可以在 Google appengine 标准环境中使用 Gorilla mux 路由器?

如何在 Google AppEngine 上使用 JDBC