diff --git a/google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudExecutorImpl.java b/google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudExecutorImpl.java index f3de36ac7b4..cbe6301974a 100644 --- a/google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudExecutorImpl.java +++ b/google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudExecutorImpl.java @@ -72,6 +72,8 @@ public StreamObserver executeActionAsync( // Create a top-level OpenTelemetry span for streaming request. Tracer tracer = WorkerProxy.openTelemetrySdk.getTracer(CloudClientExecutor.class.getName()); Span span = tracer.spanBuilder("java_systest_execute_actions_stream").setNoParent().startSpan(); + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("MustBeClosedChecker") Scope scope = span.makeCurrent(); final String traceId = span.getSpanContext().getTraceId(); diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractReadContext.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractReadContext.java index 6ea4510d3db..b58aa28c6d9 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractReadContext.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractReadContext.java @@ -212,6 +212,8 @@ protected boolean isRouteToLeader() { return false; } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") @GuardedBy("lock") @Override void beforeReadOrQueryLocked() { @@ -456,6 +458,8 @@ void initTransaction() { } } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") private void initTransactionInternal(BeginTransactionRequest request) { try { Transaction transaction = diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/OpenTelemetryApiTracer.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/OpenTelemetryApiTracer.java index 863c531de30..3b43490e3e1 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/OpenTelemetryApiTracer.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/OpenTelemetryApiTracer.java @@ -77,6 +77,8 @@ Span getSpan() { @Override public Scope inScope() { + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("MustBeClosedChecker") final io.opentelemetry.context.Scope openTelemetryScope = span.makeCurrent(); return openTelemetryScope::close; } diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java index c36f1902648..8da85252be2 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java @@ -1025,6 +1025,8 @@ void appendToOptions(Options options) { options.filter = filter; } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("EqualsHashCode") @Override public boolean equals(Object o) { if (o == this) return true; diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPool.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPool.java index 0b55a893aca..9f37c53139d 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPool.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPool.java @@ -587,6 +587,8 @@ public PooledSessionFuture replaceSession( } } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") @Override public PooledSessionFuture denyListSession( RetryOnDifferentGrpcChannelException retryException, PooledSessionFuture session) { @@ -1768,6 +1770,8 @@ public ApiFuture asyncClose() { return ApiFutures.immediateFuture(Empty.getDefaultInstance()); } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") @Override public void close() { synchronized (lock) { @@ -1848,12 +1852,16 @@ public SessionImpl getDelegate() { return this.delegate; } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") @Override public void markBusy(ISpan span) { this.delegate.setCurrentSpan(span); this.state = SessionState.BUSY; } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") private void markClosing() { this.state = SessionState.CLOSING; } @@ -2091,6 +2099,8 @@ void maintainPool() { removeLongRunningSessions(currTime); } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") private void removeIdleSessions(Instant currTime) { synchronized (lock) { // Determine the minimum last use time for a session to be deemed to still be alive. Remove @@ -2190,6 +2200,8 @@ void removeLongRunningSessions(Instant currentTime) { } } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") private void removeLongRunningSessions( final Instant currentTime, final InactiveTransactionRemovalOptions inactiveTransactionRemovalOptions) { @@ -2691,6 +2703,8 @@ private void invalidateSession(PooledSession session) { } } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") private Tuple findSessionToKeepAlive( Queue queue, Instant keepAliveThreshold, int numAlreadyChecked) { int numChecked = 0; @@ -2885,6 +2899,8 @@ private void releaseSession(PooledSession session, boolean isNewSession) { } /** Releases a session back to the pool. This might cause one of the waiters to be unblocked. */ + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") private void releaseSession( PooledSession session, boolean isNewSession, @Nullable Integer position) { Preconditions.checkNotNull(session); @@ -2945,6 +2961,8 @@ private void releaseSession( * running many small, quick queries using a small number of parallel threads. This can cause a * high TPS, without actually having a high degree of parallelism. */ + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") @VisibleForTesting boolean shouldRandomize() { return this.options.getRandomizePositionQPSThreshold() > 0 @@ -2952,6 +2970,8 @@ boolean shouldRandomize() { && this.numSessionsInUse >= this.numChannels; } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") private boolean isUnbalanced(PooledSession session) { int channel = session.getChannel(); int numChannels = sessionClient.getSpanner().getOptions().getNumChannels(); @@ -3054,10 +3074,14 @@ private void handleCreateSessionsFailure(SpannerException e, int count) { } } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") void setResourceNotFoundException(ResourceNotFoundException e) { this.resourceNotFoundException = MoreObjects.firstNonNull(this.resourceNotFoundException, e); } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") private void decrementPendingClosures(int count) { pendingClosure -= count; if (pendingClosure == 0) { @@ -3070,6 +3094,8 @@ private void decrementPendingClosures(int count) { * {@code IllegalStateException}. The returned future blocks till all the sessions created in this * pool have been closed. */ + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") ListenableFuture closeAsync(ClosedException closedException) { ListenableFuture retFuture = null; synchronized (lock) { @@ -3269,6 +3295,8 @@ public void onSessionCreateFailure(Throwable t, int createFailureForSessionCount * Initializes and creates Spanner session relevant metrics using OpenCensus. When coupled with an * exporter, it allows users to monitor client behavior. */ + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") private void initOpenCensusMetricsCollection( MetricRegistry metricRegistry, List labelValues, @@ -3402,6 +3430,8 @@ private void initOpenCensusMetricsCollection( * Initializes and creates Spanner session relevant metrics using OpenTelemetry. When coupled with * an exporter, it allows users to monitor client behavior. */ + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") private void initOpenTelemetryMetricsCollection( OpenTelemetry openTelemetry, Attributes attributes, diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerImpl.java index 8f5baca64f6..dfab163610e 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerImpl.java @@ -375,6 +375,8 @@ public void close() { close(Long.MAX_VALUE, TimeUnit.MILLISECONDS); } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") void close(long timeout, TimeUnit unit) { List> closureFutures; synchronized (this) { diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java index 0995c478427..be984f34914 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java @@ -1828,6 +1828,8 @@ public static void enableOpenCensusTraces() { * Always resets the activeTracingFramework. This variable is used for internal testing, and is * not a valid production scenario */ + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") @ObsoleteApi( "The OpenCensus project is deprecated. Use enableOpenTelemetryTraces to switch to" + " OpenTelemetry traces") @@ -2023,6 +2025,8 @@ private ApiTracerFactory createApiTracerFactory( return new CompositeTracerFactory(apiTracerFactories); } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") private ApiTracerFactory getDefaultApiTracerFactory() { if (isEnableApiTracing()) { if (activeTracingFramework == TracingFramework.OPEN_TELEMETRY) { diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TraceWrapper.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TraceWrapper.java index df5874cb3c6..eeb527300c3 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TraceWrapper.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TraceWrapper.java @@ -130,6 +130,8 @@ ISpan getBlankSpan() { } } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("MustBeClosedChecker") IScope withSpan(ISpan span) { if (SpannerOptions.getActiveTracingFramework().equals(TracingFramework.OPEN_TELEMETRY)) { OpenTelemetrySpan openTelemetrySpan; diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/AbstractBaseUnitOfWork.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/AbstractBaseUnitOfWork.java index 5f4facf1489..279380b394c 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/AbstractBaseUnitOfWork.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/AbstractBaseUnitOfWork.java @@ -401,6 +401,8 @@ public ApiCallContext configure( } future.addListener( new Runnable() { + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") @Override public void run() { synchronized (this) { diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AbstractReadContextTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AbstractReadContextTest.java index eea6658d26d..e5736770268 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AbstractReadContextTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AbstractReadContextTest.java @@ -303,6 +303,8 @@ public void testExecuteBatchDmlLastStatement() { .getLastStatements()); } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("JUnit4TestNotRun") public void executeSqlRequestBuilderWithRequestOptions() { ExecuteSqlRequest request = context diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java index 6ceb3e979bf..bbdfd6f8d5e 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java @@ -2331,6 +2331,8 @@ public void singleUse() { DatabaseClientImpl client = (DatabaseClientImpl) spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") Set checkedOut = client.pool.checkedOutSessions; assertThat(checkedOut).isEmpty(); try (ResultSet rs = client.singleUse().executeQuery(SELECT1)) { @@ -3919,6 +3921,8 @@ public void testCreateSessionsFailure_shouldNotPropagateToCloseMethod() { @Test public void testReadWriteTransaction_usesOptions() { SessionPool pool = mock(SessionPool.class); + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("DoNotMock") PooledSessionFuture session = mock(PooledSessionFuture.class); when(pool.getSession()).thenReturn(session); TransactionOption option = mock(TransactionOption.class); @@ -3935,6 +3939,8 @@ public void testReadWriteTransaction_usesOptions() { @Test public void testTransactionManager_usesOptions() { SessionPool pool = mock(SessionPool.class); + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("DoNotMock") PooledSessionFuture session = mock(PooledSessionFuture.class); when(pool.getSession()).thenReturn(session); TransactionOption option = mock(TransactionOption.class); @@ -3948,6 +3954,8 @@ public void testTransactionManager_usesOptions() { @Test public void testRunAsync_usesOptions() { SessionPool pool = mock(SessionPool.class); + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("DoNotMock") PooledSessionFuture session = mock(PooledSessionFuture.class); when(pool.getSession()).thenReturn(session); TransactionOption option = mock(TransactionOption.class); @@ -3961,6 +3969,8 @@ public void testRunAsync_usesOptions() { @Test public void testTransactionManagerAsync_usesOptions() { SessionPool pool = mock(SessionPool.class); + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("DoNotMock") PooledSessionFuture session = mock(PooledSessionFuture.class); when(pool.getSession()).thenReturn(session); TransactionOption option = mock(TransactionOption.class); @@ -4240,6 +4250,8 @@ public void singleUseNoAction_ClearsCheckedOutSession() { DatabaseClientImpl client = (DatabaseClientImpl) spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") Set checkedOut = client.pool.checkedOutSessions; assertThat(checkedOut).isEmpty(); @@ -4255,6 +4267,8 @@ public void singleUseReadOnlyTransactionNoAction_ClearsCheckedOutSession() { DatabaseClientImpl client = (DatabaseClientImpl) spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") Set checkedOut = client.pool.checkedOutSessions; assertThat(checkedOut).isEmpty(); @@ -4268,6 +4282,8 @@ public void readWriteTransactionNoAction_ClearsCheckedOutSession() { DatabaseClientImpl client = (DatabaseClientImpl) spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") Set checkedOut = client.pool.checkedOutSessions; assertThat(checkedOut).isEmpty(); @@ -4281,6 +4297,8 @@ public void readOnlyTransactionNoAction_ClearsCheckedOutSession() { DatabaseClientImpl client = (DatabaseClientImpl) spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") Set checkedOut = client.pool.checkedOutSessions; assertThat(checkedOut).isEmpty(); @@ -4294,6 +4312,8 @@ public void transactionManagerNoAction_ClearsCheckedOutSession() { DatabaseClientImpl client = (DatabaseClientImpl) spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") Set checkedOut = client.pool.checkedOutSessions; assertThat(checkedOut).isEmpty(); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseTest.java index dc65f738619..0f33a4e10b6 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseTest.java @@ -165,6 +165,8 @@ public void testUnspecifiedDialectDefaultsToGoogleStandardSqlDialect() { assertEquals(Dialect.GOOGLE_STANDARD_SQL, database.getDialect()); } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("SetUnrecognized") @Test public void testUnrecognizedDialectThrowsException() { assertThrows( diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolTest.java index b027ebbc07f..66b4a10832a 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolTest.java @@ -808,6 +808,8 @@ public void idleSessionCleanup() throws Exception { pool.closeAsync(new SpannerImpl.ClosedException()).get(5L, TimeUnit.SECONDS); } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") @Test public void longRunningTransactionsCleanup_whenActionSetToClose_verifyInactiveSessionsClosed() throws Exception { @@ -854,6 +856,8 @@ public void longRunningTransactionsCleanup_whenActionSetToClose_verifyInactiveSe pool.closeAsync(new SpannerImpl.ClosedException()).get(5L, TimeUnit.SECONDS); } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") @Test public void longRunningTransactionsCleanup_whenActionSetToWarn_verifyInactiveSessionsOpen() throws Exception { @@ -902,6 +906,8 @@ public void longRunningTransactionsCleanup_whenActionSetToWarn_verifyInactiveSes pool.closeAsync(new SpannerImpl.ClosedException()).get(5L, TimeUnit.SECONDS); } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") @Test public void longRunningTransactionsCleanup_whenUtilisationBelowThreshold_verifyInactiveSessionsOpen() @@ -945,6 +951,8 @@ public void longRunningTransactionsCleanup_whenActionSetToWarn_verifyInactiveSes pool.closeAsync(new SpannerImpl.ClosedException()).get(5L, TimeUnit.SECONDS); } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") @Test public void longRunningTransactionsCleanup_whenAllAreExpectedlyLongRunning_verifyInactiveSessionsOpen() @@ -1011,6 +1019,8 @@ public void longRunningTransactionsCleanup_whenActionSetToWarn_verifyInactiveSes pool.closeAsync(new SpannerImpl.ClosedException()).get(5L, TimeUnit.SECONDS); } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") @Test public void longRunningTransactionsCleanup_whenBelowDurationThreshold_verifyInactiveSessionsOpen() throws Exception { @@ -1056,6 +1066,8 @@ public void longRunningTransactionsCleanup_whenBelowDurationThreshold_verifyInac pool.closeAsync(new SpannerImpl.ClosedException()).get(5L, TimeUnit.SECONDS); } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") @Test public void longRunningTransactionsCleanup_whenException_doNothing() throws Exception { Clock clock = mock(Clock.class); @@ -1099,6 +1111,8 @@ public void longRunningTransactionsCleanup_whenException_doNothing() throws Exce pool.closeAsync(new SpannerImpl.ClosedException()).get(5L, TimeUnit.SECONDS); } + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("GuardedBy") @Test public void longRunningTransactionsCleanup_whenTaskRecurrenceBelowThreshold_verifyInactiveSessionsOpen() diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolUnbalancedTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolUnbalancedTest.java index 5a9365eaed9..71b3d75d077 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolUnbalancedTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolUnbalancedTest.java @@ -49,6 +49,8 @@ static List mockedSessions(int... channels) { static PooledSessionFuture mockedCheckedOutSession(int channel) { PooledSession session = mockedSession(channel); + // Suppressed for initial Error Prone rollout. + @SuppressWarnings("DoNotMock") PooledSessionFuture future = mock(PooledSessionFuture.class); when(future.get()).thenReturn(session); when(future.isDone()).thenReturn(true); diff --git a/pom.xml b/pom.xml index 7220e5fdffe..6e9b6340f00 100644 --- a/pom.xml +++ b/pom.xml @@ -54,6 +54,7 @@ UTF-8 github google-cloud-spanner-parent + 2.38.0 @@ -133,6 +134,51 @@ + + + java9 + + [9,) + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + UTF-8 + true + + -XDcompilePolicy=simple + --should-stop=ifError=FLOW + -Xplugin:ErrorProne -Xep:CheckReturnValue:OFF -Xep:ProtoBuilderReturnValueIgnored:OFF -Xep:ReturnValueIgnored:OFF -Xep:BoxedPrimitiveEquality:OFF -Xep:UnicodeInCode:OFF + -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED + -J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED + -J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED + + + + com.google.errorprone + error_prone_core + ${error-prone.version} + + + + + + + + + + google-cloud-spanner grpc-google-cloud-spanner-v1