This is an automated email from the ASF dual-hosted git repository.

airblader pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git

commit bde48e96d8f99a011fe11d3127af76db72488f3f
Author: Jing Ge <[email protected]>
AuthorDate: Thu Jan 20 10:40:59 2022 +0100

    [FLINK-25220][test] Split architecture-tests and build ArchUnit extension
    
    - create submodule flink-architecture-tests-base, 
flink-architecture-tests-production, flink-architecture-tests-test
    - build ArchUnit extension and move the common part to the 
flink-architecture-tests-base submodule
    - refactoring and move ArchUnit tests and rules to the 
flink-architecture-tests-production submodule
---
 .../flink-architecture-tests-base/pom.xml          |  46 ++
 .../flink/architecture/common/Conditions.java      |   0
 .../architecture/common/GivenJavaClasses.java      |   0
 .../flink/architecture/common/ImportOptions.java}  |  31 +-
 .../architecture/common/JavaFieldPredicates.java   | 104 +++++
 .../flink/architecture/common/Predicates.java      | 149 +++++++
 .../architecture/common/SourcePredicates.java      |  20 +-
 .../18509c9e-3250-4c52-91b9-11ccefc85db1           |   0
 .../52c5c6a1-204f-462d-9efa-4ffcb100fb4d           |   0
 .../5b9eed8a-5fb6-4373-98ac-3be2a71941b8           |   0
 .../7602816f-5c01-4b7a-9e3e-235dfedec245           |   0
 .../e5126cae-f3fe-48aa-b6fb-60ae6cc3fcd5           |   0
 .../e577412e-8d38-496c-a680-b842112e4b94           |   0
 .../archunit-violations}/stored.rules              |   0
 .../pom.xml                                        |  77 +---
 .../flink/architecture/ArchitectureTest.java       |  43 ++
 .../architecture/rules/ApiAnnotationRules.java     |   0
 .../flink/architecture/rules/TableApiRules.java    |   0
 .../src/test/resources/archunit.properties         |  31 ++
 .../src/test/resources/log4j2-test.properties      |  28 ++
 .../flink-architecture-tests-test/pom.xml          |  83 ++++
 flink-architecture-tests/pom.xml                   | 462 +++++++++++----------
 .../flink/architecture/common/Predicates.java      |  54 ---
 23 files changed, 750 insertions(+), 378 deletions(-)

diff --git a/flink-architecture-tests/flink-architecture-tests-base/pom.xml 
b/flink-architecture-tests/flink-architecture-tests-base/pom.xml
new file mode 100644
index 0000000..53f61c8
--- /dev/null
+++ b/flink-architecture-tests/flink-architecture-tests-base/pom.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
+
+       <modelVersion>4.0.0</modelVersion>
+
+       <parent>
+               <groupId>org.apache.flink</groupId>
+               <artifactId>flink-architecture-tests</artifactId>
+               <version>1.15-SNAPSHOT</version>
+               <relativePath>../pom.xml</relativePath>
+       </parent>
+
+       <artifactId>flink-architecture-tests-base</artifactId>
+       <name>Flink : Architecture Tests : Base</name>
+
+       <packaging>jar</packaging>
+
+       <dependencies>
+               <dependency>
+                       <groupId>com.tngtech.archunit</groupId>
+                       <artifactId>archunit</artifactId>
+                       <scope>compile</scope>
+               </dependency>
+       </dependencies>
+
+</project>
diff --git 
a/flink-architecture-tests/src/test/java/org/apache/flink/architecture/common/Conditions.java
 
b/flink-architecture-tests/flink-architecture-tests-base/src/main/java/org/apache/flink/architecture/common/Conditions.java
similarity index 100%
rename from 
flink-architecture-tests/src/test/java/org/apache/flink/architecture/common/Conditions.java
rename to 
flink-architecture-tests/flink-architecture-tests-base/src/main/java/org/apache/flink/architecture/common/Conditions.java
diff --git 
a/flink-architecture-tests/src/test/java/org/apache/flink/architecture/common/GivenJavaClasses.java
 
b/flink-architecture-tests/flink-architecture-tests-base/src/main/java/org/apache/flink/architecture/common/GivenJavaClasses.java
similarity index 100%
rename from 
flink-architecture-tests/src/test/java/org/apache/flink/architecture/common/GivenJavaClasses.java
rename to 
flink-architecture-tests/flink-architecture-tests-base/src/main/java/org/apache/flink/architecture/common/GivenJavaClasses.java
diff --git 
a/flink-architecture-tests/src/test/java/org/apache/flink/architecture/ArchitectureTest.java
 
b/flink-architecture-tests/flink-architecture-tests-base/src/main/java/org/apache/flink/architecture/common/ImportOptions.java
similarity index 62%
rename from 
flink-architecture-tests/src/test/java/org/apache/flink/architecture/ArchitectureTest.java
rename to 
flink-architecture-tests/flink-architecture-tests-base/src/main/java/org/apache/flink/architecture/common/ImportOptions.java
index 00a2c36..93eed90 100644
--- 
a/flink-architecture-tests/src/test/java/org/apache/flink/architecture/ArchitectureTest.java
+++ 
b/flink-architecture-tests/flink-architecture-tests-base/src/main/java/org/apache/flink/architecture/common/ImportOptions.java
@@ -16,36 +16,15 @@
  * limitations under the License.
  */
 
