0

ここで2つの同様の投稿を見つけましたが、1つは回答されておらず、もう1つはAndroidに関するものでした。Spring Boot プロジェクトがあり、アプリケーション内の GCP ストレージ ファイルにアクセスしたいと考えています。

ローカルではすべてが正常に機能し、バケットにアクセスして、ファイルを読み取り、ストレージに保存できます。しかし、gcp kubernetes にアップロードすると、次の例外が発生します。

"java.nio.file.FileSystemNotFoundException: プロバイダ "gs" が java.nio.file.Paths.get(Paths.java:147) にインストールされていません ~[na:1.8.0_212] xx.xx.StorageService.saveFile(StorageService) に.java:64) ~[classes!/:0.3.20-SNAPSHOT]

それが表示される私のコード行は次のようになります:

public void saveFile(MultipartFile multipartFile, String path) {
    String completePath = filesBasePath + path;
    
    Path filePath = Paths.get(URI.create(completePath)); // <- exception appears here
    Files.createDirectories(filePath);
    multipartFile.transferTo(filePath);
        
}

}

completePath は、「gs://my-storage/path/to/file/image.jpg」のような結果になる可能性があります。

次の依存関係があります。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-gcp-starter-storage</artifactId>
    <version>1.2.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-nio</artifactId>
    <version>0.122.5</version>
</dependency>

誰がどこを見ればいいのか手がかりを持っていますか? インフラストラクチャ以外の唯一の実際の違いは、ドキュメントによると必要ないため、kubernetes で認証を明示的に使用しないことです。

Compute Engine、Kubernetes Engine、App Engine などの Google Cloud Platform 環境から Google Cloud ライブラリを使用する場合、追加の認証手順は必要ありません。

4

3 に答える 3

1

ここでの従来の Spring ブート パッケージは、必要な方法で依存関係をパッケージ化していないようです。通常、次のようなものが表示されます。

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.4.5</version>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

ただし、「gs」プロバイダーにアクセスできるようにするには、「lib/」フォルダーにある必要があります。依存関係をコピーしてから JAR を作成することで、手動でパッケージ化できます (これはspringboot-helloworldサンプルに基づいています。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
      <execution>
          <id>copy-dependencies</id>
          <phase>prepare-package</phase>
          <goals>
              <goal>copy-dependencies</goal>
          </goals>
          <configuration>
              <outputDirectory>
                  ${project.build.directory}/lib
              </outputDirectory>
          </configuration>
      </execution>
  </executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
    <archive>
        <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>
              com.example.appengine.springboot.SpringbootApplication
            </mainClass>
        </manifest>
    </archive>
</configuration>
</plugin>

最初は GitHub に投稿されました

于 2021-05-13T22:19:10.190 に答える
0

gs:// 構文は普遍的ではありません。特定の Google ツールやサービス (gsutil など) でサポートされていますが、多くの URL ライブラリでは知られていません。

GCS API の 1 つで HTTP 構文を使用するように変更できます。

https://my-storage.storage.googlapis.com/path/to/file/image.jpg

上記の HTTP URL は認証を必要とするため、おそらく代わりに、認証された GCS リクエストの作成をサポートするgoogle-cloud-javaなどのライブラリを使用することをお勧めします。

于 2021-02-10T21:38:50.353 に答える