UnavailableException:Servlet类my.package_name。<Any>使用maven而不是eclipse应用程序引擎插件时,Servlet不是javax.servlet.Servlet

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

不再支持 Eclipse App Engine 插件。为了将我的应用程序从 Java 8 升级到 Java 11,我选择了 Maven App Engine 插件。为了确保过程顺利,我的计划是首先重新部署现有的 Java 8 代码(使用 Maven,而不是 Eclipse 插件)而不进行任何更改。之后,我将继续将项目更新到 Java 11。

尽管成功构建了代码且没有任何错误,但在生产环境和本地环境中运行应用程序时,我遇到了服务器端错误。例外情况如下:

com.google.apphosting.runtime.jetty9.JettyLogger warn: Failed startup of context c.g.a.r.j.AppEngineWebAppContext@1ac03879{/,file:///base/data/home/apps/s~MY_APP_ID/20240128t073546.458064643040632226/,UNAVAILABLE}{/base/data/home/apps/s~MY_APP_ID/20240128t073546.458064643040632226}
MultiException[javax.servlet.UnavailableException: Servlet class my.package_name.PurgeServlet is not a javax.servlet.Servlet, javax.servlet.UnavailableException: Servlet class my.package_name.VersionServlet is not a javax.servlet.Servlet, javax.servlet.UnavailableException: Servlet class ...]
    at org.eclipse.jetty.util.MultiException.ifExceptionThrow(MultiException.java:122)
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:776)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:379)
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1449)
    at com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.startWebapp(AppEngineWebAppContext.java:274)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1414)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:916)
    at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:288)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:524)
    at com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.doStart(AppEngineWebAppContext.java:218)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
    at com.google.apphosting.runtime.jetty9.AppVersionHandlerFactory.doCreateHandler(AppVersionHandlerFactory.java:206)
    at com.google.apphosting.runtime.jetty9.AppVersionHandlerFactory.createHandler(AppVersionHandlerFactory.java:124)
    at com.google.apphosting.runtime.jetty9.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:82)
    at com.google.apphosting.runtime.jetty9.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:176)
    at com.google.apphosting.runtime.RequestRunner.dispatchServletRequest(RequestRunner.java:262)
    at com.google.apphosting.runtime.RequestRunner.dispatchRequest(RequestRunner.java:227)
    at com.google.apphosting.runtime.RequestRunner.run(RequestRunner.java:193)
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:273)
    at java.lang.Thread.run(Thread.java:750)
    Suppressed: javax.servlet.UnavailableException: Servlet class my.package_name.PurgeServlet is not a javax.servlet.Servlet
        at org.eclipse.jetty.servlet.ServletHolder.checkServletType(ServletHolder.java:514)
        at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:386)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
        at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:749)
        at java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:483)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
        at java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:313)
        at java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:743)
        at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:647)
        at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:774)
        ... 18 more
    Suppressed: javax.servlet.UnavailableException: Servlet class my.package_name.VersionServlet is not a javax.servlet.Servlet
        at org.eclipse.jetty.servlet.ServletHolder.checkServletType(ServletHolder.java:514)
        at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:386)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
        at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:749)
        at java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:483)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
        at java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:313)
        at java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:743)
        at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:647)
        at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:774)
        ... 18 more
    [... the same exception for each of my servlets]
Caused by: [CIRCULAR REFERENCE: javax.servlet.UnavailableException: Servlet class my.package_name.PurgeServlet is not a javax.servlet.Servlet]

Failed startup of context c.g.a.r.j.AppEngineWebAppContext@1ac03879{/,file:///base/data/home/apps/s~MY_APP_ID/20240128t073546.458064643040632226/,UNAVAILABLE}{/base/data/home/apps/s~MY_APP_ID/20240128t073546.458064643040632226}
MultiException[javax.servlet.UnavailableException: Servlet class my.package_name.PurgeServlet is not a javax.servlet.Servlet, javax.servlet.UnavailableException: Servlet class my.package_name.VersionServlet is not a javax.servlet.Servlet, ...]
    at org.eclipse.jetty.util.MultiException.ifExceptionThrow(MultiException.java:122)
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:776)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:379)
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1449)
    at com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.startWebapp(AppEngineWebAppContext.java:274)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1414)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:916)
    at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:288)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:524)
    at com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.doStart(AppEngineWebAppContext.java:218)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
    at com.google.apphosting.runtime.jetty9.AppVersionHandlerFactory.doCreateHandler(AppVersionHandlerFactory.java:206)
    at com.google.apphosting.runtime.jetty9.AppVersionHandlerFactory.createHandler(AppVersionHandlerFactory.java:124)
    at com.google.apphosting.runtime.jetty9.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:82)
    at com.google.apphosting.runtime.jetty9.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:176)
    at com.google.apphosting.runtime.RequestRunner.dispatchServletRequest(RequestRunner.java:262)
    at com.google.apphosting.runtime.RequestRunner.dispatchRequest(RequestRunner.java:227)
    at com.google.apphosting.runtime.RequestRunner.run(RequestRunner.java:193)
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:273)
    at java.lang.Thread.run(Thread.java:750)
    Suppressed: javax.servlet.UnavailableException: Servlet class my.package_name.PurgeServlet is not a javax.servlet.Servlet
        at org.eclipse.jetty.servlet.ServletHolder.checkServletType(ServletHolder.java:514)
        at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:386)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
        at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:749)
        at java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:483)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
        at java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:313)
        at java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:743)
        at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:647)
        at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:774)
        ... 18 more
    Suppressed: javax.servlet.UnavailableException: Servlet class my.package_name.VersionServlet is not a javax.servlet.Servlet
        at org.eclipse.jetty.servlet.ServletHolder.checkServletType(ServletHolder.java:514)
        at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:386)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
        at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:749)
        at java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:483)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
        at java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:313)
        at java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:743)
        at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:647)
        at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:774)
        ... 18 more
    [... the same exception for all of my servlets]     
