我有一个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
文件?
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。