Merge branch 'gerrit/stabilization-8bc2f61b7c'

Change-Id: I0c78c95191284b9992ffb6b1fc1c74951d905f92
diff --git a/asterixdb/asterix-app/pom.xml b/asterixdb/asterix-app/pom.xml
index 51ede69..41a6f47 100644
--- a/asterixdb/asterix-app/pom.xml
+++ b/asterixdb/asterix-app/pom.xml
@@ -570,7 +570,6 @@
     <dependency>
       <groupId>com.e-movimento.tinytools</groupId>
       <artifactId>privilegedaccessor</artifactId>
-      <version>1.2.2</version>
       <scope>test</scope>
     </dependency>
     <dependency>
diff --git a/asterixdb/asterix-external-data/pom.xml b/asterixdb/asterix-external-data/pom.xml
index 95ff315..dec2ad8 100644
--- a/asterixdb/asterix-external-data/pom.xml
+++ b/asterixdb/asterix-external-data/pom.xml
@@ -272,7 +272,6 @@
     <dependency>
       <groupId>com.e-movimento.tinytools</groupId>
       <artifactId>privilegedaccessor</artifactId>
-      <version>1.2.2</version>
       <scope>test</scope>
     </dependency>
     <dependency>
diff --git a/asterixdb/pom.xml b/asterixdb/pom.xml
index d48eb8a..1aff200 100644
--- a/asterixdb/pom.xml
+++ b/asterixdb/pom.xml
@@ -86,7 +86,7 @@
     <hyracks.version>0.3.8-SNAPSHOT</hyracks.version>
     <hadoop.version>3.3.4</hadoop.version>
     <jacoco.version>0.7.6.201602180812</jacoco.version>
-    <log4j.version>2.17.1</log4j.version>
+    <log4j.version>2.19.0</log4j.version>
     <awsjavasdk.version>2.17.218</awsjavasdk.version>
     <parquet.version>1.12.3</parquet.version>
     <hadoop-awsjavasdk.version>1.12.109</hadoop-awsjavasdk.version>
@@ -1253,7 +1253,7 @@
       <dependency>
         <groupId>org.apache.commons</groupId>
         <artifactId>commons-compress</artifactId>
-        <version>1.21</version>
+        <version>1.22</version>
       </dependency>
       <dependency>
         <groupId>commons-logging</groupId>
diff --git a/asterixdb/src/main/appended-resources/supplemental-models.xml b/asterixdb/src/main/appended-resources/supplemental-models.xml
index 8af8ec1..c37c05f 100644
--- a/asterixdb/src/main/appended-resources/supplemental-models.xml
+++ b/asterixdb/src/main/appended-resources/supplemental-models.xml
@@ -163,9 +163,9 @@
       <artifactId>netty-transport</artifactId>
       <properties>
         <!-- netty is ALv2, and does not contain any embedded LICENSE or NOTICE file -->
-        <license.ignoreMissingEmbeddedLicense>4.1.78.Final</license.ignoreMissingEmbeddedLicense>
-        <license.ignoreMissingEmbeddedNotice>4.1.78.Final</license.ignoreMissingEmbeddedNotice>
-        <license.ignoreNoticeOverride>4.1.78.Final</license.ignoreNoticeOverride>
+        <license.ignoreMissingEmbeddedLicense>4.1.87.Final</license.ignoreMissingEmbeddedLicense>
+        <license.ignoreMissingEmbeddedNotice>4.1.87.Final</license.ignoreMissingEmbeddedNotice>
+        <license.ignoreNoticeOverride>4.1.87.Final</license.ignoreNoticeOverride>
       </properties>
     </project>
   </supplement>
@@ -175,9 +175,9 @@
       <artifactId>netty-transport-classes-epoll</artifactId>
       <properties>
         <!-- netty is ALv2, and does not contain any embedded LICENSE or NOTICE file -->
-        <license.ignoreMissingEmbeddedLicense>4.1.78.Final</license.ignoreMissingEmbeddedLicense>
-        <license.ignoreMissingEmbeddedNotice>4.1.78.Final</license.ignoreMissingEmbeddedNotice>
-        <license.ignoreNoticeOverride>4.1.78.Final</license.ignoreNoticeOverride>
+        <license.ignoreMissingEmbeddedLicense>4.1.87.Final</license.ignoreMissingEmbeddedLicense>
+        <license.ignoreMissingEmbeddedNotice>4.1.87.Final</license.ignoreMissingEmbeddedNotice>
+        <license.ignoreNoticeOverride>4.1.87.Final</license.ignoreNoticeOverride>
       </properties>
     </project>
   </supplement>
@@ -187,9 +187,9 @@
       <artifactId>netty-transport-native-unix-common</artifactId>
       <properties>
         <!-- netty is ALv2, and does not contain any embedded LICENSE or NOTICE file -->
-        <license.ignoreMissingEmbeddedLicense>4.1.78.Final</license.ignoreMissingEmbeddedLicense>
-        <license.ignoreMissingEmbeddedNotice>4.1.78.Final</license.ignoreMissingEmbeddedNotice>
-        <license.ignoreNoticeOverride>4.1.78.Final</license.ignoreNoticeOverride>
+        <license.ignoreMissingEmbeddedLicense>4.1.87.Final</license.ignoreMissingEmbeddedLicense>
+        <license.ignoreMissingEmbeddedNotice>4.1.87.Final</license.ignoreMissingEmbeddedNotice>
+        <license.ignoreNoticeOverride>4.1.87.Final</license.ignoreNoticeOverride>
       </properties>
     </project>
   </supplement>
@@ -199,9 +199,9 @@
       <artifactId>netty-codec</artifactId>
       <properties>
         <!-- netty is ALv2, and does not contain any embedded LICENSE or NOTICE file -->
-        <license.ignoreMissingEmbeddedLicense>4.1.78.Final</license.ignoreMissingEmbeddedLicense>
-        <license.ignoreMissingEmbeddedNotice>4.1.78.Final</license.ignoreMissingEmbeddedNotice>
-        <license.ignoreNoticeOverride>4.1.78.Final</license.ignoreNoticeOverride>
+        <license.ignoreMissingEmbeddedLicense>4.1.87.Final</license.ignoreMissingEmbeddedLicense>
+        <license.ignoreMissingEmbeddedNotice>4.1.87.Final</license.ignoreMissingEmbeddedNotice>
+        <license.ignoreNoticeOverride>4.1.87.Final</license.ignoreNoticeOverride>
       </properties>
     </project>
   </supplement>
@@ -211,9 +211,9 @@
       <artifactId>netty-codec-dns</artifactId>
       <properties>
         <!-- netty is ALv2, and does not contain any embedded LICENSE or NOTICE file -->