Caused by: [CIRCULAR REFERENCE: javax.servlet.UnavailableException: Servlet class my.package_name.PurgeServlet is not a javax.servlet.Servlet]

Uncaught exception from servlet
MultiException[javax.servlet.UnavailableException: Servlet class my.package_name.PurgeServlet is not a javax.servlet.Servlet, javax.servlet.UnavailableException: Servlet class my.package_name.VersionServlet is not a javax.servlet.Servlet, ...]
    at org.eclipse.jetty.util.MultiException.ifExceptionThrow(MultiException.java:122)
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:776)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:379)
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1449)
    at com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.startWebapp(AppEngineWebAppContext.java:274)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1414)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:916)
    at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:288)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:524)
    at com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.doStart(AppEngineWebAppContext.java:218)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
    at com.google.apphosting.runtime.jetty9.AppVersionHandlerFactory.doCreateHandler(AppVersionHandlerFactory.java:206)
    at com.google.apphosting.runtime.jetty9.AppVersionHandlerFactory.createHandler(AppVersionHandlerFactory.java:124)
    at com.google.apphosting.runtime.jetty9.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:82)
    at com.google.apphosting.runtime.jetty9.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:176)
    at com.google.apphosting.runtime.RequestRunner.dispatchServletRequest(RequestRunner.java:262)
    at com.google.apphosting.runtime.RequestRunner.dispatchRequest(RequestRunner.java:227)
    at com.google.apphosting.runtime.RequestRunner.run(RequestRunner.java:193)
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:273)
    at java.lang.Thread.run(Thread.java:750)
    Suppressed: javax.servlet.UnavailableException: Servlet class my.package_name.PurgeServlet is not a javax.servlet.Servlet
        at org.eclipse.jetty.servlet.ServletHolder.checkServletType(ServletHolder.java:514)
        at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:386)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
        at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:749)
        at java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:483)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
        at java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:313)
        at java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:743)
        at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:647)
        at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:774)
        ... 18 more
    Suppressed: javax.servlet.UnavailableException: Servlet class my.package_name.VersionServlet is not a javax.servlet.Servlet
        at org.eclipse.jetty.servlet.ServletHolder.checkServletType(ServletHolder.java:514)
        at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:386)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
        at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:749)
        at java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:483)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
        at java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:313)
        at java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:743)
        at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:647)
        at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:774)
        ... 18 more
    [... the same exception for all of my servlets]     

也就是说,我的所有 servlet 都获得了

javax.servlet.UnavailableException: Servlet class my.package_name.<Any>Servlet is not a javax.servlet.Servlet
。正如我之前提到的,源代码尚未被触及,通过 eclipse 插件部署时一切正常,并且我的所有 servlet 都在扩展
javax.servlet.http.HttpServlet

部署后,欢迎文件会正确提供,因此我认为

web.xml
不会导致问题。但是,在本地运行时,虽然相同的异常会打印到控制台,但欢迎文件和
http://localhost:8080/_ah/admin
的管理控制台都显示
HTTP ERROR 503 Service Unavailable

