不再支持 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>
看来我的IDE(eclipse)不断重建
war/WEB-INF/classes
目录中的所有内容,而maven的输出位于target/classes
中。退出 IDE 并删除 war/WEB-INF/classes
目录解决了该问题。