-        <license.ignoreMissingEmbeddedLicense>4.1.78.Final</license.ignoreMissingEmbeddedLicense>
-        <license.ignoreMissingEmbeddedNotice>4.1.78.Final</license.ignoreMissingEmbeddedNotice>
-        <license.ignoreNoticeOverride>4.1.78.Final</license.ignoreNoticeOverride>
+        <license.ignoreMissingEmbeddedLicense>4.1.87.Final</license.ignoreMissingEmbeddedLicense>
+        <license.ignoreMissingEmbeddedNotice>4.1.87.Final</license.ignoreMissingEmbeddedNotice>
+        <license.ignoreNoticeOverride>4.1.87.Final</license.ignoreNoticeOverride>
       </properties>
     </project>
   </supplement>
@@ -223,9 +223,9 @@
       <artifactId>netty-codec-http2</artifactId>
       <properties>
         <!-- netty is ALv2, and does not contain any embedded LICENSE or NOTICE file -->
-        <license.ignoreMissingEmbeddedLicense>4.1.78.Final</license.ignoreMissingEmbeddedLicense>
-        <license.ignoreMissingEmbeddedNotice>4.1.78.Final</license.ignoreMissingEmbeddedNotice>
-        <license.ignoreNoticeOverride>4.1.78.Final</license.ignoreNoticeOverride>
+        <license.ignoreMissingEmbeddedLicense>4.1.87.Final</license.ignoreMissingEmbeddedLicense>
+        <license.ignoreMissingEmbeddedNotice>4.1.87.Final</license.ignoreMissingEmbeddedNotice>
+        <license.ignoreNoticeOverride>4.1.87.Final</license.ignoreNoticeOverride>
       </properties>
     </project>
   </supplement>
@@ -235,9 +235,9 @@
       <artifactId>netty-handler</artifactId>
       <properties>
         <!-- netty is ALv2, and does not contain any embedded LICENSE or NOTICE file -->
-        <license.ignoreMissingEmbeddedLicense>4.1.78.Final</license.ignoreMissingEmbeddedLicense>
-        <license.ignoreMissingEmbeddedNotice>4.1.78.Final</license.ignoreMissingEmbeddedNotice>
-        <license.ignoreNoticeOverride>4.1.78.Final</license.ignoreNoticeOverride>
+        <license.ignoreMissingEmbeddedLicense>4.1.87.Final</license.ignoreMissingEmbeddedLicense>
+        <license.ignoreMissingEmbeddedNotice>4.1.87.Final</license.ignoreMissingEmbeddedNotice>
+        <license.ignoreNoticeOverride>4.1.87.Final</license.ignoreNoticeOverride>
       </properties>
     </project>
   </supplement>
@@ -247,9 +247,9 @@
       <artifactId>netty-buffer</artifactId>
       <properties>
         <!-- netty is ALv2, and does not contain any embedded LICENSE or NOTICE file -->
-        <license.ignoreMissingEmbeddedLicense>4.1.78.Final</license.ignoreMissingEmbeddedLicense>
-        <license.ignoreMissingEmbeddedNotice>4.1.78.Final</license.ignoreMissingEmbeddedNotice>
-        <license.ignoreNoticeOverride>4.1.78.Final</license.ignoreNoticeOverride>
+        <license.ignoreMissingEmbeddedLicense>4.1.87.Final</license.ignoreMissingEmbeddedLicense>
+        <license.ignoreMissingEmbeddedNotice>4.1.87.Final</license.ignoreMissingEmbeddedNotice>
+        <license.ignoreNoticeOverride>4.1.87.Final</license.ignoreNoticeOverride>
       </properties>
     </project>
   </supplement>
@@ -259,9 +259,9 @@
       <artifactId>netty-common</artifactId>
       <properties>
         <!-- netty is ALv2, and does not contain any embedded LICENSE or NOTICE file -->
-        <license.ignoreMissingEmbeddedLicense>4.1.78.Final</license.ignoreMissingEmbeddedLicense>
-        <license.ignoreMissingEmbeddedNotice>4.1.78.Final</license.ignoreMissingEmbeddedNotice>
-        <license.ignoreNoticeOverride>4.1.78.Final</license.ignoreNoticeOverride>
+        <license.ignoreMissingEmbeddedLicense>4.1.87.Final</license.ignoreMissingEmbeddedLicense>
+        <license.ignoreMissingEmbeddedNotice>4.1.87.Final</license.ignoreMissingEmbeddedNotice>
+        <license.ignoreNoticeOverride>4.1.87.Final</license.ignoreNoticeOverride>
       </properties>
     </project>
   </supplement>
@@ -271,9 +271,9 @@
       <artifactId>netty-codec-http</artifactId>
       <properties>
         <!-- netty is ALv2, and does not contain any embedded LICENSE or NOTICE file -->
-        <license.ignoreMissingEmbeddedLicense>4.1.78.Final</license.ignoreMissingEmbeddedLicense>
-        <license.ignoreMissingEmbeddedNotice>4.1.78.Final</license.ignoreMissingEmbeddedNotice>
-        <license.ignoreNoticeOverride>4.1.78.Final</license.ignoreNoticeOverride>
+        <license.ignoreMissingEmbeddedLicense>4.1.87.Final</license.ignoreMissingEmbeddedLicense>
+        <license.ignoreMissingEmbeddedNotice>4.1.87.Final</license.ignoreMissingEmbeddedNotice>
+        <license.ignoreNoticeOverride>4.1.87.Final</license.ignoreNoticeOverride>
       </properties>
     </project>
   </supplement>
@@ -283,9 +283,9 @@
       <artifactId>netty-resolver</artifactId>
       <properties>
         <!-- netty is ALv2, and does not contain any embedded LICENSE or NOTICE file -->
-        <license.ignoreMissingEmbeddedLicense>4.1.78.Final</license.ignoreMissingEmbeddedLicense>
-        <license.ignoreMissingEmbeddedNotice>4.1.78.Final</license.ignoreMissingEmbeddedNotice>
-        <license.ignoreNoticeOverride>4.1.78.Final</license.ignoreNoticeOverride>
+        <license.ignoreMissingEmbeddedLicense>4.1.87.Final</license.ignoreMissingEmbeddedLicense>
+        <license.ignoreMissingEmbeddedNotice>4.1.87.Final</license.ignoreMissingEmbeddedNotice>
+        <license.ignoreNoticeOverride>4.1.87.Final</license.ignoreNoticeOverride>
       </properties>
     </project>
   </supplement>
@@ -295,9 +295,21 @@
       <artifactId>netty-resolver-dns</artifactId>
       <properties>
         <!-- netty is ALv2, and does not contain any embedded LICENSE or NOTICE file -->
-        <license.ignoreMissingEmbeddedLicense>4.1.78.Final</license.ignoreMissingEmbeddedLicense>
-        <license.ignoreMissingEmbeddedNotice>4.1.78.Final</license.ignoreMissingEmbeddedNotice>
-        <license.ignoreNoticeOverride>4.1.78.Final</license.ignoreNoticeOverride>
+        <license.ignoreMissingEmbeddedLicense>4.1.87.Final</license.ignoreMissingEmbeddedLicense>
+        <license.ignoreMissingEmbeddedNotice>4.1.87.Final</license.ignoreMissingEmbeddedNotice>
+        <license.ignoreNoticeOverride>4.1.87.Final</license.ignoreNoticeOverride>
+      </properties>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-transport-native-unix-common</artifactId>
+      <properties>
+        <!-- netty is ALv2, and does not contain any embedded LICENSE or NOTICE file -->
+        <license.ignoreMissingEmbeddedLicense>4.1.87.Final</license.ignoreMissingEmbeddedLicense>
+        <license.ignoreMissingEmbeddedNotice>4.1.87.Final</license.ignoreMissingEmbeddedNotice>
+        <license.ignoreNoticeOverride>4.1.87.Final</license.ignoreNoticeOverride>
       </properties>
     </project>
   </supplement>
@@ -310,8 +322,8 @@
         <!-- see https://github.com/google/guava/blob/v18.0/COPYING -->
         <!-- see https://github.com/google/guava/tree/v28.[012]/COPYING -->
         <!-- see https://github.com/google/guava/blob/v31.0.1/COPYING -->
-        <license.ignoreMissingEmbeddedNotice>18.0,28.0-jre,28.1-jre,28.2-jre,30.1-jre,31.0.1-jre</license.ignoreMissingEmbeddedNotice>
-        <license.ignoreMissingEmbeddedLicense>18.0,28.0-jre,28.1-jre,28.2-jre,30.1-jre,31.0.1-jre</license.ignoreMissingEmbeddedLicense>
+        <license.ignoreMissingEmbeddedNotice>18.0,28.0-jre,28.1-jre,28.2-jre,30.1-jre,31.0.1-jre,31.1-jre</license.ignoreMissingEmbeddedNotice>
+        <license.ignoreMissingEmbeddedLicense>18.0,28.0-jre,28.1-jre,28.2-jre,30.1-jre,31.0.1-jre,31.1-jre</license.ignoreMissingEmbeddedLicense>
       </properties>
     </project>
   </supplement>
@@ -334,8 +346,8 @@
       <!-- see https://github.com/google/error-prone/tree/v2.3.[24]/ -->
       <!-- see https://github.com/google/error-prone/blob/v2.7.1/COPYING -->
       <properties>
-        <license.ignoreMissingEmbeddedLicense>2.3.2,2.3.4,2.7.1</license.ignoreMissingEmbeddedLicense>
-        <license.ignoreMissingEmbeddedNotice>2.3.2,2.3.4,2.7.1</license.ignoreMissingEmbeddedNotice>
+        <license.ignoreMissingEmbeddedLicense>2.3.2,2.3.4,2.7.1,2.11.0</license.ignoreMissingEmbeddedLicense>
+        <license.ignoreMissingEmbeddedNotice>2.3.2,2.3.4,2.7.1,2.11.0</license.ignoreMissingEmbeddedNotice>
       </properties>
     </project>
   </supplement>
@@ -366,7 +378,7 @@
       <artifactId>jackson-annotations</artifactId>
       <properties>
         <!-- jackson-annotations does not provide an embedded NOTICE file -->
-        <license.ignoreMissingEmbeddedNotice>2.12.3,2.13.1,2.13.2</license.ignoreMissingEmbeddedNotice>
+        <license.ignoreMissingEmbeddedNotice>2.12.3,2.13.1,2.13.2,2.13.4,2.14.1</license.ignoreMissingEmbeddedNotice>
       </properties>
     </project>
   </supplement>
diff --git a/asterixdb/src/main/licenses/content/raw.githubusercontent.com_netty_netty_netty-4.1.78.Final_NOTICE.txt b/asterixdb/src/main/licenses/content/raw.githubusercontent.com_netty_netty_netty-4.1.87.Final_NOTICE.txt
similarity index 100%
rename from asterixdb/src/main/licenses/content/raw.githubusercontent.com_netty_netty_netty-4.1.78.Final_NOTICE.txt
rename to asterixdb/src/main/licenses/content/raw.githubusercontent.com_netty_netty_netty-4.1.87.Final_NOTICE.txt
diff --git a/asterixdb/src/main/licenses/templates/asterix-license.ftl b/asterixdb/src/main/licenses/templates/asterix-license.ftl
index 381d400..f9c969e 100644
--- a/asterixdb/src/main/licenses/templates/asterix-license.ftl
+++ b/asterixdb/src/main/licenses/templates/asterix-license.ftl
@@ -34,8 +34,11 @@
 <#list licenseMap as e>
    <#assign licenseUrl = e.getKey()/>
    <#assign entry = e.getValue()/>
-   <#assign projects = entry.projects/>
+   <#assign projects = entry.nonShadowedProjects/>
    <#assign license = entry.getLicense()/>
+   <#if projects?size == 0>
+     <#continue/>
+   </#if>
    <#if projects?size == 1>
    Component:
      <#assign isare = "is"/>
diff --git a/asterixdb/src/main/licenses/templates/asterix-notice.ftl b/asterixdb/src/main/licenses/templates/asterix-notice.ftl
index c825397..5090cb0 100644
--- a/asterixdb/src/main/licenses/templates/asterix-notice.ftl
+++ b/asterixdb/src/main/licenses/templates/asterix-notice.ftl
@@ -34,6 +34,9 @@
    <#assign projects = e.getValue()/>
 
    <#list projects as p>
+     <#if p.shadowed>
+       <#continue/>
+     </#if>
 ${p.name} (${p.groupId}:${p.artifactId}:${p.version})
        <#list p.locations as loc>
 - ${loc}${p.jarName}
diff --git a/hyracks-fullstack/hyracks-fullstack-license/src/main/licenses/templates/hyracks-notice.ftl b/hyracks-fullstack/hyracks-fullstack-license/src/main/licenses/templates/hyracks-notice.ftl
index 8a2eb05..0cf9378 100644
--- a/hyracks-fullstack/hyracks-fullstack-license/src/main/licenses/templates/hyracks-notice.ftl
+++ b/hyracks-fullstack/hyracks-fullstack-license/src/main/licenses/templates/hyracks-notice.ftl
@@ -30,6 +30,9 @@
    <#assign noticeText = e.getKey()/>
    <#assign projects = e.getValue()/>
    <#list projects as p>
+     <#if p.shadowed>
+       <#continue/>
+     </#if>
 ${p.name} (${p.groupId}:${p.artifactId}:${p.version})
        <#list p.locations as loc>
 - ${loc}${p.jarName}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/NodeHeartbeatWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/NodeHeartbeatWork.java
index b772ef9..6fa6224 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/NodeHeartbeatWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/NodeHeartbeatWork.java
@@ -28,9 +28,12 @@
 import org.apache.hyracks.control.common.heartbeat.HeartbeatData;
 import org.apache.hyracks.control.common.ipc.NodeControllerRemoteProxy;
 import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class NodeHeartbeatWork extends AbstractHeartbeatWork {
 
+    private static final Logger LOGGER = LogManager.getLogger();
     private final InetSocketAddress ncAddress;
 
     public NodeHeartbeatWork(ClusterControllerService ccs, String nodeId, HeartbeatData hbData,
@@ -47,6 +50,8 @@
             ncState.getNodeController().heartbeatAck(ccs.getCcId(), null);
         } else {
             // unregistered nc- let him know
+            LOGGER.info("received a heartbeat from unregistered node {}; sending negative ack to node address {}",
+                    nodeId, ncAddress);
             NodeControllerRemoteProxy nc =
                     new NodeControllerRemoteProxy(ccs.getCcId(), ccs.getClusterIPC().getReconnectingHandle(ncAddress));
             nc.heartbeatAck(ccs.getCcId(), HyracksDataException.create(ErrorCode.NO_SUCH_NODE, nodeId));
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-nc-service/pom.xml b/hyracks-fullstack/hyracks/hyracks-control/hyracks-nc-service/pom.xml
index c1ee58a..db09f40 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-nc-service/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-nc-service/pom.xml
@@ -57,7 +57,6 @@
     <dependency>
       <groupId>com.e-movimento.tinytools</groupId>
       <artifactId>privilegedaccessor</artifactId>
-      <version>1.2.2</version>
       <scope>test</scope>
     </dependency>
     <dependency>
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/pom.xml b/hyracks-fullstack/hyracks/hyracks-dataflow-std/pom.xml
index ddb729f..284aa0d 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/pom.xml
@@ -83,7 +83,6 @@
     <dependency>
       <groupId>com.e-movimento.tinytools</groupId>
       <artifactId>privilegedaccessor</artifactId>
-      <version>1.2.2</version>
       <scope>test</scope>
     </dependency>
     <dependency>
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/pom.xml b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/pom.xml
index 84ba707..f2eb1e1 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/pom.xml
@@ -111,7 +111,6 @@
     <dependency>
       <groupId>com.e-movimento.tinytools</groupId>
       <artifactId>privilegedaccessor</artifactId>
-      <version>1.2.2</version>
       <scope>test</scope>
     </dependency>
     <dependency>
diff --git a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/DownloadLicensesMojo.java b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/DownloadLicensesMojo.java
index 293c08c..c8980cd 100644
--- a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/DownloadLicensesMojo.java
+++ b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/DownloadLicensesMojo.java
@@ -63,7 +63,7 @@
                 String fileName = entry.getLicense().getContentFile(false);
                 doDownload(timeoutMillis, i, url, fileName);
             });
-        } catch (ProjectBuildingException e) {
+        } catch (ProjectBuildingException | IOException e) {
             throw new MojoExecutionException("Unexpected exception: " + e, e);
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/GenerateFileMojo.java b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/GenerateFileMojo.java
index 347c19a..297160e 100644
--- a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/GenerateFileMojo.java
+++ b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/GenerateFileMojo.java
@@ -20,11 +20,13 @@
 
 import static org.apache.hyracks.maven.license.GenerateFileMojo.EmbeddedArtifact.LICENSE;
 import static org.apache.hyracks.maven.license.GenerateFileMojo.EmbeddedArtifact.NOTICE;
+import static org.apache.hyracks.maven.license.LicenseUtil.toGav;
 import static org.apache.hyracks.maven.license.ProjectFlag.ALTERNATE_LICENSE_FILE;
 import static org.apache.hyracks.maven.license.ProjectFlag.ALTERNATE_NOTICE_FILE;
 import static org.apache.hyracks.maven.license.ProjectFlag.IGNORE_MISSING_EMBEDDED_LICENSE;
 import static org.apache.hyracks.maven.license.ProjectFlag.IGNORE_MISSING_EMBEDDED_NOTICE;
 import static org.apache.hyracks.maven.license.ProjectFlag.IGNORE_NOTICE_OVERRIDE;
+import static org.apache.hyracks.maven.license.ProjectFlag.IGNORE_SHADOWED_DEPENDENCIES;
 import static org.apache.hyracks.maven.license.ProjectFlag.ON_MULTIPLE_EMBEDDED_LICENSE;
 import static org.apache.hyracks.maven.license.ProjectFlag.ON_MULTIPLE_EMBEDDED_NOTICE;
 
@@ -36,6 +38,7 @@
 import java.io.Writer;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -43,6 +46,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Properties;
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
@@ -54,17 +58,26 @@
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hyracks.maven.license.freemarker.IndentDirective;
 import org.apache.hyracks.maven.license.freemarker.LoadFileDirective;
 import org.apache.hyracks.maven.license.project.LicensedProjects;
 import org.apache.hyracks.maven.license.project.Project;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.DefaultArtifact;
+import org.apache.maven.artifact.handler.ArtifactHandler;
+import org.apache.maven.artifact.handler.DefaultArtifactHandler;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.plugins.annotations.ResolutionScope;
+import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.ProjectBuildingException;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -110,6 +123,9 @@
     @Parameter
     private boolean stripFoundationAssertionFromNotices = false;
 
+    @Parameter
+    private boolean validateShadowLicenses = false;
+
     private SortedMap<String, SortedSet<Project>> noticeMap;
 
     @java.lang.Override
@@ -143,11 +159,12 @@
         }
         licenseSpecs.addAll(urlToLicenseMap.values());
         for (LicenseSpec license : licenseSpecs) {
-            resolveArtifactContent(license, true);
+            resolveArtifactContent(license, true, false);
         }
     }
 
