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:
-
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).
-
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.
Problem
google-cloud-niois commonly used attestscope to provide ajava.nio.file.FileSystemProviderforgs://URIs in tests. However, it depends ongoogle-cloud-storageat compile scope, which pulls in ~15 transitive dependencies.When a project already has
google-cloud-storageat compile scope (e.g. viaspring-cloud-gcp-starter-storage), addinggoogle-cloud-nioat test scope can cause Maven's "nearest definition wins" rule to silently re-resolvegoogle-cloud-storageand 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, causingClassNotFoundExceptionat startup.The current workaround is to manually exclude
google-cloud-storagefromgoogle-cloud-nio:This is fragile and non-obvious. Every consumer hitting this has to independently discover the problem and apply the same fix.
Suggestion
One of:
Separate artifact: publish a
google-cloud-nio-testingartifact that contains only theFileSystemProviderregistration and declaresgoogle-cloud-storageasprovidedoroptional. This matches the pattern used by other GCP libraries (e.g.google-cloud-bigtable-emulator-core).Mark
google-cloud-storageasoptional: in the existinggoogle-cloud-nioPOM, declaregoogle-cloud-storageas<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.