-package org.apache.flink.architecture;
-
-import org.apache.flink.architecture.common.GivenJavaClasses;
-import org.apache.flink.architecture.common.SourcePredicates;
-import org.apache.flink.architecture.rules.ApiAnnotationRules;
-import org.apache.flink.architecture.rules.TableApiRules;
+package org.apache.flink.architecture.common;
 
 import com.tngtech.archunit.core.importer.ImportOption;
 import com.tngtech.archunit.core.importer.Location;
-import com.tngtech.archunit.junit.AnalyzeClasses;
-import com.tngtech.archunit.junit.ArchTest;
-import com.tngtech.archunit.junit.ArchTests;
 
 import java.util.regex.Pattern;
 
-/** Architecture tests. */
-@AnalyzeClasses(
-        packages = "org.apache.flink",
-        importOptions = {
-            ImportOption.DoNotIncludeTests.class,
-            ArchitectureTest.ExcludeScalaImportOption.class,
-            ArchitectureTest.ExcludeShadedImportOption.class
-        })
-public class ArchitectureTest {
-    @ArchTest
-    public static final ArchTests API_ANNOTATIONS = 
ArchTests.in(ApiAnnotationRules.class);
-
-    @ArchTest public static final ArchTests TABLE_API = 
ArchTests.in(TableApiRules.class);
-
-    // 
---------------------------------------------------------------------------------------------
+/** Provide the most used {@link ImportOption}. */
+public class ImportOptions {
 
     /**
      * Excludes Scala classes on a best-effort basis.
@@ -55,7 +34,7 @@ public class ArchitectureTest {
      * GivenJavaClasses} or {@link SourcePredicates#areJavaClasses()} should 
be used in rules as
      * well.
      */
-    static class ExcludeScalaImportOption implements ImportOption {
+    public static final class ExcludeScalaImportOption implements ImportOption 
{
         private static final Pattern SCALA = Pattern.compile(".*/scala/.*");
 
         @Override
@@ -70,7 +49,7 @@ public class ArchitectureTest {
      * <p>This is not only important to exclude external code shaded into a 
package like {@code
      * org.apache.flink.shaded.*} from being tested, but crucial for memory 
consumption.
      */
-    static class ExcludeShadedImportOption implements ImportOption {
+    public static final class ExcludeShadedImportOption implements 
ImportOption {
         private static final Pattern SHADED = Pattern.compile(".*/shaded/.*");
 
         @Override
diff --git 
a/flink-architecture-tests/flink-architecture-tests-base/src/main/java/org/apache/flink/architecture/common/JavaFieldPredicates.java
 
b/flink-architecture-tests/flink-architecture-tests-base/src/main/java/org/apache/flink/architecture/common/JavaFieldPredicates.java
new file mode 100644
index 0000000..36a5e66
--- /dev/null
+++ 
b/flink-architecture-tests/flink-architecture-tests-base/src/main/java/org/apache/flink/architecture/common/JavaFieldPredicates.java
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.flink.architecture.common;
+
+import com.tngtech.archunit.base.DescribedPredicate;
+import com.tngtech.archunit.core.domain.JavaField;
+import com.tngtech.archunit.core.domain.JavaModifier;
+
+import java.lang.annotation.Annotation;
+
+/** Fine-grained predicates focus on the JavaField. */
+public class JavaFieldPredicates {
+
+    /**
+     * Match the public modifier of the {@link JavaField}.
+     *
+     * @return A {@link DescribedPredicate} returning true, if and only if the 
tested {@link
+     *     JavaField} has the public modifier.
+     */
+    public static DescribedPredicate<JavaField> isPublic() {
+        return DescribedPredicate.describe(
+                "public", field -> 
field.getModifiers().contains(JavaModifier.PUBLIC));
+    }
+
+    /**
+     * Match the static modifier of the {@link JavaField}.
+     *
+     * @return A {@link DescribedPredicate} returning true, if and only if the 
tested {@link
+     *     JavaField} has the static modifier.
+     */
+    public static DescribedPredicate<JavaField> isStatic() {
+        return DescribedPredicate.describe(
+                "static", field -> 
field.getModifiers().contains(JavaModifier.STATIC));
+    }
+
+    /**
+     * Match none static modifier of the {@link JavaField}.
+     *
+     * @return A {@link DescribedPredicate} returning true, if and only if the 
tested {@link
+     *     JavaField} has no static modifier.
+     */
+    public static DescribedPredicate<JavaField> isNotStatic() {
+        return DescribedPredicate.describe(
+                "not static", field -> 
!field.getModifiers().contains(JavaModifier.STATIC));
+    }
+
+    /**
+     * Match the final modifier of the {@link JavaField}.
+     *
+     * @return A {@link DescribedPredicate} returning true, if and only if the 
tested {@link
+     *     JavaField} has the final modifier.
+     */
+    public static DescribedPredicate<JavaField> isFinal() {
+        return DescribedPredicate.describe(
+                "final", field -> 
field.getModifiers().contains(JavaModifier.FINAL));
+    }
+
+    /**
+     * Match the {@link Class} of the {@link JavaField}.
+     *
+     * @return A {@link DescribedPredicate} returning true, if and only if the 
tested {@link
+     *     JavaField} has the same type of the given {@code clazz}.
+     */
+    public static DescribedPredicate<JavaField> ofType(Class<?> clazz) {
+        return DescribedPredicate.describe(
+                "of type " + clazz.getSimpleName(),
+                field -> field.getRawType().isEquivalentTo(clazz));
+    }
+
+    /**
+     * Match the single Annotation of the {@link JavaField}.
+     *
+     * @return A {@link DescribedPredicate} returning true, if and only if the 
tested {@link
+     *     JavaField} has exactly the given Annotation {@code annotationType}.
+     */
+    public static DescribedPredicate<JavaField> annotatedWith(
+            Class<? extends Annotation> annotationType) {
+        return DescribedPredicate.describe(
+                "annotated with @" + annotationType.getSimpleName(),
+                field ->
+                        field.getAnnotations().size() == 1
+                                && field.getAnnotations()
+                                        .iterator()
+                                        .next()
+                                        .getRawType()
+                                        .isEquivalentTo(annotationType));
+    }
+}
diff --git 
a/flink-architecture-tests/flink-architecture-tests-base/src/main/java/org/apache/flink/architecture/common/Predicates.java
 
b/flink-architecture-tests/flink-architecture-tests-base/src/main/java/org/apache/flink/architecture/common/Predicates.java
new file mode 100644
index 0000000..fac5693
--- /dev/null
+++ 
b/flink-architecture-tests/flink-architecture-tests-base/src/main/java/org/apache/flink/architecture/common/Predicates.java
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.flink.architecture.common;
+
+import com.tngtech.archunit.base.ChainableFunction;
+import com.tngtech.archunit.base.DescribedPredicate;
+import com.tngtech.archunit.base.Function;
+import com.tngtech.archunit.core.domain.JavaClass;
+import com.tngtech.archunit.core.domain.JavaField;
+import com.tngtech.archunit.core.domain.JavaModifier;
+import com.tngtech.archunit.core.domain.properties.CanBeAnnotated;
+
+import java.lang.annotation.Annotation;
+import java.util.Arrays;
+import java.util.Set;
+
+import static com.tngtech.archunit.lang.conditions.ArchPredicates.is;
+import static 
org.apache.flink.architecture.common.JavaFieldPredicates.annotatedWith;
+import static org.apache.flink.architecture.common.JavaFieldPredicates.isFinal;
+import static 
org.apache.flink.architecture.common.JavaFieldPredicates.isNotStatic;
+import static 
org.apache.flink.architecture.common.JavaFieldPredicates.isPublic;
+import static org.apache.flink.architecture.common.JavaFieldPredicates.ofType;
+
+/** Common predicates for architecture tests. */
+public class Predicates {
+
+    @SafeVarargs
+    public static DescribedPredicate<JavaClass> 
areDirectlyAnnotatedWithAtLeastOneOf(
+            Class<? extends Annotation>... annotations) {
+        return Arrays.stream(annotations)
+                .map(CanBeAnnotated.Predicates::annotatedWith)
+                .reduce(DescribedPredicate::or)
+                .orElseThrow(IllegalArgumentException::new)
+                .forSubtype();
+    }
+
+    /**
+     * @return A {@link DescribedPredicate} returning true, if and only if the 
predicate {@link
+     *     JavaField} could be found in the {@link JavaClass}.
+     */
+    public static DescribedPredicate<JavaClass> 
containAnyFieldsInClassHierarchyThat(
+            DescribedPredicate<? super JavaField> predicate) {
+        return new ContainAnyFieldsThatPredicate<>(
+                "fields",
+                new ChainableFunction<JavaClass, Set<JavaField>>() {
+                    @Override
+                    public Set<JavaField> apply(JavaClass input) {
+                        // need to get all fields with the inheritance 
hierarchy
+                        return input.getAllFields();
+                    }
+                },
+                predicate);
+    }
+
+    /**
+     * Tests that the given field is {@code public static} and of the given 
type {@code clazz} .
+     *
+     * <p>Attention: changing the description will add a rule into the 
stored.rules.
+     */
+    public static DescribedPredicate<JavaField> arePublicStaticOfType(Class<?> 
clazz) {
+        return DescribedPredicate.describe(
+                "are public, static, and of type " + clazz.getSimpleName(),
+                field ->
+                        field.getModifiers().contains(JavaModifier.PUBLIC)
+                                && 
field.getModifiers().contains(JavaModifier.STATIC)
+                                && field.getRawType().isEquivalentTo(clazz));
+    }
+
+    /**
+     * Tests that the given field is {@code public final} and not {@code 
static} and of the given
+     * type {@code clazz} .
+     */
+    public static DescribedPredicate<JavaField> arePublicFinalOfType(Class<?> 
clazz) {
+        return 
is(ofType(clazz)).and(isPublic()).and(isFinal()).and(isNotStatic());
+    }
+
+    /**
+     * Tests that the given field is {@code public static final} and of the 
given type {@code clazz}
+     * .
+     */
+    public static DescribedPredicate<JavaField> 
arePublicStaticFinalOfType(Class<?> clazz) {
+        return arePublicStaticOfType(clazz).and(isFinal());
+    }
+
+    /**
+     * Tests that the given field is {@code public final} and of the given 
type {@code clazz} with
+     * exactly the given {@code annotationType}.
+     */
+    public static DescribedPredicate<JavaField> 
arePublicFinalOfTypeWithAnnotation(
+            Class<?> clazz, Class<? extends Annotation> annotationType) {
+        return arePublicFinalOfType(clazz).and(annotatedWith(annotationType));
+    }
+
+    /**
+     * Tests that the given field is {@code public static final} and of the 
given type {@code clazz}
+     * with exactly the given {@code annotationType}.
+     */
+    public static DescribedPredicate<JavaField> 
arePublicStaticFinalOfTypeWithAnnotation(
+            Class<?> clazz, Class<? extends Annotation> annotationType) {
+        return 
arePublicStaticFinalOfType(clazz).and(annotatedWith(annotationType));
+    }
+
+    private Predicates() {}
+
+    /**
+     * A predicate to determine if a {@link JavaClass} contains one or more 
{@link JavaField }
+     * matching the supplied predicate.
+     */
+    private static class ContainAnyFieldsThatPredicate<T extends JavaField>
+            extends DescribedPredicate<JavaClass> {
+        private final Function<JavaClass, Set<T>> getFields;
+        private final DescribedPredicate<? super T> predicate;
+
+        ContainAnyFieldsThatPredicate(
+                String fieldDescription,
+                Function<JavaClass, Set<T>> getFields,
+                DescribedPredicate<? super T> predicate) {
+            super("contain any " + fieldDescription + " that " + 
predicate.getDescription());
+            this.getFields = getFields;
+            this.predicate = predicate;
+        }
+
+        @Override
+        public boolean apply(JavaClass input) {
+            for (T member : getFields.apply(input)) {
+                if (predicate.apply(member)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+    }
+}
diff --git 
a/flink-architecture-tests/src/test/java/org/apache/flink/architecture/common/SourcePredicates.java
 
b/flink-architecture-tests/flink-architecture-tests-base/src/main/java/org/apache/flink/architecture/common/SourcePredicates.java
similarity index 79%
rename from 
flink-architecture-tests/src/test/java/org/apache/flink/architecture/common/SourcePredicates.java
rename to 
flink-architecture-tests/flink-architecture-tests-base/src/main/java/org/apache/flink/architecture/common/SourcePredicates.java
index 1b9c339..24b63d9 100644
--- 
a/flink-architecture-tests/src/test/java/org/apache/flink/architecture/common/SourcePredicates.java
+++ 
b/flink-architecture-tests/flink-architecture-tests-base/src/main/java/org/apache/flink/architecture/common/SourcePredicates.java
@@ -21,9 +21,11 @@ package org.apache.flink.architecture.common;
 import com.tngtech.archunit.base.DescribedPredicate;
 import com.tngtech.archunit.core.domain.JavaClass;
 import com.tngtech.archunit.core.domain.Source;
+import com.tngtech.archunit.core.importer.ImportOption;
 import com.tngtech.archunit.core.importer.Location;
 
 import static 
com.tngtech.archunit.core.importer.ImportOption.Predefined.DO_NOT_INCLUDE_TESTS;
+import static 
com.tngtech.archunit.core.importer.ImportOption.Predefined.ONLY_INCLUDE_TESTS;
 
 /** Predicates for a {@link JavaClass}'s {@link Source}. */
 public class SourcePredicates {
@@ -34,13 +36,27 @@ public class SourcePredicates {
      * <p>This check is best-effort only.
      */
     public static DescribedPredicate<JavaClass> areProductionCode() {
-        return new DescribedPredicate<JavaClass>("are production code") {
+        return targetCode(DO_NOT_INCLUDE_TESTS, "are production code");
+    }
+
+    /**
+     * Passes if and only if the given class is from test code.
+     *
+     * <p>This check is best-effort only.
+     */
+    public static DescribedPredicate<JavaClass> areTestCode() {
+        return targetCode(ONLY_INCLUDE_TESTS, "are test code");
+    }
+
+    private static DescribedPredicate<JavaClass> targetCode(
+            ImportOption.Predefined predicates, String description) {
+        return new DescribedPredicate<JavaClass>(description) {
             @Override
             public boolean apply(JavaClass clazz) {
                 return clazz.getSource()
                         .map(Source::getUri)
                         .map(Location::of)
-                        .map(DO_NOT_INCLUDE_TESTS::includes)
+                        .map(predicates::includes)
                         .orElse(false);
             }
         };
diff --git 
a/flink-architecture-tests/violations/18509c9e-3250-4c52-91b9-11ccefc85db1 
b/flink-architecture-tests/flink-architecture-tests-production/archunit-violations/18509c9e-3250-4c52-91b9-11ccefc85db1
similarity index 100%
rename from 
flink-architecture-tests/violations/18509c9e-3250-4c52-91b9-11ccefc85db1
rename to 
flink-architecture-tests/flink-architecture-tests-production/archunit-violations/18509c9e-3250-4c52-91b9-11ccefc85db1
diff --git 
a/flink-architecture-tests/violations/52c5c6a1-204f-462d-9efa-4ffcb100fb4d 
b/flink-architecture-tests/flink-architecture-tests-production/archunit-violations/52c5c6a1-204f-462d-9efa-4ffcb100fb4d
similarity index 100%
rename from 
flink-architecture-tests/violations/52c5c6a1-204f-462d-9efa-4ffcb100fb4d
rename to 
flink-architecture-tests/flink-architecture-tests-production/archunit-violations/52c5c6a1-204f-462d-9efa-4ffcb100fb4d
diff --git 
a/flink-architecture-tests/violations/5b9eed8a-5fb6-4373-98ac-3be2a71941b8 
b/flink-architecture-tests/flink-architecture-tests-production/archunit-violations/5b9eed8a-5fb6-4373-98ac-3be2a71941b8
similarity index 100%
rename from 
flink-architecture-tests/violations/5b9eed8a-5fb6-4373-98ac-3be2a71941b8
rename to 
flink-architecture-tests/flink-architecture-tests-production/archunit-violations/5b9eed8a-5fb6-4373-98ac-3be2a71941b8
diff --git 
a/flink-architecture-tests/violations/7602816f-5c01-4b7a-9e3e-235dfedec245 
b/flink-architecture-tests/flink-architecture-tests-production/archunit-violations/7602816f-5c01-4b7a-9e3e-235dfedec245
similarity index 100%
rename from 
flink-architecture-tests/violations/7602816f-5c01-4b7a-9e3e-235dfedec245
rename to 
flink-architecture-tests/flink-architecture-tests-production/archunit-violations/7602816f-5c01-4b7a-9e3e-235dfedec245
diff --git 
a/flink-architecture-tests/violations/e5126cae-f3fe-48aa-b6fb-60ae6cc3fcd5 
b/flink-architecture-tests/flink-architecture-tests-production/archunit-violations/e5126cae-f3fe-48aa-b6fb-60ae6cc3fcd5
similarity index 100%
rename from 
flink-architecture-tests/violations/e5126cae-f3fe-48aa-b6fb-60ae6cc3fcd5
rename to 
flink-architecture-tests/flink-architecture-tests-production/archunit-violations/e5126cae-f3fe-48aa-b6fb-60ae6cc3fcd5
diff --git 
a/flink-architecture-tests/violations/e577412e-8d38-496c-a680-b842112e4b94 
b/flink-architecture-tests/flink-architecture-tests-production/archunit-violations/e577412e-8d38-496c-a680-b842112e4b94
similarity index 100%
rename from 
flink-architecture-tests/violations/e577412e-8d38-496c-a680-b842112e4b94
rename to 
flink-architecture-tests/flink-architecture-tests-production/archunit-violations/e577412e-8d38-496c-a680-b842112e4b94
diff --git a/flink-architecture-tests/violations/stored.rules 
b/flink-architecture-tests/flink-architecture-tests-production/archunit-violations/stored.rules
similarity index 100%
rename from flink-architecture-tests/violations/stored.rules
rename to 
flink-architecture-tests/flink-architecture-tests-production/archunit-violations/stored.rules
diff --git a/flink-architecture-tests/pom.xml 
b/flink-architecture-tests/flink-architecture-tests-production/pom.xml
similarity index 71%
copy from flink-architecture-tests/pom.xml
copy to flink-architecture-tests/flink-architecture-tests-production/pom.xml
index 5521684..751a056 100644
--- a/flink-architecture-tests/pom.xml
+++ b/flink-architecture-tests/flink-architecture-tests-production/pom.xml
@@ -25,40 +25,35 @@ under the License.
 
        <parent>
                <groupId>org.apache.flink</groupId>
-               <artifactId>flink-parent</artifactId>
+               <artifactId>flink-architecture-tests</artifactId>
                <version>1.15-SNAPSHOT</version>
-               <relativePath>..</relativePath>
+               <relativePath>../pom.xml</relativePath>
        </parent>
 
-       <artifactId>flink-architecture-tests</artifactId>
-       <name>Flink : Architecture Tests</name>
+       <artifactId>flink-architecture-tests-production</artifactId>
+       <name>Flink : Architecture Tests : Production</name>
 
        <packaging>jar</packaging>
 
-       <properties>
-               <archunit.version>0.22.0</archunit.version>
-       </properties>
-
        <dependencies>
                <dependency>
                        <groupId>org.apache.flink</groupId>
+                       <artifactId>flink-architecture-tests-base</artifactId>
+               </dependency>
+
+               <dependency>
+                       <groupId>org.apache.flink</groupId>
                        <artifactId>flink-annotations</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>com.tngtech.archunit</groupId>
                        <artifactId>archunit</artifactId>
-                       <version>${archunit.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>com.tngtech.archunit</groupId>
                        <artifactId>archunit-junit5</artifactId>
-                       <version>${archunit.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <!-- Tested Flink modules -->
@@ -66,8 +61,6 @@ under the License.
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-core</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <!-- Table API & SQL -->
@@ -75,50 +68,36 @@ under the License.
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-table-common</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-table-api-java</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-table-api-java-bridge</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-table-code-splitter</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-table-runtime</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        
<artifactId>flink-table-planner_${scala.binary.version}</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-sql-client</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <!-- Connectors -->
@@ -126,134 +105,96 @@ under the License.
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-connector-base</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-connector-aws-base</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        
<artifactId>flink-connector-cassandra_${scala.binary.version}</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-connector-elasticsearch6</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-connector-elasticsearch7</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        
<artifactId>flink-connector-elasticsearch-base</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-connector-files</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-connector-gcp-pubsub</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-connector-hbase-1.4</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-connector-hbase-2.2</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-connector-hbase-base</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        
<artifactId>flink-connector-hive_${scala.binary.version}</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-connector-jdbc</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-connector-kafka</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        
<artifactId>flink-connector-aws-kinesis-data-streams</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-connector-kinesis</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-connector-nifi</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-connector-pulsar</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
 
                <dependency>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-connector-rabbitmq</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
                </dependency>
        </dependencies>
 
diff --git 
a/flink-architecture-tests/flink-architecture-tests-production/src/test/java/org/apache/flink/architecture/ArchitectureTest.java
 
b/flink-architecture-tests/flink-architecture-tests-production/src/test/java/org/apache/flink/architecture/ArchitectureTest.java
new file mode 100644
index 0000000..3eae3e2
--- /dev/null
+++ 
b/flink-architecture-tests/flink-architecture-tests-production/src/test/java/org/apache/flink/architecture/ArchitectureTest.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.flink.architecture;
+
+import org.apache.flink.architecture.common.ImportOptions;
+import org.apache.flink.architecture.rules.ApiAnnotationRules;
+import org.apache.flink.architecture.rules.TableApiRules;
+
+import com.tngtech.archunit.core.importer.ImportOption;
+import com.tngtech.archunit.junit.AnalyzeClasses;
+import com.tngtech.archunit.junit.ArchTest;
+import com.tngtech.archunit.junit.ArchTests;
+
+/** Architecture tests. */
+@AnalyzeClasses(
+        packages = "org.apache.flink",
+        importOptions = {
+            ImportOption.DoNotIncludeTests.class,
+            ImportOptions.ExcludeScalaImportOption.class,
+            ImportOptions.ExcludeShadedImportOption.class
+        })
+public class ArchitectureTest {
+    @ArchTest
+    public static final ArchTests API_ANNOTATIONS = 
ArchTests.in(ApiAnnotationRules.class);
+
+    @ArchTest public static final ArchTests TABLE_API = 
ArchTests.in(TableApiRules.class);
+}
diff --git 
a/flink-architecture-tests/src/test/java/org/apache/flink/architecture/rules/ApiAnnotationRules.java
 
b/flink-architecture-tests/flink-architecture-tests-production/src/test/java/org/apache/flink/architecture/rules/ApiAnnotationRules.java
similarity index 100%
rename from 
flink-architecture-tests/src/test/java/org/apache/flink/architecture/rules/ApiAnnotationRules.java
rename to 
flink-architecture-tests/flink-architecture-tests-production/src/test/java/org/apache/flink/architecture/rules/ApiAnnotationRules.java
diff --git 
a/flink-architecture-tests/src/test/java/org/apache/flink/architecture/rules/TableApiRules.java
 
b/flink-architecture-tests/flink-architecture-tests-production/src/test/java/org/apache/flink/architecture/rules/TableApiRules.java
similarity index 100%
rename from 
flink-architecture-tests/src/test/java/org/apache/flink/architecture/rules/TableApiRules.java
rename to 
flink-architecture-tests/flink-architecture-tests-production/src/test/java/org/apache/flink/architecture/rules/TableApiRules.java
diff --git 
a/flink-architecture-tests/flink-architecture-tests-production/src/test/resources/archunit.properties
 
b/flink-architecture-tests/flink-architecture-tests-production/src/test/resources/archunit.properties
new file mode 100644
index 0000000..15be88c
--- /dev/null
+++ 
b/flink-architecture-tests/flink-architecture-tests-production/src/test/resources/archunit.properties
@@ -0,0 +1,31 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# By default we allow removing existing violations, but fail when new 
violations are added.
+freeze.store.default.allowStoreUpdate=true
+
+# Enable this if a new (frozen) rule has been added in order to create the 
initial store and record the existing violations.
+#freeze.store.default.allowStoreCreation=true
+
+# Enable this to add allow new violations to be recorded.
+# NOTE: Adding new violations should be avoided when possible. If the rule was 
correct to flag a new
+#       violation, please try to avoid creating the violation. If the 
violation was created due to a
+#       shortcoming of the rule, file a JIRA issue so the rule can be improved.
+#freeze.refreeze=true
+
+freeze.store.default.path=archunit-violations
diff --git 
a/flink-architecture-tests/flink-architecture-tests-production/src/test/resources/log4j2-test.properties
 
b/flink-architecture-tests/flink-architecture-tests-production/src/test/resources/log4j2-test.properties
new file mode 100644
index 0000000..b1c818d
--- /dev/null
+++ 
b/flink-architecture-tests/flink-architecture-tests-production/src/test/resources/log4j2-test.properties
@@ -0,0 +1,28 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Set root logger level to OFF to not flood build logs
+# set manually to INFO for debugging purposes
+rootLogger.level = OFF
+rootLogger.appenderRef.test.ref = TestLogger
+
+appender.testlogger.name = TestLogger
+appender.testlogger.type = CONSOLE
+appender.testlogger.target = SYSTEM_ERR
+appender.testlogger.layout.type = PatternLayout
+appender.testlogger.layout.pattern = %-4r [%t] %-5p %c %x - %m%n
diff --git a/flink-architecture-tests/flink-architecture-tests-test/pom.xml 
b/flink-architecture-tests/flink-architecture-tests-test/pom.xml
new file mode 100644
index 0000000..e227322
--- /dev/null
+++ b/flink-architecture-tests/flink-architecture-tests-test/pom.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
+
+       <modelVersion>4.0.0</modelVersion>
+
+       <parent>
+               <groupId>org.apache.flink</groupId>
+               <artifactId>flink-architecture-tests</artifactId>
+               <version>1.15-SNAPSHOT</version>
+               <relativePath>../pom.xml</relativePath>
+       </parent>
+
+       <artifactId>flink-architecture-tests-test</artifactId>
+       <name>Flink : Architecture Tests : Test</name>
+
+       <packaging>jar</packaging>
+
+       <dependencies>
+               <dependency>
+                       <groupId>org.apache.flink</groupId>
+                       <artifactId>flink-architecture-tests-base</artifactId>
+                       <version>${project.version}</version>
+                       <scope>test</scope>
+               </dependency>
+
+               <dependency>
+                       <groupId>com.tngtech.archunit</groupId>
+                       <artifactId>archunit</artifactId>
+               </dependency>
+
+               <dependency>
+                       <groupId>com.tngtech.archunit</groupId>
+                       <artifactId>archunit-junit5</artifactId>
+               </dependency>
+
+               <!-- Test Utils -->
+
+               <dependency>
+                       <groupId>org.apache.flink</groupId>
+                       <artifactId>flink-test-utils</artifactId>
+               </dependency>
+       </dependencies>
+
+       <build>
+               <plugins>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-enforcer-plugin</artifactId>
+                               <executions>
+                                       <execution>
+                                               <id>dependency-convergence</id>
+                                               <goals>
+                                                       <goal>enforce</goal>
+                                               </goals>
+                                               <configuration>
+                                                       <skip>true</skip>
+                                               </configuration>
+                                       </execution>
+                               </executions>
+                       </plugin>
+               </plugins>
+       </build>
+</project>
diff --git a/flink-architecture-tests/pom.xml b/flink-architecture-tests/pom.xml
index 5521684..d154a50 100644
--- a/flink-architecture-tests/pom.xml
+++ b/flink-architecture-tests/pom.xml
@@ -16,10 +16,10 @@ software distributed under the License is distributed on an
 KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
-
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+                xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
 
        <modelVersion>4.0.0</modelVersion>
 
@@ -27,235 +27,241 @@ under the License.
                <groupId>org.apache.flink</groupId>
                <artifactId>flink-parent</artifactId>
                <version>1.15-SNAPSHOT</version>
-               <relativePath>..</relativePath>
+               <relativePath>../pom.xml</relativePath>
        </parent>
 
        <artifactId>flink-architecture-tests</artifactId>
        <name>Flink : Architecture Tests</name>
-
-       <packaging>jar</packaging>
-
-       <properties>
-               <archunit.version>0.22.0</archunit.version>
-       </properties>
-
-       <dependencies>
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-annotations</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>com.tngtech.archunit</groupId>
-                       <artifactId>archunit</artifactId>
-                       <version>${archunit.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>com.tngtech.archunit</groupId>
-                       <artifactId>archunit-junit5</artifactId>
-                       <version>${archunit.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <!-- Tested Flink modules -->
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-core</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <!-- Table API & SQL -->
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-table-common</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-table-api-java</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-table-api-java-bridge</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-table-code-splitter</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-table-runtime</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       
<artifactId>flink-table-planner_${scala.binary.version}</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-sql-client</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <!-- Connectors -->
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-connector-base</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-connector-aws-base</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       
<artifactId>flink-connector-cassandra_${scala.binary.version}</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-connector-elasticsearch6</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-connector-elasticsearch7</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       
<artifactId>flink-connector-elasticsearch-base</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-connector-files</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-connector-gcp-pubsub</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-connector-hbase-1.4</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-connector-hbase-2.2</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-connector-hbase-base</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       
<artifactId>flink-connector-hive_${scala.binary.version}</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-connector-jdbc</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-connector-kafka</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       
<artifactId>flink-connector-aws-kinesis-data-streams</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-connector-kinesis</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-connector-nifi</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-connector-pulsar</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.apache.flink</groupId>
-                       <artifactId>flink-connector-rabbitmq</artifactId>
-                       <version>${project.version}</version>
-                       <scope>test</scope>
-               </dependency>
-       </dependencies>
+       <packaging>pom</packaging>
+
+       <modules>
+               <module>flink-architecture-tests-base</module>
+               <module>flink-architecture-tests-production</module>
+               <module>flink-architecture-tests-test</module>
+       </modules>
+
+       <dependencyManagement>
+
+               <dependencies>
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               
<artifactId>flink-architecture-tests-base</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               <artifactId>flink-annotations</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <!-- Tested Flink modules -->
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               <artifactId>flink-core</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <!-- Table API & SQL -->
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               <artifactId>flink-table-common</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               <artifactId>flink-table-api-java</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               
<artifactId>flink-table-api-java-bridge</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               
<artifactId>flink-table-code-splitter</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               <artifactId>flink-table-runtime</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               
<artifactId>flink-table-planner_${scala.binary.version}</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               <artifactId>flink-sql-client</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <!-- Connectors -->
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               <artifactId>flink-connector-base</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               
<artifactId>flink-connector-aws-base</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               
<artifactId>flink-connector-cassandra_${scala.binary.version}</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               
<artifactId>flink-connector-elasticsearch6</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               
<artifactId>flink-connector-elasticsearch7</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               
<artifactId>flink-connector-elasticsearch-base</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               <artifactId>flink-connector-files</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               
<artifactId>flink-connector-gcp-pubsub</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               
<artifactId>flink-connector-hbase-1.4</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               
<artifactId>flink-connector-hbase-2.2</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               
<artifactId>flink-connector-hbase-base</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               
<artifactId>flink-connector-hive_${scala.binary.version}</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               <artifactId>flink-connector-jdbc</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               <artifactId>flink-connector-kafka</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               
<artifactId>flink-connector-aws-kinesis-data-streams</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               <artifactId>flink-connector-kinesis</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               <artifactId>flink-connector-nifi</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               <artifactId>flink-connector-pulsar</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               
<artifactId>flink-connector-rabbitmq</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+
+                       <!-- Test Utils -->
+
+                       <dependency>
+                               <groupId>org.apache.flink</groupId>
+                               <artifactId>flink-test-utils</artifactId>
+                               <version>${project.version}</version>
+                               <scope>test</scope>
+                       </dependency>
+               </dependencies>
+       </dependencyManagement>
 
        <build>
                <plugins>
diff --git 
a/flink-architecture-tests/src/test/java/org/apache/flink/architecture/common/Predicates.java
 
b/flink-architecture-tests/src/test/java/org/apache/flink/architecture/common/Predicates.java
deleted file mode 100644
index 1cdcc21..0000000
--- 
a/flink-architecture-tests/src/test/java/org/apache/flink/architecture/common/Predicates.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.flink.architecture.common;
-
-import com.tngtech.archunit.base.DescribedPredicate;
-import com.tngtech.archunit.core.domain.JavaClass;
-import com.tngtech.archunit.core.domain.JavaField;
-import com.tngtech.archunit.core.domain.JavaModifier;
-import com.tngtech.archunit.core.domain.properties.CanBeAnnotated;
-
-import java.lang.annotation.Annotation;
-import java.util.Arrays;
-
-/** Common predicates for architecture tests. */
-public class Predicates {
-
-    @SafeVarargs
-    public static DescribedPredicate<JavaClass> 
areDirectlyAnnotatedWithAtLeastOneOf(
-            Class<? extends Annotation>... annotations) {
-        return Arrays.stream(annotations)
-                .map(CanBeAnnotated.Predicates::annotatedWith)
-                .reduce(DescribedPredicate::or)
-                .orElseThrow(IllegalArgumentException::new)
-                .forSubtype();
-    }
-
-    /** Tests that the given field is {@code public static} and of the given 
type. */
-    public static DescribedPredicate<JavaField> arePublicStaticOfType(Class<?> 
clazz) {
-        return DescribedPredicate.describe(
-                "are public, static, and of type " + clazz.getSimpleName(),
-                field ->
-                        field.getModifiers().contains(JavaModifier.PUBLIC)
-                                && 
field.getModifiers().contains(JavaModifier.STATIC)
-                                && field.getRawType().isEquivalentTo(clazz));
-    }
-
-    private Predicates() {}
-}

Reply via email to