我曾試圖將一個spring-boot應用部署到google云上。它在本地運行良好,但是當把它部署到 App Engine 并試圖訪問登陸頁面時,我得到了 404 錯誤和大量的 InvocationTargetExceptions:
java.io.IOException: java.lang.reflect.InvocationTargetException
在org.apache.tomcat.util.compat.Jre9Compat.jarFileNewInstance(Jre9Compat.java:209) ~[tomcat-embed-core-9.0.46.jar!/:na]
在org.apache.tomcat.util.scan.JarFileUrlJar.<init>(JarFileUrlJar.java:65) ~[tomcat-embed-core-9.0.46.jar!/:na]
在org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:49) ~[tomcat-embed-core-9.0.46.jar!/:na]
在org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:383) ~[tomcat-embed-core-9.0.46.jar!/:na]
在org.apache.tomcat.util.scan.StandardJarScanner.processURLs(StandardJarScanner.java:318) ~[tomcat-embed-core-9.0.46.jar!/:na]
在org.apache.tomcat.util.scan.StandardJarScanner.doScanClassPath(StandardJarScanner.java:282) ~[tomcat-embed-core-9.0.46.jar!/:na]
在org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:233) ~[tomcat-embed-core-9.0.46.jar!/:na]
在org.apache.jasper.servlet.TldScanner.scanJars(TldScanner.java:262) ~[tomcat-embed-jasper-9.0.46.jar!/:na]
在org.apache.jasper.servlet.TldScanner.scan(TldScanner.java:104) ~[tomcat-embed-jasper-9.0.46.jar!/:na]
在org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:83) ~[tomcat-embed-jasper-9.0.46.jar!/:na]
在org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5161) ~[tomcat-embed-core-9.0.46.jar!/:na]
在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.00.46.jar!/:na]
在org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) ~[tomcat-embed-core-9.0.46.jar!/:na]
在org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) ~[tomcat-embed-core-9.0.46.jar!/:na]
在java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-9.0.46.jar!/:na]
在java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) ~[na:na]
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) ~[tomcat-embed-core-9.0.46.jar! /:na]
在org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:829) ~[tomcat-embed-core-9.00.46.jar!/:na]
在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.00.46.jar!/:na]
在org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) ~[tomcat-embed-core-9.0.46.jar!/:na]
在org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) ~[tomcat-embed-core-9.0.46.jar!/:na]
在java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-9.0.46.jar!/:na]
在java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) ~[na:na]
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) ~[tomcat-embed-core-9.0.46.jar! /:na]
在org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262) ~[tomcat-embed-core-9.0.46.jar!/:na]
在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.00.46.jar!/:na]
在org.apache.catalina.core.StandardService.startInternal(StandardService.java:433) ~[tomcat-embed-core-9.00.46.jar!/:na]
在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.00.46.jar!/:na]
在org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930) ~[tomcat-embed-core-9.00.46.jar!/:na]
在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.00.46.jar!/:na]
在org.apache.catalina.startup.Tomcat.start(Tomcat.java:486) ~[tomcat-embed-core-9.0.46.jar!/:na]
在org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:123) ~[spring-boot-2. 5.0.jar! /:2.5.0]
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:104) ~[spring-boot-2。 5.0.jar! /:2.5.0]
在org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory. java:450) ~[spring-boot-2.5.0.jar! /:2.5.0]
at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:199) ~[spring-boot-2. 5.0.jar! /:2.5.0]
在org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:182) ~[spring-boot-2.5.0.jar! /:2.5.0]
在org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:160) ~[spring-boot-2.5.0.jar! /:2.5.0]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:577) ~[spring-text-5. 3.7.jar! /:5.3.7]
在org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.5.0.jar! /:2.5.0]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) ~[spring-boot-2. 5.0.jar! /:2.5.0]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:438) ~[spring-boot-2. 5.0.jar! /:2.5.0]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:337) ~[spring-boot-2. 5.0.jar! /:2.5.0]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1336) ~[spring-boot-2. 5.0.jar! /:2.5.0]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1325) ~[spring-boot-2. 5.0.jar! /:2.5.0]
at samuelb.capripol.CapripolApplication.main(CapripolApplication.java:17) ~[classes! /:0.0.1-SNAPSHOT]
在java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) ~[capripol-0。 0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
at org.springframework.boot.loader.Launcher. launch(Launcher.java:108) ~[capripol-0。 0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
at org.springframework.boot.loader.Launcher. launch(Launcher.java:58) ~[capripol-0。 0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88) ~[capripol-0。 0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
導致的原因是:java.lang.reflect.InvocationTargetException。null 導致的。
在java.base/jdk.internal.reflect.GeneratedConstructorAccessor33.newInstance(Unknown Source) ~[na:na] 。
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na]
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) ~[na:na]
at org.apache.tomcat.util.compat.Jre9Compat.jarFileNewInstance(Jre9Compat.java:206) ~[tomcat-embed-core-9.0.46.jar! /:na]
... 54普通框架被省略。
原因是:java.nio.file.NoSuchFileException。/workspace/lib/modelmapper-2.3.5.jar
在java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92) ~[na:na]
在java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111) ~[na:na]
在java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116) ~[na:na]
at java.base/sun.nio.fs.UnixFileAttributeViews$Basic.readAttributes(UnixFileAttributeViews.java:55) ~[na:na]
at java.base/sun.nio.fs.UnixFileSystemProvider.readAttributes(UnixFileSystemProvider.java:149) ~[na:na]
at java.base/sun.nio.fs.LinuxFileSystemProvider.readAttributes(LinuxFileSystemProvider.java:99) ~[na:na]
at java.base/java.nio.file.Files.readAttributes(Files.java:1764) ~[na:na]
at java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1239) ~[na:na]
at java.base/java.util.zip.ZipFile$CleanableResource.<init>(ZipFile.java:732) ~[na:na]
at java.base/java.util.zip.ZipFile$CleanableResource.get(ZipFile.java:849) ~[na:na]
at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:247) ~[na:na]
at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:177) ~[na:na]
at java.base/java.util.jar.JarFile.<init>(JarFile.java:348) ~[na:na]
... 58普通框架被省略了
可能還值得一提的是,使用gcloud app deploy進行部署時,出現了一個錯誤,說我超過了10000個檔案的限制,這不是真的,該應用程式甚至沒有500個。
app.yaml:
runtime: java11
# 這個沒有區別
# 入口: java -Xmx64m -jar capripol-0.0.1-SNAPSHOT.jar
instance_class: F2
處理程式。
- url: /.*
安全:總是
redirect_http_response_code: 301。
腳本:自動
- 網址。/login
安全:總是
redirect_http_response_code: 301 301
腳本:自動
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<專案xmlns="http://maven.apache.org/POM/4.0.0"/span> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/span>
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.00</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<版本>2.5.0</version>
<relativePath/><!--從版本庫中查找父版-->。
</parent>
<groupId>SamuelB</groupId>
<artifactId>capripol</artifactId>
<版本>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Capripol</name>
<描述>演示專案for Spring Boot</description>
<屬性>
<java.version>11</java.version>
</properties>
<!-- <屬性>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reports.outputEncoding>UTF-8</project.reports.outputEncoding>
<webjars-bootstrap.version>3.3.6</webjars-bootstrap.version>
<webjars-jquery-ui.version>1.11.4</webjars-jquery-ui.version>
<webjars-jquery.version>2.2.4</webjars-jquery.version>
<wro4j.version>1.8.0</wro4j.version>
<jacoco.version>0.8.5</jacoco.version>
<nohttp-checkstyle.version>0.0.4.RELEASE</nohttp-checkstyle.version>
<spring-format.version>0.0.25</spring-format.version> -->
<! -- </properties> -->
<dependencyManagement>
<依賴性>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId> spring-cloud-gcp-dependencies</artifactId>
<版本>1.0.0.RC1</version>
<type>pom</type>
<范圍>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<依賴性>
<依賴性>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-sql-mysql</artifactId>
</dependency>
<依賴性>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gcp-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<依賴性>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<依賴性>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<范圍>提供</范圍>。
</dependency>
<依賴性>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId> tomcat-embed-jasper</artifactId>
<范圍>提供</范圍>。
</dependency>
<依賴性>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<依賴性>
<groupId>org.springframework.security</groupId>
<artifactId> spring-security-taglibs</artifactId>
</dependency>
<依賴性>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<依賴性>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<依賴性>
<groupId> mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<范圍>運行時</范圍>。
</dependency>
<依賴性>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<范圍>測驗</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<依賴性>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<版本>1.2.17</version>
</dependency>
<依賴性>
<groupId>com.speedxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<版本>2.11.2</version>
</dependency>
<依賴性>
<groupId>com.speedxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<版本>2.11.2</version>
</dependency>
<依賴性>
<groupId>org.modelmapper</groupId>
<artifactId> modelmapper</artifactId>
<版本>2.3.5</version>
</dependency>
</dependencies>
<repositories>
<!-- 使用Spring Milestone Repository -->
<repository>
<id>spring-milestones</id>
<name>Spring Milestone</name>
<url>https://repo.spring.io/milestone</url>
<快照>
<啟用>false</enabled>
</snapshots>
</repository>
</repositories>
<build>
<plugins>
<插件>
<!-- 建立一個可執行的JAR -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<版本>3.1.0</version>
<配置>
<歸檔>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>Samuelb.capripol.CapripolApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<插件>
<groupId>org.springframework.boot</groupId>
<artifactId> spring-boot-maven-plugin</artifactId>
</plugin>
<插件>
<groupId>com.google.cloud.tools</groupId>
<artifactId>appengine-maven-plugin</artifactId>
<版本>2.1.0</version>
<配置>
<版本>1</version>
<projectId>GCLOUD_CONFIG</projectId>
</configuration>
</plugin>
</plugins>
</build>
</project>
目錄結構:
希望得到任何幫助。
編輯:
這是gcloud應用部署的除錯日志--verbosity=debug
DEBUG: (gcloud.app.deploy) INVALID_ARGUMENT。這個部署有太多的檔案。新版本被限制在10000個檔案for thisapp。
- '@type': type.googleapis.com/google.rpc.BadRequest
fieldViolations:
- 描述。這個部署有太多的檔案。新版本被限制在10000以內。
檔案for this應用程式。
欄位:version.deployment.files[...]。
回溯(最近一次呼叫)。
檔案 "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/calliope/cli.py", 行 984, in Execute
resources = calliope_command.Run(cli=self, args=args)
檔案 "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/calliope/backend.py", 行 809, in Run
resources = command_instance.Run(args)
檔案 "/usr/lib/google-cloud-sdk/lib/surface/app/deploy.py", 行 130, in Run
use_legacy_apis=args.use_legacy_apis)
檔案 "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/command_lib/app/deploy_util.py", 行 691, in RunDeploy
service_account=service_account)
檔案 "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/command_lib/app/deploy_util.py", 行 463, in Deploy
extra_config_settings, service_account)
檔案 "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/api_lib/app/appengine_api_client.py", 行 177, in DeployService
service_account_email)
檔案 "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/api_lib/app/appengine_api_client.py", 行 260, in _CreateVersion
return self.client.apps_services_versions.Create(create_request)
檔案 "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/third_party/apis/appengine/v1/appengine_v1_client.py"/span>, 行 830, in Create
config, request, global_params=global_params)
檔案 "/usr/bin/../lib/google-cloud-sdk/lib/third_party/apitools/base/py/base_api.py", 行 737, in _RunMethod
return self.ProcessHttpResponse(method_config, http_response, request)
檔案 "/usr/bin/../lib/google-cloud-sdk/lib/third_party/apitools/base/base_api.py", 行 743, in ProcessHttpResponse
self.__ProcessHttpResponse(method_config, http_response, request))
檔案 "/usr/bin/../lib/google-cloud-sdk/lib/third_party/apitools/base/base_api.py", 行 610, in __ProcessHttpResponse
http_response, method_config=method_config, request=request)
apitools.base.py.exceptions.HttpBadRequestError: HttpError accessing <https://appengine.googleapis.com/v1/apps/pollog/services/default/versions? alt=json>: response: <{' vary': 'Origin, X-Origin, Referer', 'content-type': 'application/json; charset=UTF-8', 'date': 'Sun, 22 Aug 2021 01:18:11 GMT', 'server': 'ESF', 'cache-control': 'private', 'x-xss-protection': '0', 'x-fram-options': 'SAMEORIGIN', 'x-content-type-options': 'nosniff', 'transfer-encoding': 'chunked', 'status': '400', 'content-length': '517', '-content-encoding': 'gzip'}>, content <{.
"error": {
"code": 400,
"message": "這個部署有太多的檔案。新版本對這個應用程式限制在10000個檔案。"。
"狀態"。"INVALID_ARGUMENT"。
"詳細資訊": [
{
"@type": "type.googleapis.com/google.rpc.BadRequest"。
"fieldViolations": [
{
"field": "版本.部署.檔案[...]"。
"描述"。"這個部署有太多的檔案。新版本對這個應用程式限制在10000個檔案。"。
}
]
}
]
}
}
uj5u.com熱心網友回復:
你的問題可能與你在配置maven-jar-plugin時,在MANIFEST classpath中包含對你的應用程式依賴的參考有關。
當您使用spring-boot-maven-plugin重新打包您的應用程式時,它將生成一個檔案,其中您對所述庫的參考已不再有效。
其結果是,當 App Engine 嘗試啟動您的應用程式時,您的 jar 將被加載,并且當它嘗試查找不同的 classpath 依賴關系時,會引發 NoSuchFileException 錯誤。
為了避免這個問題,請嘗試從你的maven-jar-plugin中洗掉以下配置:
<configuration>
<archive>/span>
<manifest>/span>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>samuelb.capripol.CapripolApplication</mainClass>
</manifest>/span>
</archive>/span>
</configuration>/span>
Spring將負責提供正確的依賴項和主類。
關于10,000個檔案的限制問題,請審查您的存檔內容,看看您是否可以將其優化為僅使用實際需要的元素。
由于您可能正在使用 App Engine Flexible 環境,請嘗試執行 ssh 進入您的配置的虛擬機實體,看看發生了什么事:
您可能正在使用 App Engine Flexible 環境。
gcloud app instances ssh --service=s1 --version=v1 i1 --container=gaeapp
uj5u.com熱心網友回復:
關于超過10,000個檔案限制的錯誤顯示出來,因為庫檔案也被計算在內。
這看起來是谷歌可以改進的地方,所以你可以創建一個關于這個設計的公共問題追蹤器,并要求一個解決方案,允許不計算庫檔案,或者,例如,增加這個限制。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/317569.html
標籤:

