lib 和 classes 文件夹是使用 IntelliJ 暂存和部署的,但 gcloud 命令不包括它们
Posted
技术标签:
【中文标题】lib 和 classes 文件夹是使用 IntelliJ 暂存和部署的,但 gcloud 命令不包括它们【英文标题】:The lib and classes folders are staged and deployed with IntelliJ but gcloud command does not include them 【发布时间】:2022-01-24 01:50:03 【问题描述】:我有一个 Java 8 Spring Boot GAE 标准应用程序,我使用 IntelliJ IDE(GAE 应用程序的云代码插件)。
我使用 AppEngine-web.xml。
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<threadsafe>true</threadsafe>
<sessions-enabled>true</sessions-enabled>
<runtime>java8</runtime>
<application>***</application>
<service>***</service>
<version>***</version>
<url-stream-handler>urlfetch</url-stream-handler>
<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
</system-properties>
<async-session-persistence enabled="true" />
<instance-class>F2</instance-class>
<resource-files>
<include path="/**.json" />
</resource-files>
<use-google-connector-j>true</use-google-connector-j>
<env-variables>
<env-var name="GOOGLE_APPLICATION_CREDENTIALS"
value="WEB-INF/***.json" />
</env-variables>
</appengine-web-app>
当我使用 IntelliJ 部署我的 GAE 应用程序时,这些文件夹在我的 staging 中生成,并且一切正常;
这是我在 IntelliJ 上运行配置的快照
当我使用 gcloud 命令部署它时会出现问题:
gcloud app deploy src/main/webapp/WEB-INF/appengine-web.xml --version=something --promote --stop-previous-version --verbosity=debug
这是生成的暂存文件夹:
我的应用根目录中有.gitignore
文件;我删除了它以检查它是否造成了问题并且没有运气,我也对.cloudignore
做了同样的事情。
gcloud deploy 跳过文件,输出如下:
DEBUG: Loading runtimes experiment config from [gs://runtime-builders/experiments.yaml]
INFO: Reading [<googlecloudsdk.api_lib.storage.storage_util.ObjectReference object at 0x0000000006BB8988>]
DEBUG:
Traceback (most recent call last):
File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\api_lib\app\runtime_builders.py", line 269, in _Read
with contextlib.closing(storage_client.ReadObject(object_)) as f:
File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\api_lib\storage\storage_api.py", line 317, in ReadObject
object_=object_ref, err=http_exc.HttpException(err)))
BadFileException: Could not read [<googlecloudsdk.api_lib.storage.storage_util.ObjectReference object at 0x0000000006BB8988>]. Please retry: HTTPError 404: No such object: runtime-builders/experiments.yaml
DEBUG: Experiment config file could not be read. This error is informational, and does not cause a deployment to fail. Reason: Unable to read the runtimes experiment config: [gs://runtime-builders/experiments.yaml], error: Could not read [<googlecloudsdk.api_lib.storage.storage_util.ObjectReference object at 0x0000000006BB8988>]. Please retry: HTTPError 404: No such object: runtime-builders/experiments.yaml
Traceback (most recent call last):
File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\lib\surface\app\deploy.py", line 146, in _ServerSideExperimentEnabled
runtimes_builder_root)
File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\api_lib\app\runtime_builders.py", line 524, in LoadFromURI
.format(uri, e))
ExperimentsError: Unable to read the runtimes experiment config: [gs://runtime-builders/experiments.yaml], error: Could not read [<googlecloudsdk.api_lib.storage.storage_util.ObjectReference object at 0x0000000006BB8988>]. Please retry: HTTPError 404: No such object: runtime-builders/experiments.yaml
WARNING: <application> and <version> elements in `appengine-web.xml` are not respected
INFO: Executing staging command: [C:\Program Files\Common Files\Oracle\Java\javapath\java.exe -classpath C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\tools\java\lib\appengine-tools-api.jar com.google.appengine.tools.admin.AppCfg --enable_new_staging_defaults stage E:***\src\main\webapp c:\users\***\appdata\local\temp\tmp1nhtxn\tmpoizcfc]
DEBUG: Executing command: [u'C:\\Program Files\\Common Files\\Oracle\\Java\\javapath\\java.exe', u'-classpath', u'C:\\Program Files (x86)\\Google\\Cloud SDK\\google-cloud-sdk\\platform\\google_appengine\\google\\appengine\\tools\\java\\lib\\appengine-tools-api.jar', u'com.google.appengine.tools.admin.AppCfg', u'--enable_new_staging_defaults', u'stage', u'E:***\\src\\main\\webapp', 'c:\\users\\***\\appdata\\local\\temp\\tmp1nhtxn\\tmpoizcfc']
INFO: ------------------------------------ STDOUT ------------------------------------
Reading application configuration data...
Beginning interaction for module ***...
0% Scanning for jsp files.
2021-12-22 15:11:47.738:INFO::main: Logging initialized @167ms to org.eclipse.jetty.util.log.StdErrLog
2021-12-22 15:11:48.115:INFO:oeja.AnnotationConfiguration:main: Scanning elapsed time=0ms
0% Generated git repository information file.
Success.
Temporary staging for module *** directory left in C:\Users\***\AppData\Local\Temp\tmp1nhtxn\tmpoizcfc
------------------------------------ STDERR ------------------------------------
2021-12-22 15:11:47.221:INFO::main: Logging initialized @725ms to org.eclipse.jetty.util.log.StdErrLog
--------------------------------------------------------------------------------
【问题讨论】:
【参考方案1】:我已经设法在同一个项目中复制了这个类似的问题。这是因为 Java 8 可能被视为旧版本,但最佳实践仍然适用,即在提交部署时使用 App Engine Maven 插件。完整的文档可以通过 link 找到。
我更改了 gcloud 命令:
gcloud app deploy src/main/webapp/WEB-INF/appengine-web.xml
--version=something --promote --stop-previous-version --verbosity=debug
到这里:
mvn clean package appengine:deploy
此过程需要一些时间,因为它会在部署项目之前清理并重新安装包。
这是一个类似于您的项目的Github link,您可以尝试一下,因为这个对我有用。
编辑:
适用于 Java 8 的 Google App Maven 插件仍会基于此Github link 定期更新。
独立的 App Engine SDK 和基于它的 Maven 插件 (com.google.appengine:appengine-maven-plugin
) 现已关闭。您必须使用 Cloud SDK 工具并迁移到基于 Cloud SDK 的 Maven 插件 (com.google.cloud.tools:appengine-maven-plugin
)。完整的描述和步骤可以通过这个link on how to use Maven找到。
这就是为什么我们使用mvn clean package appengine:deploy
非常重要。
我还将包含来自pom.xml
的代码 sn-p,其中包含您需要设置的配置:
<plugins>
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>appengine-maven-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<projectId>GCLOUD_CONFIG</projectId>
<version>GCLOUD_CONFIG</version>
<deploy.promote>true</deploy.promote>
<deploy.stopPreviousVersion>true</deploy.stopPreviousVersion>
</configuration>
</plugin>
完整的文档可以通过这个link containing sample Java codes for handling requests找到 此外,Intellij 还使用了一个名为 Cloud Code 的 Google Cloud 插件,这是一个与 Maven 类似的插件。
我已尝试部署 app.yaml
文件并收到此错误:
ERROR: (gcloud.app.deploy) INVALID_ARGUMENT:
WEB-INF/appengine-web.xml is required for this runtime.
总体而言,如果您想部署 Java 8 项目,则无法使用 gcloud 工具。如果你真的想使用 gcloud,你需要升级到 Java 11。
以下是我用来复制此项目的其他参考资料:
https://cloud.google.com/appengine/docs/standard/java/runtime https://cloud.google.com/appengine/docs/standard/java/config/appref【讨论】:
我还没有尝试过您的解决方案,但有一些潜在的问题:您如何设法通过mvn clean package appengine:deploy
完成这些部分--version=something --promote --stop-previous-version --verbosity=debug
。我正在使用 bitbucket CICD,他们使用 gcloud;所以基本上mvn clean package appengine:deploy
不是一个好方法。根据GCP,此工具已关闭
如果问题是 gcloud,IntelliJ 如何按预期进行部署?
@Mahdi,我已经更新了我的答案。
此外,stopPreviousVersion
仅适用于手动或基本扩展的实例。见cloud.google.com/sdk/gcloud/reference/app/…
伟大的补充。我在我的pom
文件中提到的 sn-p 中没有插件。似乎 Intellij 创建了一个 Google App Engine Deployment.run.xml
文件,其中包含所有部署配置,例如 --promote
等。所以我不确定他们(云代码)是否本质上只使用 Maven 解决方案。我将尝试您的建议,但由于 Bitbucket 使用 gcloud,CICD 问题仍然存在。我正在与他们讨论他们是否可以使用 mvn 方法支持 java8。以上是关于lib 和 classes 文件夹是使用 IntelliJ 暂存和部署的,但 gcloud 命令不包括它们的主要内容,如果未能解决你的问题,请参考以下文章
myeclips WEB-INF 下的classes和lib文件包不见了
IntelliJ idea -- 在WEB-INF下创建两个文件夹:classes 和 lib