diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 0427c3e876a5..e50686c059fa 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -59,7 +59,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- java: [11, 17, 21, 25]
+ java: [11, 17, 21, 25, 26]
steps:
- name: Get current week within the year
id: date
@@ -226,7 +226,7 @@ jobs:
fail-fast: false
matrix:
package: ${{ fromJSON(needs.changes.outputs.packages) }}
- java: [11, 17, 21, 25]
+ java: [11, 17, 21, 25, 26]
steps:
- name: Get current week within the year
id: date
diff --git a/.github/workflows/google-auth-library-java-ci.yaml b/.github/workflows/google-auth-library-java-ci.yaml
index 21373cd62925..e12979f75787 100644
--- a/.github/workflows/google-auth-library-java-ci.yaml
+++ b/.github/workflows/google-auth-library-java-ci.yaml
@@ -42,7 +42,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- java: [11, 17, 21, 25]
+ java: [11, 17, 21, 25, 26]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
diff --git a/.github/workflows/java-bigquery-jdbc-ci.yaml b/.github/workflows/java-bigquery-jdbc-ci.yaml
index 2883253a7529..a2d49580d537 100644
--- a/.github/workflows/java-bigquery-jdbc-ci.yaml
+++ b/.github/workflows/java-bigquery-jdbc-ci.yaml
@@ -49,7 +49,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- java: [11, 17, 21, 25]
+ java: [11, 17, 21, 25, 26]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
diff --git a/.github/workflows/java-bigtable-ci.yaml b/.github/workflows/java-bigtable-ci.yaml
index c0328b1435ce..b935cf9eed1b 100644
--- a/.github/workflows/java-bigtable-ci.yaml
+++ b/.github/workflows/java-bigtable-ci.yaml
@@ -41,7 +41,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- java: [11, 17, 21, 25]
+ java: [11, 17, 21, 25, 26]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
diff --git a/.github/workflows/java-firestore-ci.yaml b/.github/workflows/java-firestore-ci.yaml
index 3118df474f58..f4fac240ee4e 100644
--- a/.github/workflows/java-firestore-ci.yaml
+++ b/.github/workflows/java-firestore-ci.yaml
@@ -41,7 +41,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- java: [11, 17, 21, 25]
+ java: [11, 17, 21, 25, 26]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
diff --git a/.github/workflows/java-pubsub-ci.yaml b/.github/workflows/java-pubsub-ci.yaml
index c4723c36b6f0..f0e9d4f05b80 100644
--- a/.github/workflows/java-pubsub-ci.yaml
+++ b/.github/workflows/java-pubsub-ci.yaml
@@ -41,7 +41,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- java: [11, 17, 21, 25]
+ java: [11, 17, 21, 25, 26]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
diff --git a/.github/workflows/java-spanner-jdbc-ci.yaml b/.github/workflows/java-spanner-jdbc-ci.yaml
index 4cbb5184193a..f3da655c477b 100644
--- a/.github/workflows/java-spanner-jdbc-ci.yaml
+++ b/.github/workflows/java-spanner-jdbc-ci.yaml
@@ -47,7 +47,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- java: [11, 17, 21, 25]
+ java: [11, 17, 21, 25, 26]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
diff --git a/.github/workflows/java-storage-nio-ci.yaml b/.github/workflows/java-storage-nio-ci.yaml
index efddd8ac27fd..c7be8db2a222 100644
--- a/.github/workflows/java-storage-nio-ci.yaml
+++ b/.github/workflows/java-storage-nio-ci.yaml
@@ -47,7 +47,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- java: [11, 17, 21, 25]
+ java: [11, 17, 21, 25, 26]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
diff --git a/.github/workflows/sdk-platform-java-ci.yaml b/.github/workflows/sdk-platform-java-ci.yaml
index 2ec5c3b86c9c..8d4e0f306f2d 100644
--- a/.github/workflows/sdk-platform-java-ci.yaml
+++ b/.github/workflows/sdk-platform-java-ci.yaml
@@ -26,7 +26,7 @@ jobs:
name: sdk-platform-java units
strategy:
matrix:
- java: [ 11, 17, 21, 25 ]
+ java: [ 11, 17, 21, 25, 26 ]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
@@ -164,16 +164,21 @@ jobs:
run: |
bazelisk --batch test //sdk-platform-java/test/integration/... --test_output=errors
- bazel-25:
+ # JDK 24+ permanently disables Security Manager. Bazel's default test runner tries to install it.
+ # We must explicitly disable this behavior using shouldInstallTestSecurityManager=false.
+ bazel-no-security-manager-jdk24-plus:
needs: filter
if: ${{ needs.filter.outputs.library == 'true' }}
runs-on: ubuntu-22.04
- name: sdk-platform-java integration (25)
+ name: sdk-platform-java integration (JDK 24+)
+ strategy:
+ matrix:
+ java: [ 25, 26 ]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
- java-version: 25
+ java-version: ${{ matrix.java }}
distribution: temurin
cache: maven
- run: bazelisk version
diff --git a/.github/workflows/showcase.yaml b/.github/workflows/showcase.yaml
index 6548576f0ca3..bb9901619966 100644
--- a/.github/workflows/showcase.yaml
+++ b/.github/workflows/showcase.yaml
@@ -101,7 +101,7 @@ jobs:
runs-on: ubuntu-22.04
strategy:
matrix:
- java: [ 11, 17, 21, 25 ]
+ java: [ 11, 17, 21, 25, 26 ]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
diff --git a/google-cloud-pom-parent/pom.xml b/google-cloud-pom-parent/pom.xml
index 19e138dab615..e1b3fabd302d 100644
--- a/google-cloud-pom-parent/pom.xml
+++ b/google-cloud-pom-parent/pom.xml
@@ -22,6 +22,10 @@
false
java.header
+ 2.48.0
+
+ -g
@@ -129,6 +133,47 @@
+
+
+ errorprone-jdk11
+
+ [1.8,17)
+
+
+ 2.38.0
+ -g
+
+
+
+
+ errorprone-jdk17
+
+ [17,21)
+
+
+ 2.42.0
+ -g
+
+
+
+
+ errorprone-jdk21
+
+ 21
+
+
+ -XDaddTypeAnnotationsToSymbol=true
+
+
diff --git a/java-bigtable/google-cloud-bigtable/pom.xml b/java-bigtable/google-cloud-bigtable/pom.xml
index 77308d29c87e..cc2ac2d0ea30 100644
--- a/java-bigtable/google-cloud-bigtable/pom.xml
+++ b/java-bigtable/google-cloud-bigtable/pom.xml
@@ -441,6 +441,7 @@
-XDcompilePolicy=simple
--should-stop=ifError=FLOW
-Xplugin:ErrorProne -XepDisableWarningsInGeneratedCode -Xep:MissingSummary:OFF -Xep:InlineMeSuggester:OFF -Xep:AutoValueImmutableFields:OFF -Xep:ObjectEqualsForPrimitives:OFF -Xep:JavaDurationGetSecondsToToSeconds:OFF
+ ${errorprone.javac.args}
-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
-J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
@@ -457,7 +458,7 @@
com.google.errorprone
error_prone_core
- ${error-prone.version}
+ ${errorprone.version}
diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/ClusterTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/ClusterTest.java
index f2f217ab56b5..f7c7bb43cb46 100644
--- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/ClusterTest.java
+++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/ClusterTest.java
@@ -47,7 +47,7 @@ public void testFromProto() {
assertThat(result.getState()).isEqualTo(Cluster.State.READY);
assertThat(result.getServeNodes()).isEqualTo(30);
assertThat(result.getStorageType()).isEqualTo(StorageType.SSD);
- assertThat(result.getKmsKeyName()).isEqualTo(null);
+ assertThat(result.getKmsKeyName()).isNull();
}
@Test
diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/EnvInfoTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/EnvInfoTest.java
index 55df4aee7f82..4c81aeb09396 100644
--- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/EnvInfoTest.java
+++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/EnvInfoTest.java
@@ -23,7 +23,6 @@
import com.google.cloud.opentelemetry.detection.GCPPlatformDetector.SupportedPlatform;
import com.google.common.base.Function;
import com.google.common.base.Supplier;
-import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableMap;
import java.util.Map;
import org.junit.jupiter.api.Test;
@@ -33,7 +32,7 @@
@ExtendWith(MockitoExtension.class)
class EnvInfoTest {
- private static final Supplier NULL_HOST = Suppliers.ofInstance(null);
+ private static final Supplier NULL_HOST = () -> null;
@SuppressWarnings("UnnecessaryLambda")
private static final Function NULL_ENV = (ignored) -> null;
diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/opencensus/MetricsTracerTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/opencensus/MetricsTracerTest.java
index 4472c433f713..e31e58d66423 100644
--- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/opencensus/MetricsTracerTest.java
+++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/opencensus/MetricsTracerTest.java
@@ -218,7 +218,7 @@ public void testReadRowsOpCount() throws InterruptedException {
}
@Test
- @SuppressWarnings("FutureReturnValueIgnored")
+ @SuppressWarnings({"FutureReturnValueIgnored", "NullArgumentForNonNullParameter"})
public void testReadRowsFirstRow() throws InterruptedException {
final long beforeSleep = 50;
final long afterSleep = 50;
diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/test_helpers/VRpcResultSubject.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/test_helpers/VRpcResultSubject.java
index 28b741e09548..ba78793c5a6b 100644
--- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/test_helpers/VRpcResultSubject.java
+++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/test_helpers/VRpcResultSubject.java
@@ -23,7 +23,6 @@
import com.google.common.truth.Subject;
import com.google.rpc.RetryInfo;
import java.time.Duration;
-import java.util.Optional;
import javax.annotation.Nullable;
public final class VRpcResultSubject extends Subject {
@@ -47,12 +46,14 @@ public void hasRetryInfo() {
}
public ComparableSubject retryInfoDelay() {
- return check("retryInfo.delay")
- .that(
- Optional.ofNullable(actual.getRetryInfo())
- .map(RetryInfo::getRetryDelay)
- .map(d -> Duration.ofSeconds(d.getSeconds()).plus(Duration.ofNanos(d.getNanos())))
- .orElse(null));
+ RetryInfo retryInfo = actual.getRetryInfo();
+ Duration delay = null;
+ if (retryInfo != null) {
+ delay =
+ Duration.ofSeconds(retryInfo.getRetryDelay().getSeconds())
+ .plus(Duration.ofNanos(retryInfo.getRetryDelay().getNanos()));
+ }
+ return check("retryInfo.delay").that(delay);
}
public ComparableSubject backendLatency() {
diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubCloseTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubCloseTest.java
index 74d05e37fea2..5ab809f31b41 100644
--- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubCloseTest.java
+++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubCloseTest.java
@@ -81,6 +81,7 @@ public void tearDown() throws Exception {
}
@Test
+ @SuppressWarnings("NullArgumentForNonNullParameter")
public void outstandingRequestsFinishAfterClose() throws Exception {
ApiFuture> resultFuture =
stub.readRowsCallable().all().futureCall(Query.create(TableId.of("table1")));
@@ -99,6 +100,7 @@ public void outstandingRequestsFinishAfterClose() throws Exception {
class FakeBigtable extends BigtableGrpc.BigtableImplBase {
@Override
+ @SuppressWarnings("NullArgumentForNonNullParameter")
public void readRows(
ReadRowsRequest request, StreamObserver responseObserver) {
diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java
index a21eb3d707be..f20ad1a3e5fd 100644
--- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java
+++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java
@@ -371,6 +371,7 @@ public void testRMWRequestResponseConversion() throws ExecutionException, Interr
}
@Test
+ @SuppressWarnings("NullArgumentForNonNullParameter")
public void testMutateRowRequestResponseConversion()
throws ExecutionException, InterruptedException {
RowMutation req = RowMutation.create(TableId.of("my-table"), "my-key").deleteRow();
@@ -385,10 +386,11 @@ public void testMutateRowRequestResponseConversion()
MutateRowRequest protoReq = fakeDataService.mutateRowRequests.poll(1, TimeUnit.SECONDS);
assertThat(protoReq)
.isEqualTo(req.toProto(RequestContext.create(PROJECT_ID, INSTANCE_ID, APP_PROFILE_ID)));
- assertThat(f.get()).isEqualTo(null);
+ assertThat(f.get()).isNull();
}
@Test
+ @SuppressWarnings("NullArgumentForNonNullParameter")
public void testMutateRowRequestParams() throws ExecutionException, InterruptedException {
RowMutation req = RowMutation.create(TABLE_ID, "my-key").deleteRow();
@@ -407,7 +409,7 @@ public void testMutateRowRequestParams() throws ExecutionException, InterruptedE
// StatsHeadersUnaryCallable
assertThat(reqMetadata.keys()).contains("bigtable-client-attempt-epoch-usec");
- assertThat(f.get()).isEqualTo(null);
+ assertThat(f.get()).isNull();
}
@Test
diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/gaxx/reframing/ReframingResponseObserverTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/gaxx/reframing/ReframingResponseObserverTest.java
index 6adc71cae0c0..576dd919448b 100644
--- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/gaxx/reframing/ReframingResponseObserverTest.java
+++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/gaxx/reframing/ReframingResponseObserverTest.java
@@ -185,7 +185,7 @@ public void testManyToOne() throws InterruptedException {
// First downstream request makes the upstream over produce
outerObserver.getController().request(1);
Truth.assertThat(outerObserver.popNextResponse()).isEqualTo("a");
- Truth.assertThat(outerObserver.popNextResponse()).isEqualTo(null);
+ Truth.assertThat(outerObserver.popNextResponse()).isNull();
Truth.assertThat(outerObserver.isDone()).isFalse();
// Next downstream request should fetch from buffer
diff --git a/java-bigtable/pom.xml b/java-bigtable/pom.xml
index d0fe7683abdf..551958703180 100644
--- a/java-bigtable/pom.xml
+++ b/java-bigtable/pom.xml
@@ -145,8 +145,6 @@
google-cloud-bigtable-parent
https://googleapis.dev/java/google-api-grpc/latest
-
- 2.38.0
diff --git a/java-datastore/datastore-v1-proto-client/pom.xml b/java-datastore/datastore-v1-proto-client/pom.xml
index 3bea6a35fec2..4de8accacc3f 100644
--- a/java-datastore/datastore-v1-proto-client/pom.xml
+++ b/java-datastore/datastore-v1-proto-client/pom.xml
@@ -146,6 +146,7 @@
-XDcompilePolicy=simple
--should-stop=ifError=FLOW
-Xplugin:ErrorProne -XepExcludedPaths:.*/generated-sources/.*
+ ${errorprone.javac.args}
-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
-J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
@@ -163,7 +164,7 @@
com.google.errorprone
error_prone_core
- ${error-prone.version}
+ ${errorprone.version}
diff --git a/java-datastore/google-cloud-datastore-utils/pom.xml b/java-datastore/google-cloud-datastore-utils/pom.xml
index b0533059163a..dff5f9750d59 100644
--- a/java-datastore/google-cloud-datastore-utils/pom.xml
+++ b/java-datastore/google-cloud-datastore-utils/pom.xml
@@ -123,6 +123,7 @@
-XDcompilePolicy=simple
--should-stop=ifError=FLOW
-Xplugin:ErrorProne -XepExcludedPaths:.*/generated-sources/.*
+ ${errorprone.javac.args}
-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
-J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
@@ -140,7 +141,7 @@
com.google.errorprone
error_prone_core
- ${error-prone.version}
+ ${errorprone.version}
diff --git a/java-datastore/google-cloud-datastore/pom.xml b/java-datastore/google-cloud-datastore/pom.xml
index d6c2acdfc05c..54a09e2ac8ad 100644
--- a/java-datastore/google-cloud-datastore/pom.xml
+++ b/java-datastore/google-cloud-datastore/pom.xml
@@ -291,6 +291,7 @@
-XDcompilePolicy=simple
--should-stop=ifError=FLOW
-Xplugin:ErrorProne -XepExcludedPaths:.*/generated-sources/.*
+ ${errorprone.javac.args}
-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
-J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
@@ -308,7 +309,7 @@
com.google.errorprone
error_prone_core
- ${error-prone.version}
+ ${errorprone.version}
diff --git a/java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreHelper.java b/java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreHelper.java
index 33e90a66e802..fd99328b7c89 100644
--- a/java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreHelper.java
+++ b/java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreHelper.java
@@ -16,7 +16,6 @@
package com.google.cloud.datastore;
-import com.google.common.collect.Iterators;
import com.google.common.collect.Maps;
import java.util.ArrayList;
import java.util.Arrays;
@@ -38,11 +37,13 @@ static Key allocateId(Datastore service, IncompleteKey key) {
}
static Entity get(Transaction reader, Key key) {
- return Iterators.getNext(reader.get(new Key[] {key}), null);
+ Iterator results = reader.get(new Key[] {key});
+ return results.hasNext() ? results.next() : null;
}
static Entity get(Datastore reader, Key key, ReadOption... options) {
- return Iterators.getNext(reader.get(Collections.singletonList(key), options), null);
+ Iterator results = reader.get(Collections.singletonList(key), options);
+ return results.hasNext() ? results.next() : null;
}
static Entity add(DatastoreWriter writer, FullEntity> entity) {
diff --git a/java-datastore/pom.xml b/java-datastore/pom.xml
index 2e4889d4519e..2ceaf50a1ca7 100644
--- a/java-datastore/pom.xml
+++ b/java-datastore/pom.xml
@@ -144,10 +144,6 @@
github
google-cloud-datastore-parent
https://googleapis.dev/java/google-api-grpc/latest
-
-
-
- 2.42.0