我的

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>Version_Server</groupId>
    <artifactId>Version_Server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <!-- The same error happens when using  -->
            <!--
            <artifactId>servlet-api</artifactId>
            <version>2.4</version> 
            -->         
            <type>jar</type>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.googlecode.objectify</groupId>
            <artifactId>objectify</artifactId>
            <version>5.1.22</version>
        </dependency>
        <dependency>
            <groupId>com.google.appengine</groupId>
            <artifactId>appengine-api-1.0-sdk</artifactId>
            <version>1.9.34</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20231013</version>
        </dependency>
    </dependencies>

    <build>
        <sourceDirectory>src</sourceDirectory>
        <resources>
            <resource>
                <directory>src</directory>
                <excludes>
                    <exclude>**/*.java</exclude>
                </excludes>
            </resource>
        </resources>

        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.3</version>
                <configuration>
                    <warSourceDirectory>war</warSourceDirectory>
                    <failOnMissingWebXml>true</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>appengine-maven-plugin</artifactId>
                <version>2.4.4</version>
            </plugin>
        </plugins>
    </build>
</project>

war/WEB_INF/web.xml
如下:

<?xml version="1.0" encoding="utf-8"?>
<web-app 
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
    http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    version="3.1"
    >

   <security-constraint>
        <web-resource-collection>
            <web-resource-name>purge</web-resource-name>
            <url-pattern>/purge</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>admin</role-name>
        </auth-constraint>
   </security-constraint>

    <servlet>
        <servlet-name>PurgeServlet</servlet-name>
        <servlet-class>my.package_name.PurgeServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>PurgeServlet</servlet-name>
        <url-pattern>/purge</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>VersionServlet</servlet-name>
        <servlet-class>my.package_name.VersionServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>VersionServlet</servlet-name>
        <url-pattern>/latestVersion</url-pattern>
    </servlet-mapping>
    
    <!-- the rest of the servlets -->

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>

</web-app>

PurgeServlet.java

package my.package_name;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

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

import my.package_name.data.Request;

import com.googlecode.objectify.ObjectifyService;

/**
 *
 *
 */
@SuppressWarnings("serial")
public class PurgeServlet extends HttpServlet {

    /**
     *
     */
    private void setupObjectify() {

        ObjectifyService.begin();
        ObjectifyService.register(Request.class);
    }

    @Override
    public void doPost(HttpServletRequest req, HttpServletResponse resp) {
        setupObjectify();

        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.YEAR, -1);

        Date date = calendar.getTime();

        List<Request> requests =
            ObjectifyService.ofy().load().type(Request.class).
                filter("date <", date).limit(300).list();

        ObjectifyService.ofy().delete().entities(requests);
    }

    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
        doPost(req, resp);
    }
}

VersionServlet.java

package my.package_name;

import java.io.IOException;

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

import my.package_name.data.LatestVersion;
import my.package_name.data.Request;
import my.package_name.util.StringUtil;

import com.google.appengine.api.taskqueue.Queue;
import com.google.appengine.api.taskqueue.QueueFactory;
import com.google.appengine.api.taskqueue.TaskOptions;
import com.googlecode.objectify.ObjectifyService;

/**
 *
 *
 */
@SuppressWarnings("serial")
public class VersionServlet extends HttpServlet {

    /**
     *
     */
    private void setupObjectify() {

        ObjectifyService.begin();
        ObjectifyService.register(Request.class);
        ObjectifyService.register(LatestVersion.class);
    }

    /**
     *
     * @param request
     */
    private void persistRequest(Request request) {
        ObjectifyService.ofy().save().entity(request);
    }

    /**
     *
     * @param packageName
     * @return
     */
    private LatestVersion getLatestVersion(String packageName) {

        LatestVersion latestVersion =
            ObjectifyService.ofy().load().type(LatestVersion.class).
                id(packageName).now();

        if (latestVersion == null) {
            latestVersion = new LatestVersion("", "0", "");
        }

        return latestVersion;
    }

    /**
     *
     * @param latestVersion
     * @param response
     */
    private void printLatestVersion
        (
            LatestVersion       latestVersion,
            HttpServletResponse response
        ) {

        if (latestVersion != null) {
            try {
                response.setContentType("text/plain");
                response.getWriter().println(latestVersion.toJSON());
            } catch (IOException e) {
                // do nothing
            }
        }
    }

    /**
     *
     */
    private void purgeOldRecords() {

        Queue queue = QueueFactory.getDefaultQueue();
        queue.add(TaskOptions.Builder.withUrl("/purge"));
    }

    @Override
    public void doPost(HttpServletRequest req, HttpServletResponse resp) {

        String packageName = req.getParameter("packageName");
        String versionCode = req.getParameter("versionCode");

        if (!StringUtil.isDefined(packageName) ||
            !StringUtil.isDefined(versionCode)) {
                return;
        }

        setupObjectify();

        Request request = new Request(packageName, versionCode);
        persistRequest(request);
        printLatestVersion(getLatestVersion(packageName), resp);

        purgeOldRecords();
    }

    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
        doPost(req, resp);
    }
}

在 JDK 1.8.0 和 JDK 11.0.9 之间切换不会改变任何内容。我该如何解决这个问题?

编辑

war/WEB_INF/appengine-web.xml
如下:

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">

    <runtime>java8</runtime>
    
    <threadsafe>true</threadsafe>
    
    <!-- Configure java.util.logging -->
    <system-properties>
        <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
    </system-properties>
    
</appengine-web-app>
java maven google-app-engine servlets java-8
1个回答
0
投票

看来我的IDE(eclipse)不断重建

war/WEB-INF/classes
目录中的所有内容,而maven的输出位于
target/classes
中。退出 IDE 并删除
war/WEB-INF/classes
目录解决了该问题。

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