-    private String resolveArtifactContent(ArtifactSpec artifact, boolean bestEffort) throws IOException {
+    private String resolveArtifactContent(ArtifactSpec artifact, boolean bestEffort, boolean suppressWarning)
+            throws IOException {
         if (artifact.getContent() == null) {
             getLog().debug("Resolving content for " + artifact.getUrl() + " (" + artifact.getContentFile() + ")");
             File cFile = new File(artifact.getContentFile());
@@ -161,7 +178,9 @@
             }
             if (!cFile.exists()) {
                 if (!bestEffort) {
-                    getLog().warn("MISSING: content file (" + cFile + ") for url: " + artifact.getUrl());
+                    if (!suppressWarning) {
+                        getLog().warn("MISSING: content file (" + cFile + ") for url: " + artifact.getUrl());
+                    }
                     artifact.setContent("MISSING: " + artifact.getContentFile() + " (" + artifact.getUrl() + ")");
                 }
             } else {
@@ -268,10 +287,12 @@
             for (Project p : lps.getProjects()) {
                 String licenseText = p.getLicenseText();
                 if (licenseText == null) {
-                    warnUnlessFlag(p.gav(), IGNORE_MISSING_EMBEDDED_LICENSE,
-                            "Using license other than from within artifact: " + p.gav() + " (" + lps.getLicense()
-                                    + ")");
-                    licenseText = resolveArtifactContent(lps.getLicense(), false);
+                    if (validateProjectLicense(p)) {
+                        warnUnlessFlag(p.gav(), IGNORE_MISSING_EMBEDDED_LICENSE,
+                                "Using license other than from within artifact: " + p.gav() + " (" + lps.getLicense()
+                                        + ")");
+                    }
+                    licenseText = resolveArtifactContent(lps.getLicense(), false, !validateProjectLicense(p));
                 }
                 LicenseSpec spec = lps.getLicense();
                 if (spec.getDisplayName() == null) {
@@ -297,6 +318,10 @@
         licenseMap = licenseMap2;
     }
 
+    private boolean validateProjectLicense(Project p) {
+        return !p.isShadowed() || validateShadowLicenses;
+    }
+
     private Set<Project> getProjects() {
         Set<Project> projects = new HashSet<>();
         licenseMap.values().forEach(p -> projects.addAll(p.getProjects()));
@@ -309,9 +334,11 @@
             String noticeText = p.getNoticeText();
             if (noticeText == null && noticeOverrides.containsKey(p.gav())) {
                 String noticeUrl = noticeOverrides.get(p.gav());
-                warnUnlessFlag(p.gav(), IGNORE_NOTICE_OVERRIDE,
-                        "Using notice other than from within artifact: " + p.gav() + " (" + noticeUrl + ")");
-                p.setNoticeText(resolveArtifactContent(new NoticeSpec(noticeUrl), false));
+                if (validateProjectLicense(p)) {
+                    warnUnlessFlag(p.gav(), IGNORE_NOTICE_OVERRIDE,
+                            "Using notice other than from within artifact: " + p.gav() + " (" + noticeUrl + ")");
+                }
+                p.setNoticeText(resolveArtifactContent(new NoticeSpec(noticeUrl), false, p.isShadowed()));
             } else if (noticeText == null && !noticeOverrides.containsKey(p.gav())
                     && Boolean.TRUE.equals(getProjectFlag(p.gav(), IGNORE_NOTICE_OVERRIDE))) {
                 getLog().warn(p + " has IGNORE_NOTICE_OVERRIDE flag set, but no override defined...");
@@ -370,7 +397,7 @@
                 // this seems way too liberal
                 filter = entry -> entry.getName().matches("(.*/|^)" + "NOTICE" + "(.(txt|md))?");
                 consumer = Project::setNoticeText;
-                contentTransformer = UnaryOperator.identity();
+                contentTransformer = getNoticeFileContentTransformer();
                 break;
             case LICENSE:
                 name = "LICENSE";
@@ -381,8 +408,7 @@
                 // this seems way too liberal
                 filter = entry -> entry.getName().matches("(.*/|^)" + "LICENSE" + "(.(txt|md))?");
                 consumer = Project::setLicenseText;
-                contentTransformer = stripFoundationAssertionFromNotices
-                        ? text -> FOUNDATION_PATTERN.matcher(text).replaceAll("") : UnaryOperator.identity();
+                contentTransformer = UnaryOperator.identity();
                 break;
             default:
                 throw new IllegalStateException("NYI: " + artifact);
@@ -394,6 +420,9 @@
             } else if (!artifactFile.getName().endsWith(".jar")) {
                 getLog().info("Skipping unknown artifact file type: " + artifactFile);
                 continue;
+            } else if (!validateShadowLicenses && p.isShadowed()) {
+                getLog().info("Skipping shadowed project: " + p.gav());
+                continue;
             }
             String alternateFilename = (String) getProjectFlag(p.gav(), alternateFilenameFlag);
             Predicate<JarEntry> finalFilter =
@@ -472,4 +501,82 @@
         }
         return matches;
     }
+
+    private UnaryOperator<String> getNoticeFileContentTransformer() {
+        UnaryOperator<String> transformer;
+        if (stripFoundationAssertionFromNotices) {
+            transformer = text -> FOUNDATION_PATTERN.matcher(text).replaceAll("");
+        } else {
+            transformer = UnaryOperator.identity();
+        }
+        return transformer;
+    }
+
+    @java.lang.Override
+    protected void gatherProjectDependencies(MavenProject project,
+            Map<MavenProject, List<Pair<String, String>>> dependencyLicenseMap,
+            Map<String, MavenProject> dependencyGavMap) throws ProjectBuildingException, MojoExecutionException {
+        super.gatherProjectDependencies(project, dependencyLicenseMap, dependencyGavMap);
+        gatherShadowedDependencies(dependencyLicenseMap, dependencyGavMap);
+    }
+
+    @java.lang.Override
+    protected void processExtraDependencies(Map<MavenProject, List<Pair<String, String>>> dependencyLicenseMap,
+            Map<String, MavenProject> dependencyGavMap) throws ProjectBuildingException, MojoExecutionException {
+        super.processExtraDependencies(dependencyLicenseMap, dependencyGavMap);
+        gatherShadowedDependencies(dependencyLicenseMap, dependencyGavMap);
+    }
+
+    private void gatherShadowedDependencies(Map<MavenProject, List<Pair<String, String>>> dependencyLicenseMap,
+            Map<String, MavenProject> dependencyGavMap) throws MojoExecutionException, ProjectBuildingException {
+        Set<MavenProject> projects = new TreeSet<>(Comparator.comparing(MavenProject::getId));
+        projects.addAll(dependencyLicenseMap.keySet());
+        for (MavenProject p : projects) {
+            File artifactFile = p.getArtifact().getFile();
+            if (!artifactFile.exists()) {
+                throw new MojoExecutionException("Artifact file " + artifactFile + " does not exist!");
+            } else if (!artifactFile.getName().endsWith(".jar")) {
+                getLog().info("Skipping unknown artifact file type: " + artifactFile);
+                continue;
+            }
+            @SuppressWarnings("unchecked")
+            List<String[]> specs = (List<String[]>) getProjectFlags()
+                    .getOrDefault(Pair.of(toGav(p), IGNORE_SHADOWED_DEPENDENCIES), Collections.emptyList());
+            getLog().debug(p + " has " + IGNORE_SHADOWED_DEPENDENCIES.propName() + " set to "
+                    + specs.stream().map(ArrayUtils::toString).collect(Collectors.joining(",")));
+            try (JarFile jarFile = new JarFile(artifactFile)) {
+                SortedMap<String, JarEntry> matches = gatherMatchingEntries(jarFile,
+                        entry -> entry.getName().matches("(.*/|^)" + "pom\\.properties"));
+                if (!matches.isEmpty()) {
+                    jarEntryLoop: for (JarEntry entry : matches.values()) {
+                        Properties props = new Properties();
+                        props.load(jarFile.getInputStream(entry));
+                        String groupId = props.getProperty("groupId");
+                        String artifactId = props.getProperty("artifactId");
+                        String version = props.getProperty("version");
+                        String gav = groupId + ":" + artifactId + ":" + version;
+                        if (!dependencyGavMap.containsKey(gav)) {
+                            for (String[] ignoreSpec : specs) {
+                                if ((ignoreSpec[0].equals(groupId) || ignoreSpec[0].equals("*"))
+                                        && (ignoreSpec[1].equals(artifactId) || ignoreSpec[1].equals("*"))
+                                        && (ignoreSpec[2].equals(version) || ignoreSpec[2].equals("*"))) {
+                                    getLog().info("skipping " + gav + " (shadowed from " + p.getId()
+                                            + "), as it matches " + IGNORE_SHADOWED_DEPENDENCIES.propName());
+                                    continue jarEntryLoop;
+                                }
+                            }
+                            getLog().info("adding " + gav + " (shadowed from " + p.getId() + ")");
+                            ArtifactHandler handler = new DefaultArtifactHandler("jar");
+                            String[] gavParts = StringUtils.split(gav, ':');
+                            Artifact manualDep = new DefaultArtifact(gavParts[0], gavParts[1], gavParts[2],
+                                    Artifact.SCOPE_COMPILE, "jar", null, handler);
+                            processArtifact(manualDep, dependencyLicenseMap, dependencyGavMap, true);
+                        }
+                    }
+                }
+            } catch (IOException e) {
+                throw new MojoExecutionException(e);
+            }
+        }
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/LicenseMojo.java b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/LicenseMojo.java
index 2206621..3b5fde6 100644
--- a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/LicenseMojo.java
+++ b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/LicenseMojo.java
@@ -70,6 +70,7 @@
 
 public abstract class LicenseMojo extends AbstractMojo {
 
+    private static final String SHADOWED_KEY = LicenseMojo.class.getName() + "_shadowed";
     @Parameter
     protected List<Override> overrides = new ArrayList<>();
 
@@ -249,7 +250,7 @@
         });
     }
 
-    protected void addDependenciesToLicenseMap() throws ProjectBuildingException {
+    protected void addDependenciesToLicenseMap() throws ProjectBuildingException, MojoExecutionException, IOException {
         Map<MavenProject, List<Pair<String, String>>> dependencyLicenseMap = gatherDependencies();
         dependencyLicenseMap.forEach((depProject, value) -> {
             Set<String> locations = dependencySets.isEmpty() ? Collections.singleton(location)
@@ -310,7 +311,9 @@
                 licenseUrl = fakeLicenseUrl;
             }
         }
-        addProject(new Project(depProject, depLocation, depProject.getArtifact().getFile()),
+        addProject(
+                new Project(depProject, depLocation, depProject.getArtifact().getFile(),
+                        Boolean.parseBoolean(String.valueOf(depProject.getContextValue(SHADOWED_KEY)))),
                 new LicenseSpec(licenseUrl, displayName), true);
     }
 
@@ -363,11 +366,13 @@
         }
     }
 
-    protected Map<MavenProject, List<Pair<String, String>>> gatherDependencies() throws ProjectBuildingException {
+    protected Map<MavenProject, List<Pair<String, String>>> gatherDependencies()
+            throws ProjectBuildingException, MojoExecutionException, IOException {
         Map<MavenProject, List<Pair<String, String>>> dependencyLicenseMap = new HashMap<>();
         Map<String, MavenProject> dependencyGavMap = new HashMap<>();
 
         gatherProjectDependencies(project, dependencyLicenseMap, dependencyGavMap);
+        processExtraDependencies(dependencyLicenseMap, dependencyGavMap);
         for (Override override : overrides) {
 
             // Collect both <gav></gav> and <gavs><gav></gav><gav></gav>...</gavs>
@@ -399,29 +404,44 @@
         return dependencyLicenseMap;
     }
 
-    private void gatherProjectDependencies(MavenProject project,
+    protected void gatherProjectDependencies(MavenProject project,
             Map<MavenProject, List<Pair<String, String>>> dependencyLicenseMap,
-            Map<String, MavenProject> dependencyGavMap) throws ProjectBuildingException {
+            Map<String, MavenProject> dependencyGavMap) throws ProjectBuildingException, MojoExecutionException {
+        getLog().debug("+gatherProjectDependencies " + toGav(project));
         final Set<Artifact> dependencyArtifacts = project.getArtifacts();
         if (dependencyArtifacts != null) {
             for (Artifact depArtifact : dependencyArtifacts) {
-                processArtifact(depArtifact, dependencyLicenseMap, dependencyGavMap);
+                processArtifact(depArtifact, dependencyLicenseMap, dependencyGavMap, false);
             }
         }
-        for (String gav : extraDependencies) {
-            ArtifactHandler handler = new DefaultArtifactHandler("jar");
-            String[] gavParts = StringUtils.split(gav, ':');
-            Artifact manualDep = new DefaultArtifact(gavParts[0], gavParts[1], gavParts[2], Artifact.SCOPE_COMPILE,
-                    "jar", null, handler);
-            processArtifact(manualDep, dependencyLicenseMap, dependencyGavMap);
-        }
     }
 
-    private void processArtifact(Artifact depArtifact,
+    protected void processExtraDependencies(Map<MavenProject, List<Pair<String, String>>> dependencyLicenseMap,
+            Map<String, MavenProject> dependencyGavMap) throws ProjectBuildingException, MojoExecutionException {
+        for (String extraDependency : extraDependencies) {
+            String[] gavParts = StringUtils.split(extraDependency, ':');
+            String gav = gavParts[0] + ":" + gavParts[1] + ":" + gavParts[2];
+            if (!dependencyGavMap.containsKey(gav)) {
+                ArtifactHandler handler = new DefaultArtifactHandler("jar");
+                Artifact manualDep = new DefaultArtifact(gavParts[0], gavParts[1], gavParts[2], Artifact.SCOPE_COMPILE,
+                        "jar", null, handler);
+                boolean shadowed = false;
+                if (gavParts.length > 3) {
+                    shadowed = "shadowed".equals(gavParts[3]);
+                }
+                processArtifact(manualDep, dependencyLicenseMap, dependencyGavMap, shadowed);
+            } else {
+                getLog().warn("not adding extra dependency " + gav + " as it is already added");
+            }
+        }
+    }
+
+    protected void processArtifact(Artifact depArtifact,
             Map<MavenProject, List<Pair<String, String>>> dependencyLicenseMap,
-            Map<String, MavenProject> dependencyGavMap) throws ProjectBuildingException {
+            Map<String, MavenProject> dependencyGavMap, boolean shadowed) throws ProjectBuildingException {
         if (!excludedScopes.contains(depArtifact.getScope())) {
             MavenProject dep = resolveDependency(depArtifact);
+            getLog().debug("+processArtifact " + toGav(dep));
             if (!depArtifact.isResolved()) {
                 ArtifactResolutionRequest arr = new ArtifactResolutionRequest();
                 arr.setLocalRepository(localRepository);
@@ -442,6 +462,7 @@
                         : (license1.getName() != null ? license1.getName() : "LICENSE_EMPTY_NAME_URL");
                 licenseUrls.add(new ImmutablePair<>(url, license1.getName()));
             }
+            dep.setContextValue(SHADOWED_KEY, shadowed);
             dependencyLicenseMap.put(dep, licenseUrls);
         }
     }
@@ -457,6 +478,10 @@
             } catch (ProjectBuildingException e) {
                 throw new ProjectBuildingException(key, "Error creating dependent artifacts", e);
             }
+            // override the gav in the built dependency with the gavs in depObj
+            depProj.setGroupId(depObj.getGroupId());
+            depProj.setArtifactId(depObj.getArtifactId());
+            depProj.setVersion(depObj.getVersion());
 
             Model supplement = supplementModels
                     .get(SupplementalModelHelper.generateSupplementMapKey(depObj.getGroupId(), depObj.getArtifactId()));
diff --git a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/ProjectFlag.java b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/ProjectFlag.java
index d61dde1..eb46041 100644
--- a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/ProjectFlag.java
+++ b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/ProjectFlag.java
@@ -20,9 +20,12 @@
 
 import static org.apache.hyracks.maven.license.LicenseUtil.toGav;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 import java.util.Properties;
 
+import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hyracks.util.StringUtil;
@@ -36,13 +39,15 @@
     ON_MULTIPLE_EMBEDDED_LICENSE,
     ON_MULTIPLE_EMBEDDED_NOTICE,
     ALTERNATE_LICENSE_FILE,
-    ALTERNATE_NOTICE_FILE;
+    ALTERNATE_NOTICE_FILE,
+    IGNORE_SHADOWED_DEPENDENCIES;
 
     String propName() {
         return "license." + StringUtil.toCamelCase(name());
     }
 
     void visit(MavenProject depObj, Properties properties, LicenseMojo licenseMojo) {
+        licenseMojo.getLog().debug("+" + propName() + ".visit: " + toGav(depObj));
         String value = properties.getProperty(propName());
         if (value == null) {
             return;
@@ -59,12 +64,34 @@
                             + " for " + toGav(depObj));
                 }
                 break;
+            case IGNORE_SHADOWED_DEPENDENCIES:
+                // <license.ignoreShadowedDependencies>*:com.couchbase.client:core-io:*</license.ignoreShadowedDependencies>
+                List<String[]> specsList = new ArrayList<>();
+                for (String spec : StringUtils.split(value, ",")) {
+                    boolean found = false;
+                    String[] specSplit = StringUtils.split(spec, ":");
+                    if (specSplit.length != 4) {
+                        throw new IllegalArgumentException(spec);
+                    }
+                    if (specSplit[0].equals(depObj.getVersion()) || specSplit[0].equals("*")) {
+                        specsList.add(ArrayUtils.subarray(specSplit, 1, specSplit.length));
+                        found = true;
+                    }
+                    if (!found) {
+                        licenseMojo.getLog().info(propName() + " defined on versions that *do not* match: "
+                                + specSplit[0] + " for " + toGav(depObj));
+                    }
+                }
+                if (!specsList.isEmpty()) {
+                    licenseMojo.getProjectFlags().put(Pair.of(toGav(depObj), this), specsList);
+                }
+                break;
             case ALTERNATE_LICENSE_FILE:
             case ALTERNATE_NOTICE_FILE:
             case ON_MULTIPLE_EMBEDDED_NOTICE:
             case ON_MULTIPLE_EMBEDDED_LICENSE:
-                boolean found = false;
                 for (String spec : StringUtils.split(value, ",")) {
+                    boolean found = false;
                     String[] specSplit = StringUtils.split(spec, ":");
                     if (specSplit.length != 2) {
                         throw new IllegalArgumentException(spec);
@@ -73,10 +100,10 @@
                         licenseMojo.getProjectFlags().put(Pair.of(toGav(depObj), this), specSplit[1]);
                         found = true;
                     }
-                }
-                if (!found) {
-                    licenseMojo.getLog().info(propName() + " defined on versions that *do not* match: " + value
-                            + " for " + toGav(depObj));
+                    if (!found) {
+                        licenseMojo.getLog().info(propName() + " defined on versions that *do not* match: " + value
+                                + " for " + toGav(depObj));
+                    }
                 }
                 break;
             default:
diff --git a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/project/LicensedProjects.java b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/project/LicensedProjects.java
index f6f9f32..31b4a86 100644
--- a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/project/LicensedProjects.java
+++ b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/project/LicensedProjects.java
@@ -21,6 +21,7 @@
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
+import java.util.function.Predicate;
 
 import org.apache.hyracks.maven.license.LicenseSpec;
 
@@ -51,6 +52,11 @@
         return projects;
     }
 
+    public SortedSet<Project> getNonShadowedProjects() {
+        return projects.stream().filter(Predicate.not(Project::isShadowed))
+                .collect(() -> new TreeSet<>(Project.PROJECT_COMPARATOR), TreeSet::add, TreeSet::addAll);
+    }
+
     public void addProject(Project project) {
         projects.add(project);
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/project/Project.java b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/project/Project.java
index e44914d..a755c05 100644
--- a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/project/Project.java
+++ b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/project/Project.java
@@ -41,6 +41,7 @@
     private String licenseText;
     private String sourcePointer;
     private String classifier;
+    private final boolean shadowed;
 
     @JsonIgnore
     private MavenProject mavenProject;
@@ -48,7 +49,7 @@
     public static final Comparator<Project> PROJECT_COMPARATOR =
             (o1, o2) -> o1.compareToken().compareTo(o2.compareToken());
 
-    public Project(MavenProject project, String location, File artifactPath) {
+    public Project(MavenProject project, String location, File artifactPath, boolean shadowed) {
         mavenProject = project;
         name = project.getName();
         groupId = project.getGroupId();
@@ -57,6 +58,7 @@
         url = project.getUrl();
         classifier = project.getArtifact().getClassifier();
         this.artifactPath = artifactPath.getPath();
+        this.shadowed = shadowed;
         setLocation(location);
     }
 
@@ -65,7 +67,8 @@
             @JsonProperty("artifactId") String artifactId, @JsonProperty("url") String url,
             @JsonProperty("version") String version, @JsonProperty("location") String location,
             @JsonProperty("artifactPath") String artifactPath, @JsonProperty("noticeText") String noticeText,
-            @JsonProperty("licenseText") String licenseText, @JsonProperty("classifier") String classifier) {
+            @JsonProperty("licenseText") String licenseText, @JsonProperty("classifier") String classifier,
+            @JsonProperty("shadowed") boolean shadowed) {
         this.name = name;
         this.groupId = groupId;
         this.artifactId = artifactId;
@@ -76,6 +79,7 @@
         this.noticeText = noticeText;
         this.licenseText = licenseText;
         this.classifier = classifier;
+        this.shadowed = shadowed;
     }
 
     public String getName() {
@@ -185,6 +189,10 @@
         this.sourcePointer = sourcePointer;
     }
 
+    public boolean isShadowed() {
+        return shadowed;
+    }
+
     @Override
     public String toString() {
         return "Project [" + gav() + "]";
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/LicensingTestBase.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/LicensingTestBase.java
index 9e52785..283c12c 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/LicensingTestBase.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/LicensingTestBase.java
@@ -22,7 +22,6 @@
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 import org.apache.commons.io.FileUtils;
@@ -47,8 +46,7 @@
             }
             installerDir = FileUtil.joinPath(targetDir, list[0], topLevel[0]);
             Assert.assertNotNull("installerDir", list);
-            Assert.assertFalse("Ambiguous install dir (" + pattern + "): " + Arrays.toString(topLevel),
-                    list.length > 1);
+            Assert.assertFalse("Ambiguous install dir (" + pattern + "): " + list, list.length > 1);
             Assert.assertEquals("Can't find install dir (" + pattern + ")", 1, topLevel.length);
         }
     }
diff --git a/hyracks-fullstack/pom.xml b/hyracks-fullstack/pom.xml
index 4345a1d..69a8279 100644
--- a/hyracks-fullstack/pom.xml
+++ b/hyracks-fullstack/pom.xml
@@ -72,9 +72,11 @@
     <!-- Versions under dependencymanagement or used in many projects via properties -->
     <hadoop.version>3.3.1</hadoop.version>
     <jacoco.version>0.7.6.201602180812</jacoco.version>
-    <log4j.version>2.17.1</log4j.version>
+    <log4j.version>2.19.0</log4j.version>
     <snappy.version>1.1.8.4</snappy.version>
-    <jackson.version>2.13.2</jackson.version>
+    <jackson.version>2.14.1</jackson.version>
+    <jackson-databind.version>${jackson.version}</jackson-databind.version>
+    <netty.version>4.1.87.Final</netty.version>
 
     <implementation.title>Apache Hyracks and Algebricks - ${project.name}</implementation.title>
     <implementation.url>https://asterixdb.apache.org/</implementation.url>
@@ -86,52 +88,52 @@
       <dependency>
         <groupId>io.netty</groupId>
         <artifactId>netty-buffer</artifactId>
-        <version>4.1.78.Final</version>
+        <version>${netty.version}</version>
       </dependency>
       <dependency>
         <groupId>io.netty</groupId>
         <artifactId>netty-common</artifactId>
-        <version>4.1.78.Final</version>
+        <version>${netty.version}</version>
       </dependency>
       <dependency>
         <groupId>io.netty</groupId>
         <artifactId>netty-codec-http</artifactId>
-        <version>4.1.78.Final</version>
+        <version>${netty.version}</version>
       </dependency>
       <dependency>
         <groupId>io.netty</groupId>
         <artifactId>netty-transport</artifactId>
-        <version>4.1.78.Final</version>
+        <version>${netty.version}</version>
       </dependency>
       <dependency>
         <groupId>io.netty</groupId>
         <artifactId>netty-codec</artifactId>
-        <version>4.1.78.Final</version>
+        <version>${netty.version}</version>
       </dependency>
       <dependency>
         <groupId>io.netty</groupId>
         <artifactId>netty-handler</artifactId>
-        <version>4.1.78.Final</version>
+        <version>${netty.version}</version>
       </dependency>
       <dependency>
         <groupId>io.netty</groupId>
         <artifactId>netty-transport-classes-epoll</artifactId>
-        <version>4.1.78.Final</version>
+        <version>${netty.version}</version>
       </dependency>
       <dependency>
         <groupId>io.netty</groupId>
         <artifactId>netty-resolver-dns</artifactId>
-        <version>4.1.78.Final</version>
+        <version>${netty.version}</version>
       </dependency>
       <dependency>
         <groupId>io.netty</groupId>
         <artifactId>netty-codec-http2</artifactId>
-        <version>4.1.78.Final</version>
+        <version>${netty.version}</version>
       </dependency>
       <dependency>
         <groupId>io.netty</groupId>
         <artifactId>netty-transport-native-unix-common</artifactId>
-        <version>4.1.78.Final</version>
+        <version>${netty.version}</version>
       </dependency>
       <dependency>
         <groupId>junit</groupId>
@@ -267,6 +269,11 @@
         </exclusions>
       </dependency>
       <dependency>
+        <groupId>com.e-movimento.tinytools</groupId>
+        <artifactId>privilegedaccessor</artifactId>
+        <version>1.3</version>
+      </dependency>
+      <dependency>
         <groupId>commons-io</groupId>
         <artifactId>commons-io</artifactId>
         <version>2.11.0</version>
@@ -274,12 +281,12 @@
       <dependency>
         <groupId>org.apache.commons</groupId>
         <artifactId>commons-text</artifactId>
-        <version>1.9</version>
+        <version>1.10.0</version>
       </dependency>
       <dependency>
         <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-databind</artifactId>
-        <version>2.13.2.2</version>
+        <version>${jackson-databind.version}</version>
       </dependency>
       <dependency>
         <groupId>com.fasterxml.jackson.core</groupId>
@@ -294,7 +301,7 @@
       <dependency>
         <groupId>com.google.guava</groupId>
         <artifactId>guava</artifactId>
-        <version>31.0.1-jre</version>
+        <version>31.1-jre</version>
         <exclusions>
           <exclusion>
             <groupId>com.google.code.findbugs</groupId>