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文件包不见了

.class文件怎么用

IntelliJ idea -- 在WEB-INF下创建两个文件夹:classes 和 lib

web工程中添加自建userLibary与将jar包放到lib文件夹下的区别

使用IDEA创建一个Servlet应用程序

feifeicms 4.0 几处任意文件删除