diff --git a/.travis.yml b/.travis.yml
index b0accff..2d2c304 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -114,8 +114,8 @@
       install: skip
       # Strict compilation requires more than 2 GB
       script: >
-        ./check_test_suite.py && travis_terminate 0 || MAVEN_OPTS='-Xmx3000m' ${MVN} clean -Pstrict compile test-compile --fail-at-end
-        -pl '!benchmarks' ${MAVEN_SKIP} ${MAVEN_SKIP_TESTS}
+        ./check_test_suite.py && travis_terminate 0 || MAVEN_OPTS='-Xmx3000m' ${MVN} clean -DstrictCompile compile test-compile --fail-at-end
+        ${MAVEN_SKIP} ${MAVEN_SKIP_TESTS}
 
     - name: "analyze dependencies"
       script: |-
diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml
index db7925c..f5d894e 100644
--- a/benchmarks/pom.xml
+++ b/benchmarks/pom.xml
@@ -194,16 +194,6 @@
     <plugins>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <version>3.1</version>
-        <configuration>
-          <compilerVersion>${javac.target}</compilerVersion>
-          <source>${javac.target}</source>
-          <target>${javac.target}</target>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-assembly-plugin</artifactId>
         <version>2.6</version>
         <executions>
diff --git a/core/pom.xml b/core/pom.xml
index 757012d..70ca838 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -429,24 +429,4 @@
       </resource>
     </resources>
   </build>
-
-  <profiles>
-    <profile>
-      <id>strict</id>
-      <build>
-        <plugins>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-compiler-plugin</artifactId>
-            <configuration>
-              <compilerArgs>
-                <!-- Antlr-generated classes miss @Override, that is not easy to fix -->
-                <arg>-Xep:MissingOverride:WARN</arg>
-              </compilerArgs>
-            </configuration>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
-  </profiles>
 </project>
diff --git a/core/src/main/java/org/apache/druid/crypto/CryptoService.java b/core/src/main/java/org/apache/druid/crypto/CryptoService.java
index 306ae70..cd4b327 100644
--- a/core/src/main/java/org/apache/druid/crypto/CryptoService.java
+++ b/core/src/main/java/org/apache/druid/crypto/CryptoService.java
@@ -113,6 +113,10 @@
 
       SecretKey tmp = getKeyFromPassword(passPhrase, salt);
       SecretKey secret = new SecretKeySpec(tmp.getEncoded(), cipherAlgName);
+
+      // error-prone warns if the transformation is not a compile-time constant
+      // since it cannot check it for insecure combinations.
+      @SuppressWarnings("InsecureCryptoUsage")
       Cipher ecipher = Cipher.getInstance(transformation);
       ecipher.init(Cipher.ENCRYPT_MODE, secret);
       return new EncryptedData(
@@ -134,6 +138,9 @@
       SecretKey tmp = getKeyFromPassword(passPhrase, encryptedData.getSalt());
       SecretKey secret = new SecretKeySpec(tmp.getEncoded(), cipherAlgName);
 
+      // error-prone warns if the transformation is not a compile-time constant
+      // since it cannot check it for insecure combinations.
+      @SuppressWarnings("InsecureCryptoUsage")
       Cipher dcipher = Cipher.getInstance(transformation);
       dcipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(encryptedData.getIv()));
       return dcipher.doFinal(encryptedData.getCipher());
diff --git a/core/src/main/java/org/apache/druid/math/expr/BinaryLogicalOperatorExpr.java b/core/src/main/java/org/apache/druid/math/expr/BinaryLogicalOperatorExpr.java
index 8ff150f..12f1a8b 100644
--- a/core/src/main/java/org/apache/druid/math/expr/BinaryLogicalOperatorExpr.java
+++ b/core/src/main/java/org/apache/druid/math/expr/BinaryLogicalOperatorExpr.java
@@ -27,7 +27,7 @@
 import java.util.Objects;
 
 // logical operators live here
-
+@SuppressWarnings("ClassName")
 class BinLtExpr extends BinaryEvalOpExprBase
 {
   BinLtExpr(String op, Expr left, Expr right)
@@ -84,6 +84,7 @@
   }
 }
 
+@SuppressWarnings("ClassName")
 class BinLeqExpr extends BinaryEvalOpExprBase
 {
   BinLeqExpr(String op, Expr left, Expr right)
@@ -140,6 +141,7 @@
   }
 }
 
+@SuppressWarnings("ClassName")
 class BinGtExpr extends BinaryEvalOpExprBase
 {
   BinGtExpr(String op, Expr left, Expr right)
@@ -195,6 +197,7 @@
   }
 }
 
+@SuppressWarnings("ClassName")
 class BinGeqExpr extends BinaryEvalOpExprBase
 {
   BinGeqExpr(String op, Expr left, Expr right)
@@ -251,6 +254,7 @@
   }
 }
 
+@SuppressWarnings("ClassName")
 class BinEqExpr extends BinaryEvalOpExprBase
 {
   BinEqExpr(String op, Expr left, Expr right)
@@ -306,6 +310,7 @@
   }
 }
 
+@SuppressWarnings("ClassName")
 class BinNeqExpr extends BinaryEvalOpExprBase
 {
   BinNeqExpr(String op, Expr left, Expr right)
@@ -361,6 +366,7 @@
   }
 }
 
+@SuppressWarnings("ClassName")
 class BinAndExpr extends BinaryOpExprBase
 {
   BinAndExpr(String op, Expr left, Expr right)
diff --git a/core/src/main/java/org/apache/druid/math/expr/BinaryMathOperatorExpr.java b/core/src/main/java/org/apache/druid/math/expr/BinaryMathOperatorExpr.java
index 384249b..14a6136 100644
--- a/core/src/main/java/org/apache/druid/math/expr/BinaryMathOperatorExpr.java
+++ b/core/src/main/java/org/apache/druid/math/expr/BinaryMathOperatorExpr.java
@@ -30,6 +30,7 @@
 
 // math operators live here
 
+@SuppressWarnings("ClassName")
 final class BinPlusExpr extends BinaryEvalOpExprBase
 {
   BinPlusExpr(String op, Expr left, Expr right)
@@ -81,6 +82,7 @@
   }
 }
 
+@SuppressWarnings("ClassName")
 final class BinMinusExpr extends BinaryEvalOpExprBase
 {
   BinMinusExpr(String op, Expr left, Expr right)
@@ -119,6 +121,7 @@
   }
 }
 
+@SuppressWarnings("ClassName")
 final class BinMulExpr extends BinaryEvalOpExprBase
 {
   BinMulExpr(String op, Expr left, Expr right)
@@ -157,6 +160,7 @@
   }
 }
 
+@SuppressWarnings("ClassName")
 final class BinDivExpr extends BinaryEvalOpExprBase
 {
   BinDivExpr(String op, Expr left, Expr right)
@@ -195,6 +199,7 @@
   }
 }
 
+@SuppressWarnings("ClassName")
 class BinPowExpr extends BinaryEvalOpExprBase
 {
   BinPowExpr(String op, Expr left, Expr right)
@@ -233,6 +238,7 @@
   }
 }
 
