[java-storage-nio]: transitive google-cloud-storage dependency causes scope conflicts when used at test scope

Abierto
#12,897 0 comentarios 0 reacciones 1 asignado Ver en GitHub

Los mantenedores suelen responder en 1 día

@Dhriti07 ya está trabajando en esto.

Desde el 25/8/2026.

Evaluación

Este issue todavía no se ha evaluado.

Descripción

api: storage

Problem

google-cloud-nio is commonly used at test scope to provide a java.nio.file.FileSystemProvider for gs:// URIs in tests. However, it depends on google-cloud-storage at compile scope, which pulls in ~15 transitive dependencies.

When a project already has google-cloud-storage at compile scope (e.g. via spring-cloud-gcp-starter-storage), adding google-cloud-nio at test scope can cause Maven's "nearest definition wins" rule to silently re-resolve google-cloud-storage and its transitives at test scope. Build tools that strip test-scoped jars from the runtime image (e.g. Jib) then produce containers with missing classes, causing ClassNotFoundException at startup.

The current workaround is to manually exclude google-cloud-storage from google-cloud-nio:

<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-nio</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>com.google.cloud</groupId>
            <artifactId>google-cloud-storage</artifactId>
        </exclusion>
    </exclusions>
</dependency>

This is fragile and non-obvious. Every consumer hitting this has to independently discover the problem and apply the same fix.

Suggestion

One of:

  1. Separate artifact: publish a google-cloud-nio-testing artifact that contains only the FileSystemProvider registration and declares google-cloud-storage as provided or optional. This matches the pattern used by other GCP libraries (e.g. google-cloud-bigtable-emulator-core).

  2. Mark google-cloud-storage as optional: in the existing google-cloud-nio POM, declare google-cloud-storage as <optional>true</optional>. Consumers already have it on the classpath at compile scope via their GCS integration. This avoids the transitive scope conflict without a new artifact.

Lenguaje dominante
Java
Estrellas
2.1k
Forks
1.2k
Merge medio
2 d 14 h
PR fusionados (30 d)
192

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de googleapis/google-cloud-java

Todos los issues de googleapis/google-cloud-java

Issues similares

Más issues de Java

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.