如何在没有web.xml的情况下将App Engine项目更新为Java 11?

问题描述 投票:0回答:1

我有一个App Engine项目。 Here是一个示例存储库,但仅包含几个文件:

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>io.happycoding</groupId>
  <artifactId>google-cloud-hello-world</artifactId>
  <version>1</version>
  <packaging>war</packaging>

  <properties>
    <!-- App Engine currently supports Java 8 -->
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <failOnMissingWebXml>false</failOnMissingWebXml>
  </properties>

  <dependencies>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>com.google.appengine</groupId>
        <artifactId>appengine-maven-plugin</artifactId>
        <version>1.9.71</version>
      </plugin>
    </plugins>
  </build>
</project>

appengine-web.xml

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
  <application>MY_PROJECT_ID_HERE</application>
  <version>1</version>
  <threadsafe>false</threadsafe>
  <sessions-enabled>true</sessions-enabled>
  <runtime>java8</runtime>
</appengine-web-app>

HelloWorldServlet.java

package io.happycoding.servlets;

import java.io.IOException;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/hello")
public class HelloWorldServlet extends HttpServlet {

  @Override
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    response.setContentType("text/html;");
    response.getOutputStream().println("<h1>Hello world!</h1>");
  }
}

我没有web.xml文件,因为我改用了@WebServlet批注。这已经工作了好多年了。

[唯一的问题是我只能使用Java 8,因此很高兴看到App Engine announce对Java 11的支持。我现在正尝试将App Engine项目升级到Java 11。

我首先将appengine-web.xml文件更改为包含此行:

<runtime>java11</runtime>

我也更改了pom.xml文件:

<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>

我运行mvn appengine:devserver(在此更改之前运行良好,但出现此错误:

ClassLoader is jdk.internal.loader.ClassLoaders$AppClassLoader@78308db1, not a URLClassLoader.

I gather,这是因为App Engine Maven插件本身需要Java8。我也了解到the App Engine Maven plugin is deprecated,并且应该升级到Cloud SDK Maven插件。好的。

我遵循this guide,并将我的pom.xml文件中的插件更改为此:

<plugin>
   <groupId>com.google.cloud.tools</groupId>
   <artifactId>appengine-maven-plugin</artifactId>
   <version>2.2.0</version>
</plugin>

然后我运行mvn package appengine:run(因为运行devserver的命令当然也发生了变化,但是现在我得到了这个错误:

 java.io.FileNotFoundException: /home/kevin/gcloud-tutorials/hello-world/target/hello-world-1/WEB-INF/web.xml (No such file or directory)

错误说它找不到web.xml文件,但是我不需要一个文件,因为我正在使用@WebServlet批注!我的pom.xml文件还包含<failOnMissingWebXml>false</failOnMissingWebXml>属性,但我不知道新插件是否对它有任何帮助。

我是否缺少步骤或属性?如何升级我的App Engine项目以使用Java 11,而又不需要web.xml文件?

java maven google-app-engine web.xml google-cloud-sdk
1个回答
0
投票

Appengine Java 11不再支持appengine-web.xml。您需要将appengine-web.xml替换为app.yaml并创建您的项目文件结构,如下所示:

MyDir/
  pom.xml
  [index.yaml]
  [cron.yaml]
  [dispatch.yaml]
  src/main/
    appengine/
      app.yaml
    java/com.example.mycode/
      MyCode.java

您的app.yaml将大致如下所示:

runtime: java11
entrypoint: java io.happycoding.servlets.HelloWorldServlet.java

此外,您还需要将项目的包装从WAR文件更改为JAR文件。您可以在这里参考code samples

© www.soinside.com 2019 - 2024. All rights reserved.