+@SuppressWarnings("ClassName")
 class BinModuloExpr extends BinaryEvalOpExprBase
 {
   BinModuloExpr(String op, Expr left, Expr right)
diff --git a/core/src/main/java/org/apache/druid/math/expr/BinaryOperatorExpr.java b/core/src/main/java/org/apache/druid/math/expr/BinaryOperatorExpr.java
index 280d99b..a8dd08b 100644
--- a/core/src/main/java/org/apache/druid/math/expr/BinaryOperatorExpr.java
+++ b/core/src/main/java/org/apache/druid/math/expr/BinaryOperatorExpr.java
@@ -33,6 +33,7 @@
  * Note: all concrete subclass of this should have constructor with the form of <init>(String, Expr, Expr)
  * if it's not possible, just be sure Evals.binaryOp() can handle that
  */
+@SuppressWarnings("ClassName")
 abstract class BinaryOpExprBase implements Expr
 {
   protected final String op;
@@ -112,6 +113,7 @@
  * Base class for numerical binary operators, with additional methods defined to evaluate primitive values directly
  * instead of wrapped with {@link ExprEval}
  */
+@SuppressWarnings("ClassName")
 abstract class BinaryEvalOpExprBase extends BinaryOpExprBase
 {
   BinaryEvalOpExprBase(String op, Expr left, Expr right)
diff --git a/core/src/main/java/org/apache/druid/math/expr/FunctionalExpr.java b/core/src/main/java/org/apache/druid/math/expr/FunctionalExpr.java
index 00f381b..5e164e1 100644
--- a/core/src/main/java/org/apache/druid/math/expr/FunctionalExpr.java
+++ b/core/src/main/java/org/apache/druid/math/expr/FunctionalExpr.java
@@ -30,6 +30,7 @@
 import java.util.Set;
 import java.util.stream.Collectors;
 
+@SuppressWarnings("ClassName")
 class LambdaExpr implements Expr
 {
   private final ImmutableList<IdentifierExpr> args;
@@ -150,6 +151,7 @@
  * list of arguments that are passed to the {@link Function} along with the {@link Expr.ObjectBinding} when it is
  * evaluated.
  */
+@SuppressWarnings("ClassName")
 class FunctionExpr implements Expr
 {
   final Function function;
@@ -247,6 +249,7 @@
  * {@link LambdaExpr} and the list of {@link Expr} arguments that are combined with {@link Expr.ObjectBinding} to
  * evaluate the {@link LambdaExpr}.
  */
+@SuppressWarnings("ClassName")
 class ApplyFunctionExpr implements Expr
 {
   final ApplyFunction function;
diff --git a/core/src/main/java/org/apache/druid/math/expr/UnaryOperatorExpr.java b/core/src/main/java/org/apache/druid/math/expr/UnaryOperatorExpr.java
index 6993ed7..a0d16eb 100644
--- a/core/src/main/java/org/apache/druid/math/expr/UnaryOperatorExpr.java
+++ b/core/src/main/java/org/apache/druid/math/expr/UnaryOperatorExpr.java
@@ -32,6 +32,7 @@
 /**
  * Base type for all single argument operators, with a single {@link Expr} child for the operand.
  */
+@SuppressWarnings("ClassName")
 abstract class UnaryExpr implements Expr
 {
   final String op;
@@ -102,6 +103,7 @@
   }
 }
 
+@SuppressWarnings("ClassName")
 class UnaryMinusExpr extends UnaryExpr
 {
   UnaryMinusExpr(String op, Expr expr)
@@ -144,6 +146,7 @@
   }
 }
 
+@SuppressWarnings("ClassName")
 class UnaryNotExpr extends UnaryExpr
 {
   UnaryNotExpr(String op, Expr expr)
diff --git a/core/src/test/java/org/apache/druid/java/util/common/parsers/TimestampParserTest.java b/core/src/test/java/org/apache/druid/java/util/common/parsers/TimestampParserTest.java
index a5622d5..d94ec8f 100644
--- a/core/src/test/java/org/apache/druid/java/util/common/parsers/TimestampParserTest.java
+++ b/core/src/test/java/org/apache/druid/java/util/common/parsers/TimestampParserTest.java
@@ -204,7 +204,7 @@
                         expectedDt, parser.apply(yearMonth));
 
     // Friday, May 15, 2020 8:20:40 PM GMT
-    long millis = 1589574040000l;
+    long millis = 1589574040000L;
     expectedDt = DateTimes.of("2020-05-15T20:20:40.000Z");
 
     parser = TimestampParser.createObjectTimestampParser("millis");
@@ -219,7 +219,7 @@
     Assert.assertEquals("Timestamp of format posix not parsed correctly",
                         expectedDt, parser.apply(posix));
 
-    long micro = 1589574040000000l;
+    long micro = 1589574040000000L;
     parser = TimestampParser.createObjectTimestampParser("micro");
     Assert.assertEquals("Timestamp of format micro not parsed correctly",
                         expectedDt, parser.apply(micro));
diff --git a/extensions-core/lookups-cached-single/src/test/java/org/apache/druid/server/lookup/LoadingLookupFactoryTest.java b/extensions-core/lookups-cached-single/src/test/java/org/apache/druid/server/lookup/LoadingLookupFactoryTest.java
index adda834..be6acd5 100644
--- a/extensions-core/lookups-cached-single/src/test/java/org/apache/druid/server/lookup/LoadingLookupFactoryTest.java
+++ b/extensions-core/lookups-cached-single/src/test/java/org/apache/druid/server/lookup/LoadingLookupFactoryTest.java
@@ -165,6 +165,7 @@
     }
 
     @Override
+    @SuppressWarnings("EqualsHashCode")
     public boolean equals(Object obj)
     {
       return obj instanceof MockDataFetcher;
diff --git a/extensions-core/lookups-cached-single/src/test/java/org/apache/druid/server/lookup/PollingLookupSerDeserTest.java b/extensions-core/lookups-cached-single/src/test/java/org/apache/druid/server/lookup/PollingLookupSerDeserTest.java
index eef78c0..fed973a 100644
--- a/extensions-core/lookups-cached-single/src/test/java/org/apache/druid/server/lookup/PollingLookupSerDeserTest.java
+++ b/extensions-core/lookups-cached-single/src/test/java/org/apache/druid/server/lookup/PollingLookupSerDeserTest.java
@@ -103,6 +103,7 @@
     }
 
     @Override
+    @SuppressWarnings("EqualsHashCode")
     public boolean equals(Object obj)
     {
       return obj instanceof MockDataFetcher;
diff --git a/extensions-core/lookups-cached-single/src/test/java/org/apache/druid/server/lookup/PollingLookupTest.java b/extensions-core/lookups-cached-single/src/test/java/org/apache/druid/server/lookup/PollingLookupTest.java
index 715100d..2aabe93 100644
--- a/extensions-core/lookups-cached-single/src/test/java/org/apache/druid/server/lookup/PollingLookupTest.java
+++ b/extensions-core/lookups-cached-single/src/test/java/org/apache/druid/server/lookup/PollingLookupTest.java
@@ -102,6 +102,7 @@
     }
 
     @Override
+    @SuppressWarnings("EqualsHashCode")
     public boolean equals(Object obj)
     {
       return obj instanceof MockDataFetcher;
diff --git a/extensions-core/protobuf-extensions/src/test/java/org/apache/druid/data/input/protobuf/ProtoTestEventWrapper.java b/extensions-core/protobuf-extensions/src/test/java/org/apache/druid/data/input/protobuf/ProtoTestEventWrapper.java
index 0b370c2..80c6987 100644
--- a/extensions-core/protobuf-extensions/src/test/java/org/apache/druid/data/input/protobuf/ProtoTestEventWrapper.java
+++ b/extensions-core/protobuf-extensions/src/test/java/org/apache/druid/data/input/protobuf/ProtoTestEventWrapper.java
@@ -410,6 +410,7 @@
       public static final int CATEGORY_TWO_VALUE = 2;
 
 
+      @Override
       public final int getNumber() {
         return value;
       }
@@ -444,15 +445,18 @@
       private static final com.google.protobuf.Internal.EnumLiteMap<
           EventCategory> internalValueMap =
             new com.google.protobuf.Internal.EnumLiteMap<EventCategory>() {
+              @Override
               public EventCategory findValueByNumber(int number) {
                 return EventCategory.forNumber(number);
               }
             };
 
+      @Override
       public final com.google.protobuf.Descriptors.EnumValueDescriptor
           getValueDescriptor() {
         return getDescriptor().getValues().get(ordinal());
       }
+      @Override
       public final com.google.protobuf.Descriptors.EnumDescriptor
           getDescriptorForType() {
         return getDescriptor();
@@ -519,14 +523,14 @@
         bar_ = "";
       }
 
-      @java.lang.Override
+      @Override
       @SuppressWarnings({"unused"})
       protected java.lang.Object newInstance(
           UnusedPrivateParameter unused) {
         return new Foo();
       }
 
-      @java.lang.Override
+      @Override
       public final com.google.protobuf.UnknownFieldSet
       getUnknownFields() {
         return this.unknownFields;
@@ -595,7 +599,7 @@
        * <code>required string bar = 1;</code>
        * @return Whether the bar field is set.
        */
-      @java.lang.Override
+      @Override
       public boolean hasBar() {
         return ((bitField0_ & 0x00000001) != 0);
       }
@@ -603,7 +607,7 @@
        * <code>required string bar = 1;</code>
        * @return The bar.
        */
-      @java.lang.Override
+      @Override
       public java.lang.String getBar() {
         java.lang.Object ref = bar_;
         if (ref instanceof java.lang.String) {
@@ -622,7 +626,7 @@
        * <code>required string bar = 1;</code>
        * @return The bytes for bar.
        */
-      @java.lang.Override
+      @Override
       public com.google.protobuf.ByteString
           getBarBytes() {
         java.lang.Object ref = bar_;
@@ -652,7 +656,7 @@
         return true;
       }
 
-      @java.lang.Override
+      @Override
       public void writeTo(com.google.protobuf.CodedOutputStream output)
                           throws java.io.IOException {
         if (((bitField0_ & 0x00000001) != 0)) {
@@ -661,7 +665,7 @@
         unknownFields.writeTo(output);
       }
 
-      @java.lang.Override
+      @Override
       public int getSerializedSize() {
         int size = memoizedSize;
         if (size != -1) return size;
@@ -675,7 +679,7 @@
         return size;
       }
 
-      @java.lang.Override
+      @Override
       public boolean equals(final java.lang.Object obj) {
         if (obj == this) {
          return true;
@@ -694,7 +698,7 @@
         return true;
       }
 
-      @java.lang.Override
+      @Override
       public int hashCode() {
         if (memoizedHashCode != 0) {
           return memoizedHashCode;
@@ -835,7 +839,7 @@
                   .alwaysUseFieldBuilders) {
           }
         }
-        @java.lang.Override
+        @Override
         public Builder clear() {
           super.clear();
           bar_ = "";
@@ -843,18 +847,18 @@
           return this;
         }
 
-        @java.lang.Override
+        @Override
         public com.google.protobuf.Descriptors.Descriptor
             getDescriptorForType() {
           return org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.internal_static_prototest_ProtoTestEvent_Foo_descriptor;
         }
 
-        @java.lang.Override
+        @Override
         public org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.Foo getDefaultInstanceForType() {
           return org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.Foo.getDefaultInstance();
         }
 
-        @java.lang.Override
+        @Override
         public org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.Foo build() {
           org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.Foo result = buildPartial();
           if (!result.isInitialized()) {
@@ -863,7 +867,7 @@
           return result;
         }
 
-        @java.lang.Override
+        @Override
         public org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.Foo buildPartial() {
           org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.Foo result = new org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.Foo(this);
           int from_bitField0_ = bitField0_;
@@ -877,39 +881,39 @@
           return result;
         }
 
-        @java.lang.Override
+        @Override
         public Builder clone() {
           return super.clone();
         }
-        @java.lang.Override
+        @Override
         public Builder setField(
             com.google.protobuf.Descriptors.FieldDescriptor field,
             java.lang.Object value) {
           return super.setField(field, value);
         }
-        @java.lang.Override
+        @Override
         public Builder clearField(
             com.google.protobuf.Descriptors.FieldDescriptor field) {
           return super.clearField(field);
         }
-        @java.lang.Override
+        @Override
         public Builder clearOneof(
             com.google.protobuf.Descriptors.OneofDescriptor oneof) {
           return super.clearOneof(oneof);
         }
-        @java.lang.Override
+        @Override
         public Builder setRepeatedField(
             com.google.protobuf.Descriptors.FieldDescriptor field,
             int index, java.lang.Object value) {
           return super.setRepeatedField(field, index, value);
         }
-        @java.lang.Override
+        @Override
         public Builder addRepeatedField(
             com.google.protobuf.Descriptors.FieldDescriptor field,
             java.lang.Object value) {
           return super.addRepeatedField(field, value);
         }
-        @java.lang.Override
+        @Override
         public Builder mergeFrom(com.google.protobuf.Message other) {
           if (other instanceof org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.Foo) {
             return mergeFrom((org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.Foo)other);
@@ -931,7 +935,7 @@
           return this;
         }
 
-        @java.lang.Override
+        @Override
         public final boolean isInitialized() {
           if (!hasBar()) {
             return false;
@@ -939,7 +943,7 @@
           return true;
         }
 
-        @java.lang.Override
+        @Override
         public Builder mergeFrom(
             com.google.protobuf.CodedInputStream input,
             com.google.protobuf.ExtensionRegistryLite extensionRegistry)
@@ -964,6 +968,7 @@
          * <code>required string bar = 1;</code>
          * @return Whether the bar field is set.
          */
+        @Override
         public boolean hasBar() {
           return ((bitField0_ & 0x00000001) != 0);
         }
@@ -971,6 +976,7 @@
          * <code>required string bar = 1;</code>
          * @return The bar.
          */
+        @Override
         public java.lang.String getBar() {
           java.lang.Object ref = bar_;
           if (!(ref instanceof java.lang.String)) {
@@ -989,6 +995,7 @@
          * <code>required string bar = 1;</code>
          * @return The bytes for bar.
          */
+        @Override
         public com.google.protobuf.ByteString
             getBarBytes() {
           java.lang.Object ref = bar_;
@@ -1042,13 +1049,13 @@
           onChanged();
           return this;
         }
-        @java.lang.Override
+        @Override
         public final Builder setUnknownFields(
             final com.google.protobuf.UnknownFieldSet unknownFields) {
           return super.setUnknownFields(unknownFields);
         }
 
-        @java.lang.Override
+        @Override
         public final Builder mergeUnknownFields(
             final com.google.protobuf.UnknownFieldSet unknownFields) {
           return super.mergeUnknownFields(unknownFields);
@@ -1070,7 +1077,7 @@
 
       @java.lang.Deprecated public static final com.google.protobuf.Parser<Foo>
           PARSER = new com.google.protobuf.AbstractParser<Foo>() {
-        @java.lang.Override
+        @Override
         public Foo parsePartialFrom(
             com.google.protobuf.CodedInputStream input,
             com.google.protobuf.ExtensionRegistryLite extensionRegistry)
@@ -1083,12 +1090,12 @@
         return PARSER;
       }
 
-      @java.lang.Override
+      @Override
       public com.google.protobuf.Parser<Foo> getParserForType() {
         return PARSER;
       }
 
-      @java.lang.Override
+      @Override
       public org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.Foo getDefaultInstanceForType() {
         return DEFAULT_INSTANCE;
       }
@@ -1102,14 +1109,14 @@
      * <code>required .prototest.ProtoTestEvent.EventCategory eventType = 1;</code>
      * @return Whether the eventType field is set.
      */
-    @java.lang.Override public boolean hasEventType() {
+    @Override public boolean hasEventType() {
       return ((bitField0_ & 0x00000001) != 0);
     }
     /**
      * <code>required .prototest.ProtoTestEvent.EventCategory eventType = 1;</code>
      * @return The eventType.
      */
-    @java.lang.Override public org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.EventCategory getEventType() {
+    @Override public org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.EventCategory getEventType() {
       @SuppressWarnings("deprecation")
       org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.EventCategory result = org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.EventCategory.valueOf(eventType_);
       return result == null ? org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.EventCategory.CATEGORY_ZERO : result;
@@ -1121,7 +1128,7 @@
      * <code>required uint64 id = 2;</code>
      * @return Whether the id field is set.
      */
-    @java.lang.Override
+    @Override
     public boolean hasId() {
       return ((bitField0_ & 0x00000002) != 0);
     }
@@ -1129,7 +1136,7 @@
      * <code>required uint64 id = 2;</code>
      * @return The id.
      */
-    @java.lang.Override
+    @Override
     public long getId() {
       return id_;
     }
@@ -1140,7 +1147,7 @@
      * <code>required string timestamp = 3;</code>
      * @return Whether the timestamp field is set.
      */
-    @java.lang.Override
+    @Override
     public boolean hasTimestamp() {
       return ((bitField0_ & 0x00000004) != 0);
     }
@@ -1148,7 +1155,7 @@
      * <code>required string timestamp = 3;</code>
      * @return The timestamp.
      */
-    @java.lang.Override
+    @Override
     public java.lang.String getTimestamp() {
       java.lang.Object ref = timestamp_;
       if (ref instanceof java.lang.String) {
@@ -1167,7 +1174,7 @@
      * <code>required string timestamp = 3;</code>
      * @return The bytes for timestamp.
      */
-    @java.lang.Override
+    @Override
     public com.google.protobuf.ByteString
         getTimestampBytes() {
       java.lang.Object ref = timestamp_;
@@ -1188,7 +1195,7 @@
      * <code>optional uint32 someOtherId = 4;</code>
      * @return Whether the someOtherId field is set.
      */
-    @java.lang.Override
+    @Override
     public boolean hasSomeOtherId() {
       return ((bitField0_ & 0x00000008) != 0);
     }
@@ -1196,7 +1203,7 @@
      * <code>optional uint32 someOtherId = 4;</code>
      * @return The someOtherId.
      */
-    @java.lang.Override
+    @Override
     public int getSomeOtherId() {
       return someOtherId_;
     }
@@ -1207,7 +1214,7 @@
      * <code>optional bool isValid = 5;</code>
      * @return Whether the isValid field is set.
      */
-    @java.lang.Override
+    @Override
     public boolean hasIsValid() {
       return ((bitField0_ & 0x00000010) != 0);
     }
@@ -1215,7 +1222,7 @@
      * <code>optional bool isValid = 5;</code>
      * @return The isValid.
      */
-    @java.lang.Override
+    @Override
     public boolean getIsValid() {
       return isValid_;
     }
@@ -1226,7 +1233,7 @@
      * <code>optional string description = 6;</code>
      * @return Whether the description field is set.
      */
-    @java.lang.Override
+    @Override
     public boolean hasDescription() {
       return ((bitField0_ & 0x00000020) != 0);
     }
@@ -1234,7 +1241,7 @@
      * <code>optional string description = 6;</code>
      * @return The description.
      */
-    @java.lang.Override
+    @Override
     public java.lang.String getDescription() {
       java.lang.Object ref = description_;
       if (ref instanceof java.lang.String) {
@@ -1253,7 +1260,7 @@
      * <code>optional string description = 6;</code>
      * @return The bytes for description.
      */
-    @java.lang.Override
+    @Override
     public com.google.protobuf.ByteString
         getDescriptionBytes() {
       java.lang.Object ref = description_;
@@ -1274,7 +1281,7 @@
      * <code>optional float someFloatColumn = 7;</code>
      * @return Whether the someFloatColumn field is set.
      */
-    @java.lang.Override
+    @Override
     public boolean hasSomeFloatColumn() {
       return ((bitField0_ & 0x00000040) != 0);
     }
@@ -1282,7 +1289,7 @@
      * <code>optional float someFloatColumn = 7;</code>
      * @return The someFloatColumn.
      */
-    @java.lang.Override
+    @Override
     public float getSomeFloatColumn() {
       return someFloatColumn_;
     }
@@ -1293,7 +1300,7 @@
      * <code>optional uint32 someIntColumn = 8;</code>
      * @return Whether the someIntColumn field is set.
      */
-    @java.lang.Override
+    @Override
     public boolean hasSomeIntColumn() {
       return ((bitField0_ & 0x00000080) != 0);
     }
@@ -1301,7 +1308,7 @@
      * <code>optional uint32 someIntColumn = 8;</code>
      * @return The someIntColumn.
      */
-    @java.lang.Override
+    @Override
     public int getSomeIntColumn() {
       return someIntColumn_;
     }
@@ -1312,7 +1319,7 @@
      * <code>optional uint64 someLongColumn = 9;</code>
      * @return Whether the someLongColumn field is set.
      */
-    @java.lang.Override
+    @Override
     public boolean hasSomeLongColumn() {
       return ((bitField0_ & 0x00000100) != 0);
     }
@@ -1320,7 +1327,7 @@
      * <code>optional uint64 someLongColumn = 9;</code>
      * @return The someLongColumn.
      */
-    @java.lang.Override
+    @Override
     public long getSomeLongColumn() {
       return someLongColumn_;
     }
@@ -1331,7 +1338,7 @@
      * <code>optional .prototest.ProtoTestEvent.Foo foo = 10;</code>
      * @return Whether the foo field is set.
      */
-    @java.lang.Override
+    @Override
     public boolean hasFoo() {
       return ((bitField0_ & 0x00000200) != 0);
     }
@@ -1339,14 +1346,14 @@
      * <code>optional .prototest.ProtoTestEvent.Foo foo = 10;</code>
      * @return The foo.
      */
-    @java.lang.Override
+    @Override
     public org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.Foo getFoo() {
       return foo_ == null ? org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.Foo.getDefaultInstance() : foo_;
     }
     /**
      * <code>optional .prototest.ProtoTestEvent.Foo foo = 10;</code>
      */
-    @java.lang.Override
+    @Override
     public org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.FooOrBuilder getFooOrBuilder() {
       return foo_ == null ? org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.Foo.getDefaultInstance() : foo_;
     }
@@ -1356,14 +1363,14 @@
     /**
      * <code>repeated .prototest.ProtoTestEvent.Foo bar = 11;</code>
      */
-    @java.lang.Override
+    @Override
     public java.util.List<org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.Foo> getBarList() {
       return bar_;
     }
     /**
      * <code>repeated .prototest.ProtoTestEvent.Foo bar = 11;</code>
      */
-    @java.lang.Override
+    @Override
     public java.util.List<? extends org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.FooOrBuilder> 
         getBarOrBuilderList() {
       return bar_;
@@ -1371,21 +1378,21 @@
     /**
      * <code>repeated .prototest.ProtoTestEvent.Foo bar = 11;</code>
      */
-    @java.lang.Override
+    @Override
     public int getBarCount() {
       return bar_.size();
     }
     /**
      * <code>repeated .prototest.ProtoTestEvent.Foo bar = 11;</code>
      */
-    @java.lang.Override
+    @Override
     public org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.Foo getBar(int index) {
       return bar_.get(index);
     }
     /**
      * <code>repeated .prototest.ProtoTestEvent.Foo bar = 11;</code>
      */
-    @java.lang.Override
+    @Override
     public org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.FooOrBuilder getBarOrBuilder(
         int index) {
       return bar_.get(index);
@@ -1397,7 +1404,7 @@
      * <code>optional .google.protobuf.Timestamp otherTimestamp = 12;</code>
      * @return Whether the otherTimestamp field is set.
      */
-    @java.lang.Override
+    @Override
     public boolean hasOtherTimestamp() {
       return ((bitField0_ & 0x00000400) != 0);
     }
@@ -1405,20 +1412,20 @@
      * <code>optional .google.protobuf.Timestamp otherTimestamp = 12;</code>
      * @return The otherTimestamp.
      */
-    @java.lang.Override
+    @Override
     public com.google.protobuf.Timestamp getOtherTimestamp() {
       return otherTimestamp_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : otherTimestamp_;
     }
     /**
      * <code>optional .google.protobuf.Timestamp otherTimestamp = 12;</code>
      */
-    @java.lang.Override
+    @Override
     public com.google.protobuf.TimestampOrBuilder getOtherTimestampOrBuilder() {
       return otherTimestamp_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : otherTimestamp_;
     }
 
     private byte memoizedIsInitialized = -1;
-    @java.lang.Override
+    @Override
     public final boolean isInitialized() {
       byte isInitialized = memoizedIsInitialized;
       if (isInitialized == 1) return true;
@@ -1452,7 +1459,7 @@
       return true;
     }
 
-    @java.lang.Override
+    @Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
       if (((bitField0_ & 0x00000001) != 0)) {
@@ -1494,7 +1501,7 @@
       unknownFields.writeTo(output);
     }
 
-    @java.lang.Override
+    @Override
     public int getSerializedSize() {
       int size = memoizedSize;
       if (size != -1) return size;
@@ -1551,7 +1558,7 @@
       return size;
     }
 
-    @java.lang.Override
+    @Override
     public boolean equals(final java.lang.Object obj) {
       if (obj == this) {
        return true;
@@ -1622,7 +1629,7 @@
       return true;
     }
 
-    @java.lang.Override
+    @Override
     public int hashCode() {
       if (memoizedHashCode != 0) {
         return memoizedHashCode;
@@ -1756,7 +1763,7 @@
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
-    @java.lang.Override
+    @Override
     public Builder newBuilderForType() { return newBuilder(); }
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
@@ -1764,13 +1771,13 @@
     public static Builder newBuilder(org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
-    @java.lang.Override
+    @Override
     public Builder toBuilder() {
       return this == DEFAULT_INSTANCE
           ? new Builder() : new Builder().mergeFrom(this);
     }
 
-    @java.lang.Override
+    @Override
     protected Builder newBuilderForType(
         com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
       Builder builder = new Builder(parent);
@@ -1788,7 +1795,7 @@
         return org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.internal_static_prototest_ProtoTestEvent_descriptor;
       }
 
-      @java.lang.Override
+      @Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
         return org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.internal_static_prototest_ProtoTestEvent_fieldAccessorTable
@@ -1814,7 +1821,7 @@
           getOtherTimestampFieldBuilder();
         }
       }
-      @java.lang.Override
+      @Override
       public Builder clear() {
         super.clear();
         eventType_ = 0;
@@ -1856,18 +1863,18 @@
         return this;
       }
 
-      @java.lang.Override
+      @Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
         return org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.internal_static_prototest_ProtoTestEvent_descriptor;
       }
 
-      @java.lang.Override
+      @Override
       public org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent getDefaultInstanceForType() {
         return org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.getDefaultInstance();
       }
 
-      @java.lang.Override
+      @Override
       public org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent build() {
         org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent result = buildPartial();
         if (!result.isInitialized()) {
@@ -1876,7 +1883,7 @@
         return result;
       }
 
-      @java.lang.Override
+      @Override
       public org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent buildPartial() {
         org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent result = new org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent(this);
         int from_bitField0_ = bitField0_;
@@ -1947,39 +1954,39 @@
         return result;
       }
 
-      @java.lang.Override
+      @Override
       public Builder clone() {
         return super.clone();
       }
-      @java.lang.Override
+      @Override
       public Builder setField(
           com.google.protobuf.Descriptors.FieldDescriptor field,
           java.lang.Object value) {
         return super.setField(field, value);
       }
-      @java.lang.Override
+      @Override
       public Builder clearField(
           com.google.protobuf.Descriptors.FieldDescriptor field) {
         return super.clearField(field);
       }
-      @java.lang.Override
+      @Override
       public Builder clearOneof(
           com.google.protobuf.Descriptors.OneofDescriptor oneof) {
         return super.clearOneof(oneof);
       }
-      @java.lang.Override
+      @Override
       public Builder setRepeatedField(
           com.google.protobuf.Descriptors.FieldDescriptor field,
           int index, java.lang.Object value) {
         return super.setRepeatedField(field, index, value);
       }
-      @java.lang.Override
+      @Override
       public Builder addRepeatedField(
           com.google.protobuf.Descriptors.FieldDescriptor field,
           java.lang.Object value) {
         return super.addRepeatedField(field, value);
       }
-      @java.lang.Override
+      @Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
         if (other instanceof org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent) {
           return mergeFrom((org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent)other);
@@ -2059,7 +2066,7 @@
         return this;
       }
 
-      @java.lang.Override
+      @Override
       public final boolean isInitialized() {
         if (!hasEventType()) {
           return false;
@@ -2083,7 +2090,7 @@
         return true;
       }
 
-      @java.lang.Override
+      @Override
       public Builder mergeFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
@@ -2108,14 +2115,14 @@
        * <code>required .prototest.ProtoTestEvent.EventCategory eventType = 1;</code>
        * @return Whether the eventType field is set.
        */
-      @java.lang.Override public boolean hasEventType() {
+      @Override public boolean hasEventType() {
         return ((bitField0_ & 0x00000001) != 0);
       }
       /**
        * <code>required .prototest.ProtoTestEvent.EventCategory eventType = 1;</code>
        * @return The eventType.
        */
-      @java.lang.Override
+      @Override
       public org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.EventCategory getEventType() {
         @SuppressWarnings("deprecation")
         org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.EventCategory result = org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.EventCategory.valueOf(eventType_);
@@ -2151,7 +2158,7 @@
        * <code>required uint64 id = 2;</code>
        * @return Whether the id field is set.
        */
-      @java.lang.Override
+      @Override
       public boolean hasId() {
         return ((bitField0_ & 0x00000002) != 0);
       }
@@ -2159,7 +2166,7 @@
        * <code>required uint64 id = 2;</code>
        * @return The id.
        */
-      @java.lang.Override
+      @Override
       public long getId() {
         return id_;
       }
@@ -2190,6 +2197,7 @@
        * <code>required string timestamp = 3;</code>
        * @return Whether the timestamp field is set.
        */
+      @Override
       public boolean hasTimestamp() {
         return ((bitField0_ & 0x00000004) != 0);
       }
@@ -2197,6 +2205,7 @@
        * <code>required string timestamp = 3;</code>
        * @return The timestamp.
        */
+      @Override
       public java.lang.String getTimestamp() {
         java.lang.Object ref = timestamp_;
         if (!(ref instanceof java.lang.String)) {
@@ -2215,6 +2224,7 @@
        * <code>required string timestamp = 3;</code>
        * @return The bytes for timestamp.
        */
+      @Override
       public com.google.protobuf.ByteString
           getTimestampBytes() {
         java.lang.Object ref = timestamp_;
@@ -2274,7 +2284,7 @@
        * <code>optional uint32 someOtherId = 4;</code>
        * @return Whether the someOtherId field is set.
        */
-      @java.lang.Override
+      @Override
       public boolean hasSomeOtherId() {
         return ((bitField0_ & 0x00000008) != 0);
       }
@@ -2282,7 +2292,7 @@
        * <code>optional uint32 someOtherId = 4;</code>
        * @return The someOtherId.
        */
-      @java.lang.Override
+      @Override
       public int getSomeOtherId() {
         return someOtherId_;
       }
@@ -2313,7 +2323,7 @@
        * <code>optional bool isValid = 5;</code>
        * @return Whether the isValid field is set.
        */
-      @java.lang.Override
+      @Override
       public boolean hasIsValid() {
         return ((bitField0_ & 0x00000010) != 0);
       }
@@ -2321,7 +2331,7 @@
        * <code>optional bool isValid = 5;</code>
        * @return The isValid.
        */
-      @java.lang.Override
+      @Override
       public boolean getIsValid() {
         return isValid_;
       }
@@ -2352,6 +2362,7 @@
        * <code>optional string description = 6;</code>
        * @return Whether the description field is set.
        */
+      @Override
       public boolean hasDescription() {
         return ((bitField0_ & 0x00000020) != 0);
       }
@@ -2359,6 +2370,7 @@
        * <code>optional string description = 6;</code>
        * @return The description.
        */
+      @Override
       public java.lang.String getDescription() {
         java.lang.Object ref = description_;
         if (!(ref instanceof java.lang.String)) {
@@ -2377,6 +2389,7 @@
        * <code>optional string description = 6;</code>
        * @return The bytes for description.
        */
+      @Override
       public com.google.protobuf.ByteString
           getDescriptionBytes() {
         java.lang.Object ref = description_;
@@ -2436,7 +2449,7 @@
        * <code>optional float someFloatColumn = 7;</code>
        * @return Whether the someFloatColumn field is set.
        */
-      @java.lang.Override
+      @Override
       public boolean hasSomeFloatColumn() {
         return ((bitField0_ & 0x00000040) != 0);
       }
@@ -2444,7 +2457,7 @@
        * <code>optional float someFloatColumn = 7;</code>
        * @return The someFloatColumn.
        */
-      @java.lang.Override
+      @Override
       public float getSomeFloatColumn() {
         return someFloatColumn_;
       }
@@ -2475,7 +2488,7 @@
        * <code>optional uint32 someIntColumn = 8;</code>
        * @return Whether the someIntColumn field is set.
        */
-      @java.lang.Override
+      @Override
       public boolean hasSomeIntColumn() {
         return ((bitField0_ & 0x00000080) != 0);
       }
@@ -2483,7 +2496,7 @@
        * <code>optional uint32 someIntColumn = 8;</code>
        * @return The someIntColumn.
        */
-      @java.lang.Override
+      @Override
       public int getSomeIntColumn() {
         return someIntColumn_;
       }
@@ -2514,7 +2527,7 @@
        * <code>optional uint64 someLongColumn = 9;</code>
        * @return Whether the someLongColumn field is set.
        */
-      @java.lang.Override
+      @Override
       public boolean hasSomeLongColumn() {
         return ((bitField0_ & 0x00000100) != 0);
       }
@@ -2522,7 +2535,7 @@
        * <code>optional uint64 someLongColumn = 9;</code>
        * @return The someLongColumn.
        */
-      @java.lang.Override
+      @Override
       public long getSomeLongColumn() {
         return someLongColumn_;
       }
@@ -2555,6 +2568,7 @@
        * <code>optional .prototest.ProtoTestEvent.Foo foo = 10;</code>
        * @return Whether the foo field is set.
        */
+      @Override
       public boolean hasFoo() {
         return ((bitField0_ & 0x00000200) != 0);
       }
@@ -2562,6 +2576,7 @@
        * <code>optional .prototest.ProtoTestEvent.Foo foo = 10;</code>
        * @return The foo.
        */
+      @Override
       public org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.Foo getFoo() {
         if (fooBuilder_ == null) {
           return foo_ == null ? org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.Foo.getDefaultInstance() : foo_;
@@ -2643,6 +2658,7 @@
       /**
        * <code>optional .prototest.ProtoTestEvent.Foo foo = 10;</code>
        */
+      @Override
       public org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.FooOrBuilder getFooOrBuilder() {
         if (fooBuilder_ != null) {
           return fooBuilder_.getMessageOrBuilder();
@@ -2683,6 +2699,7 @@
       /**
        * <code>repeated .prototest.ProtoTestEvent.Foo bar = 11;</code>
        */
+      @Override
       public java.util.List<org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.Foo> getBarList() {
         if (barBuilder_ == null) {
           return java.util.Collections.unmodifiableList(bar_);
@@ -2693,6 +2710,7 @@
       /**
        * <code>repeated .prototest.ProtoTestEvent.Foo bar = 11;</code>
        */
+      @Override
       public int getBarCount() {
         if (barBuilder_ == null) {
           return bar_.size();
@@ -2703,6 +2721,7 @@
       /**
        * <code>repeated .prototest.ProtoTestEvent.Foo bar = 11;</code>
        */
+      @Override
       public org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.Foo getBar(int index) {
         if (barBuilder_ == null) {
           return bar_.get(index);
@@ -2853,6 +2872,7 @@
       /**
        * <code>repeated .prototest.ProtoTestEvent.Foo bar = 11;</code>
        */
+      @Override
       public org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.FooOrBuilder getBarOrBuilder(
           int index) {
         if (barBuilder_ == null) {
@@ -2863,7 +2883,8 @@
       /**
        * <code>repeated .prototest.ProtoTestEvent.Foo bar = 11;</code>
        */
-      public java.util.List<? extends org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.FooOrBuilder> 
+      @Override
+      public java.util.List<? extends org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent.FooOrBuilder>
            getBarOrBuilderList() {
         if (barBuilder_ != null) {
           return barBuilder_.getMessageOrBuilderList();
@@ -2915,6 +2936,7 @@
        * <code>optional .google.protobuf.Timestamp otherTimestamp = 12;</code>
        * @return Whether the otherTimestamp field is set.
        */
+      @Override
       public boolean hasOtherTimestamp() {
         return ((bitField0_ & 0x00000800) != 0);
       }
@@ -2922,6 +2944,7 @@
        * <code>optional .google.protobuf.Timestamp otherTimestamp = 12;</code>
        * @return The otherTimestamp.
        */
+      @Override
       public com.google.protobuf.Timestamp getOtherTimestamp() {
         if (otherTimestampBuilder_ == null) {
           return otherTimestamp_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : otherTimestamp_;
@@ -3003,6 +3026,7 @@
       /**
        * <code>optional .google.protobuf.Timestamp otherTimestamp = 12;</code>
        */
+      @Override
       public com.google.protobuf.TimestampOrBuilder getOtherTimestampOrBuilder() {
         if (otherTimestampBuilder_ != null) {
           return otherTimestampBuilder_.getMessageOrBuilder();
@@ -3027,13 +3051,13 @@
         }
         return otherTimestampBuilder_;
       }
-      @java.lang.Override
+      @Override
       public final Builder setUnknownFields(
           final com.google.protobuf.UnknownFieldSet unknownFields) {
         return super.setUnknownFields(unknownFields);
       }
 
-      @java.lang.Override
+      @Override
       public final Builder mergeUnknownFields(
           final com.google.protobuf.UnknownFieldSet unknownFields) {
         return super.mergeUnknownFields(unknownFields);
@@ -3055,7 +3079,7 @@
 
     @java.lang.Deprecated public static final com.google.protobuf.Parser<ProtoTestEvent>
         PARSER = new com.google.protobuf.AbstractParser<ProtoTestEvent>() {
-      @java.lang.Override
+      @Override
       public ProtoTestEvent parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
@@ -3068,12 +3092,12 @@
       return PARSER;
     }
 
-    @java.lang.Override
+    @Override
     public com.google.protobuf.Parser<ProtoTestEvent> getParserForType() {
       return PARSER;
     }
 
-    @java.lang.Override
+    @Override
     public org.apache.druid.data.input.protobuf.ProtoTestEventWrapper.ProtoTestEvent getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
diff --git a/indexing-service/src/main/java/org/apache/druid/indexing/seekablestream/supervisor/SeekableStreamSupervisor.java b/indexing-service/src/main/java/org/apache/druid/indexing/seekablestream/supervisor/SeekableStreamSupervisor.java
index 11339d4..f593f7c 100644
--- a/indexing-service/src/main/java/org/apache/druid/indexing/seekablestream/supervisor/SeekableStreamSupervisor.java
+++ b/indexing-service/src/main/java/org/apache/druid/indexing/seekablestream/supervisor/SeekableStreamSupervisor.java
@@ -2186,7 +2186,7 @@
             taskGroupId
         );
 
-        newlyDiscovered.computeIfAbsent(taskGroupId, ArrayList::new).add(partitionId);
+        newlyDiscovered.computeIfAbsent(taskGroupId, k -> new ArrayList<>()).add(partitionId);
       }
     }
 
diff --git a/licenses.yaml b/licenses.yaml
index 87b8b76..6afc386 100644
--- a/licenses.yaml
+++ b/licenses.yaml
@@ -350,7 +350,7 @@
 license_category: binary
 module: java-core
 license_name: Apache License version 2.0
-version: 2.3.2
+version: 2.7.1
 libraries:
   - com.google.errorprone: error_prone_annotations
 
diff --git a/pom.xml b/pom.xml
index 3022069..70ce5cc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -87,6 +87,7 @@
         <datasketches.memory.version>1.3.0</datasketches.memory.version>
         <derby.version>10.14.2.0</derby.version>
         <dropwizard.metrics.version>4.0.0</dropwizard.metrics.version>
+        <errorprone.version>2.7.1</errorprone.version>
         <fastutil.version>8.5.4</fastutil.version>
         <guava.version>16.0.1</guava.version>
         <guice.version>4.1.0</guice.version>
@@ -420,7 +421,7 @@
             <dependency>
                 <groupId>com.google.errorprone</groupId>
                 <artifactId>error_prone_annotations</artifactId>
-                <version>2.3.2</version>
+                <version>${errorprone.version}</version>
             </dependency>
             <dependency>
                 <groupId>com.ibm.icu</groupId>
@@ -1777,17 +1778,20 @@
                     </plugin>
                 </plugins>
             </build>
-        </profile>
-        <profile>
+          </profile>
+          <profile>
             <id>strict</id>
+            <activation>
+              <property>
+                <name>strictCompile</name>
+              </property>
+            </activation>
             <build>
                 <plugins>
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-compiler-plugin</artifactId>
                         <configuration>
-                            <compilerId>javac-with-errorprone</compilerId>
-                            <forceJavacCompilerUse>true</forceJavacCompilerUse>
                             <fork>true</fork>
                             <meminitial>1024m</meminitial>
                             <maxmem>3000m</maxmem>
@@ -1795,58 +1799,81 @@
                             <target>${maven.compiler.target}</target>
                             <showWarnings>false</showWarnings>
                             <compilerArgs>
-                                <arg>-XepDisableWarningsInGeneratedCode</arg>
-
-                                <arg>-Xep:ClassCanBeStatic:ERROR</arg>
-                                <arg>-Xep:PreconditionsInvalidPlaceholder:ERROR</arg>
-                                <arg>-Xep:MissingOverride:ERROR</arg>
-                                <arg>-Xep:DefaultCharset:ERROR</arg>
-                                <arg>-Xep:QualifierOrScopeOnInjectMethod:ERROR</arg>
-
-                                <arg>-Xep:AssistedInjectAndInjectOnSameConstructor</arg>
-                                <arg>-Xep:AutoFactoryAtInject</arg>
-                                <arg>-Xep:ClassName</arg>
-                                <arg>-Xep:ComparisonContractViolated</arg>
-                                <arg>-Xep:DepAnn</arg>
-                                <arg>-Xep:DivZero</arg>
-                                <arg>-Xep:EmptyIf</arg>
-                                <arg>-Xep:InjectInvalidTargetingOnScopingAnnotation</arg>
-                                <arg>-Xep:InjectMoreThanOneQualifier</arg>
-                                <arg>-Xep:InjectScopeAnnotationOnInterfaceOrAbstractClass</arg>
-                                <arg>-Xep:InjectScopeOrQualifierAnnotationRetention</arg>
-                                <arg>-Xep:InjectedConstructorAnnotations</arg>
-                                <arg>-Xep:InsecureCryptoUsage</arg>
-                                <arg>-Xep:JMockTestWithoutRunWithOrRuleAnnotation</arg>
-                                <arg>-Xep:JavaxInjectOnFinalField</arg>
-                                <arg>-Xep:LockMethodChecker</arg>
-                                <arg>-Xep:LongLiteralLowerCaseSuffix</arg>
-                                <arg>-Xep:NoAllocation</arg>
-                                <arg>-Xep:NonRuntimeAnnotation</arg>
-                                <arg>-Xep:NumericEquality</arg>
-                                <arg>-Xep:ParameterPackage</arg>
-                                <arg>-Xep:ProtoStringFieldReferenceEquality</arg>
-                                <arg>-Xep:UnlockMethod</arg>
-                            </compilerArgs>
+                                <arg>-XDcompilePolicy=simple</arg>
+                                <!-- disable LongFloatConversion until https://github.com/google/error-prone/issues/2396 is fixed -->
+                                <arg>-Xplugin:ErrorProne -XepExcludedPaths:.*/target/generated-(test-)?sources/.* -XepDisableWarningsInGeneratedCode -Xep:ClassCanBeStatic:ERROR -Xep:PreconditionsInvalidPlaceholder:ERROR -Xep:MissingOverride:ERROR -Xep:DefaultCharset:ERROR -Xep:QualifierOrScopeOnInjectMethod:ERROR -Xep:AssistedInjectAndInjectOnSameConstructor -Xep:AutoFactoryAtInject -Xep:ClassName -Xep:ComparisonContractViolated -Xep:DepAnn -Xep:DivZero -Xep:EmptyIf -Xep:InjectInvalidTargetingOnScopingAnnotation  -Xep:InjectMoreThanOneQualifier -Xep:InjectScopeAnnotationOnInterfaceOrAbstractClass -Xep:InjectScopeOrQualifierAnnotationRetention -Xep:InjectedConstructorAnnotations -Xep:InsecureCryptoUsage -Xep:JMockTestWithoutRunWithOrRuleAnnotation -Xep:JavaxInjectOnFinalField -Xep:LockMethodChecker -Xep:LongLiteralLowerCaseSuffix -Xep:NoAllocation -Xep:NonRuntimeAnnotation -Xep:NumericEquality -Xep:ProtoStringFieldReferenceEquality -Xep:UnlockMethod -Xep:LongFloatConversion:OFF</arg>
+                              </compilerArgs>
+                              <annotationProcessorPaths>
+                                <path>
+                                  <groupId>com.google.errorprone</groupId>
+                                  <artifactId>error_prone_core</artifactId>
+                                  <version>${errorprone.version}</version>
+                                </path>
+                              </annotationProcessorPaths>
                         </configuration>
-                        <dependencies>
-                            <dependency>
-                                <groupId>org.codehaus.plexus</groupId>
-                                <artifactId>plexus-compiler-javac-errorprone</artifactId>
-                                <version>2.8.5</version>
-                            </dependency>
-                            <!-- override plexus-compiler-javac-errorprone's dependency on
-                                 Error Prone with the latest version -->
-                            <dependency>
-                                <groupId>com.google.errorprone</groupId>
-                                <artifactId>error_prone_core</artifactId>
-                                <version>2.3.2</version>
-                            </dependency>
-                        </dependencies>
                     </plugin>
                 </plugins>
             </build>
         </profile>
         <profile>
+          <id>strict-java-15+</id>
+          <activation>
+            <jdk>[15,)</jdk>
+            <property>
+              <name>strictCompile</name>
+            </property>
+          </activation>
+          <build>
+            <plugins>
+              <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                  <release>${java.version}</release>
+                  <compilerArgs combine.children="append">
+                    <!-- Error Prone requires exemptions for Java 16, see https://errorprone.info/docs/installation#jdk-16 -->
+                    <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg>
+                    <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>
+                    <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>
+                    <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>
+                    <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>
+                    <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
+                    <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>
+                    <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>
+                    <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>
+                    <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>
+                  </compilerArgs>
+                </configuration>
+              </plugin>
+            </plugins>
+          </build>
+        </profile>
+        <!-- using github.com/google/error-prone-javac is required when running on JDK 8
+             see https://errorprone.info/docs/installation#jdk-8 -->
+        <profile>
+          <id>strict-java-8</id>
+          <activation>
+            <jdk>1.8</jdk>
+            <property>
+              <name>strictCompile</name>
+            </property>
+          </activation>
+          <build>
+            <plugins>
+              <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                  <fork>true</fork>
+                  <compilerArgs combine.children="append">
+                    <arg>-J-Xbootclasspath/p:${settings.localRepository}/com/google/errorprone/javac/9+181-r4173-1/javac-9+181-r4173-1.jar</arg>
+                  </compilerArgs>
+                </configuration>
+              </plugin>
+            </plugins>
+          </build>
+        </profile>
+        <profile>
             <id>parallel-test</id>
             <activation>
                 <activeByDefault>false</activeByDefault>
diff --git a/processing/pom.xml b/processing/pom.xml
index 646857e..4f05d4f 100644
--- a/processing/pom.xml
+++ b/processing/pom.xml
@@ -257,14 +257,16 @@
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
                 <configuration>
-                    <annotationProcessorPaths>
+                    <!-- keep annotation processor paths defined in parent pom -->
+                    <annotationProcessorPaths combine.children="append">
                         <path>
                             <groupId>org.apache.druid</groupId>
                             <artifactId>druid-core</artifactId>
                             <version>${project.parent.version}</version>
                         </path>
                     </annotationProcessorPaths>
-                    <annotationProcessors>
+                    <!-- keep annotation processors defined in parent pom -->
+                    <annotationProcessors combine.children="append">
                         <annotationProcessor>org.apache.druid.annotations.SubclassesMustBePublicAnnotationProcessor</annotationProcessor>
                     </annotationProcessors>
                 </configuration>
diff --git a/processing/src/main/java/org/apache/druid/query/filter/InDimFilter.java b/processing/src/main/java/org/apache/druid/query/filter/InDimFilter.java
index adba7f8..0cae9809 100644
--- a/processing/src/main/java/org/apache/druid/query/filter/InDimFilter.java
+++ b/processing/src/main/java/org/apache/druid/query/filter/InDimFilter.java
@@ -526,6 +526,7 @@
     };
   }
 
+  @SuppressWarnings("ReturnValueIgnored")
   private static Predicate<String> createStringPredicate(final Set<String> values)
   {
     Preconditions.checkNotNull(values, "values");
@@ -536,8 +537,6 @@
       // programmatically as a result of optimizations like rewriting inner joins as filters, the passed-in Set may
       // not be able to accept nulls. We don't want to copy the Sets (since they may be large) so instead we'll wrap
       // it in a null-checking lambda if needed.
-
-      //noinspection ResultOfMethodCallIgnored
       values.contains(null);
 
       // Safe to do values.contains(null).
diff --git a/processing/src/main/java/org/apache/druid/query/groupby/orderby/DefaultLimitSpec.java b/processing/src/main/java/org/apache/druid/query/groupby/orderby/DefaultLimitSpec.java
index da6fea6..a9fc3fe 100644
--- a/processing/src/main/java/org/apache/druid/query/groupby/orderby/DefaultLimitSpec.java
+++ b/processing/src/main/java/org/apache/druid/query/groupby/orderby/DefaultLimitSpec.java
@@ -520,7 +520,7 @@
    * This API works by "creative" use of equals. It requires warnings to be suppressed and also requires spotbugs
    * exclusions (see spotbugs-exclude.xml).
    */
-  @SuppressWarnings("EqualsAndHashcode")
+  @SuppressWarnings({"EqualsAndHashcode", "EqualsHashCode"})
   static class LimitJsonIncludeFilter // lgtm [java/inconsistent-equals-and-hashcode]
   {
     @Override
diff --git a/processing/src/main/java/org/apache/druid/query/scan/ScanQuery.java b/processing/src/main/java/org/apache/druid/query/scan/ScanQuery.java
index 067bdff..b339a89 100644
--- a/processing/src/main/java/org/apache/druid/query/scan/ScanQuery.java
+++ b/processing/src/main/java/org/apache/druid/query/scan/ScanQuery.java
@@ -427,7 +427,7 @@
    * This API works by "creative" use of equals. It requires warnings to be suppressed and also requires spotbugs
    * exclusions (see spotbugs-exclude.xml).
    */
-  @SuppressWarnings({"EqualsAndHashcode"})
+  @SuppressWarnings({"EqualsAndHashcode", "EqualsHashCode"})
   static class ScanRowsLimitJsonIncludeFilter // lgtm [java/inconsistent-equals-and-hashcode]
   {
     @Override
diff --git a/processing/src/test/java/org/apache/druid/query/lookup/LookupExtractorFactoryContainerTest.java b/processing/src/test/java/org/apache/druid/query/lookup/LookupExtractorFactoryContainerTest.java
index 875af6a..500093f 100644
--- a/processing/src/test/java/org/apache/druid/query/lookup/LookupExtractorFactoryContainerTest.java
+++ b/processing/src/test/java/org/apache/druid/query/lookup/LookupExtractorFactoryContainerTest.java
@@ -111,6 +111,7 @@
     }
 
     @Override
+    @SuppressWarnings("EqualsHashCode")
     public boolean equals(Object other)
     {
       return other instanceof TestLookupExtractorFactory;
diff --git a/server/src/main/java/org/apache/druid/segment/realtime/appenderator/SinkQuerySegmentWalker.java b/server/src/main/java/org/apache/druid/segment/realtime/appenderator/SinkQuerySegmentWalker.java
index 783a327..6097857 100644
--- a/server/src/main/java/org/apache/druid/segment/realtime/appenderator/SinkQuerySegmentWalker.java
+++ b/server/src/main/java/org/apache/druid/segment/realtime/appenderator/SinkQuerySegmentWalker.java
@@ -152,9 +152,9 @@
     final DataSourceAnalysis analysis = DataSourceAnalysis.forDataSource(query.getDataSource());
 
     // Sanity check: make sure the query is based on the table we're meant to handle.
-    analysis.getBaseTableDataSource()
-            .filter(ds -> dataSource.equals(ds.getName()))
-            .orElseThrow(() -> new ISE("Cannot handle datasource: %s", analysis.getDataSource()));
+    if (!analysis.getBaseTableDataSource().filter(ds -> dataSource.equals(ds.getName())).isPresent()) {
+      throw new ISE("Cannot handle datasource: %s", analysis.getDataSource());
+    }
 
     final QueryRunnerFactory<T, Query<T>> factory = conglomerate.findFactory(query);
     if (factory == null) {
diff --git a/server/src/main/java/org/apache/druid/server/coordinator/HttpLoadQueuePeon.java b/server/src/main/java/org/apache/druid/server/coordinator/HttpLoadQueuePeon.java
index f00e5aa..4a171e5 100644
--- a/server/src/main/java/org/apache/druid/server/coordinator/HttpLoadQueuePeon.java
+++ b/server/src/main/java/org/apache/druid/server/coordinator/HttpLoadQueuePeon.java
@@ -324,7 +324,7 @@
 
       ScheduledExecutors.scheduleAtFixedRate(
           processingExecutor,
-          new Duration(config.getHttpLoadQueuePeonRepeatDelay()),
+          config.getHttpLoadQueuePeonRepeatDelay(),
           () -> {
             if (!stopped) {
               doSegmentManagement();
diff --git a/server/src/test/java/org/apache/druid/segment/loading/StorageLocationTest.java b/server/src/test/java/org/apache/druid/segment/loading/StorageLocationTest.java
index b50498b..5048f77 100644
--- a/server/src/test/java/org/apache/druid/segment/loading/StorageLocationTest.java
+++ b/server/src/test/java/org/apache/druid/segment/loading/StorageLocationTest.java
@@ -47,6 +47,7 @@
   public TemporaryFolder temporaryFolder = new TemporaryFolder();
 
   @Test
+  @SuppressWarnings("GuardedBy")
   public void testStorageLocationFreePercent()
   {
     // free space ignored only maxSize matters
@@ -66,6 +67,7 @@
   }
 
   @Test
+  @SuppressWarnings("GuardedBy")
   public void testStorageLocationRealFileSystem() throws IOException
   {
     File file = temporaryFolder.newFolder();
@@ -181,6 +183,7 @@
     Assert.assertFalse(loc.release("testPath", 100L));
   }
 
+  @SuppressWarnings("GuardedBy")
   private void verifyLoc(long maxSize, StorageLocation loc)
   {
     Assert.assertEquals(maxSize, loc.availableSizeBytes());
