You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datasketches.apache.org by le...@apache.org on 2026/08/10 20:16:11 UTC

(datasketches-java) 01/01: Update POM.

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

leerho pushed a commit to branch refactor_pom
in repository https://gitbox.apache.org/repos/asf/datasketches-java.git

commit 0073fb1dbf1c57a7b010b840a545951fd260c15f
Author: Lee Rhodes <le...@users.noreply.github.com>
AuthorDate: Mon Aug 10 12:59:49 2026 -0700

    Update POM.
    
    Performing an install or deploy is now performed by
    tools/mvn_clean_install_or_deploy.sh. This script will add to the jar
    manifests 4 useful values from git (if present) branch, commit-id,
    commit-time and commit-user-email. If git is not present these values
    will appear as "unknown".
    
    Install and deploy will also create the source zip file into .m2 ready
    for uploading to Apache /dist/.
    
    All artifacts will be signed by GPG, but the user will still need to
    create the sha512 checksums.
---
 pom.xml                                            | 580 +++++++++++----------
 src/assembly/source-release.xml                    |  46 ++
 .../apache/datasketches/PackageDocumentation.java  |  25 +
 .../datasketches/filters/PackageDocumentation.java |  25 +
 tools/mvn_clean_install_or_deploy.sh               |  41 ++
 5 files changed, 445 insertions(+), 272 deletions(-)

diff --git a/pom.xml b/pom.xml
index b799caf89..da24337b1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -27,7 +27,7 @@ under the License.
 
   <groupId>org.apache.datasketches</groupId>
   <artifactId>datasketches-java</artifactId>
-  <version>9.0.1-SNAPSHOT</version>
+  <version>9.1.0-SNAPSHOT</version>
   <packaging>jar</packaging>
 
   <name>${project.artifactId}</name>
@@ -95,34 +95,70 @@ under the License.
     </developer>
   </developers>
 
+  <repositories>
+    <repository>
+      <id>apache.snapshots</id>
+      <name>Apache Snapshot Repository</name>
+      <url>https://repository.apache.org/content/groups/snapshots</url>
+      <releases>
+        <enabled>false</enabled>
+      </releases>
+      <snapshots>
+        <enabled>true</enabled>
+      </snapshots>
+    </repository>
+    <repository>
+      <id>apache</id>
+      <name>Apache Releases Repository</name>
+      <url>https://repository.apache.org/content/groups/public</url>
+      <releases>
+        <enabled>true</enabled>
+      </releases>
+      <snapshots>
+        <enabled>false</enabled>
+      </snapshots>
+    </repository>
+  </repositories>
+
   <properties>
-    <!-- Test -->
+    <!-- Maven properties -->
+    <maven.version>3.9.12</maven.version>
+    <project.build.outputTimestamp>2026-01-01T00:00:00Z</project.build.outputTimestamp>
+    <maven.build.timestamp.format>yyyy-MM-dd'T'HH-mm-ss'Z'</maven.build.timestamp.format>
+
+    <!-- Compiler properties -->
+    <java.version>25</java.version>
+    <maven.compiler.release>${java.version}</maven.compiler.release>
+    <maven.compiler.showWarnings>true</maven.compiler.showWarnings>
+
+    <!-- Test Code Dependencies -->
     <testng.version>7.12.0</testng.version>
+    <org-slf4j.version>2.0.12</org-slf4j.version> <!-- used by TestNG -->
     <!-- these are TestNG groups used for excluding / including groups of tests. See profiles section. -->
     <testng.generate-java-files>generate_java_files</testng.generate-java-files>
     <testng.check-cpp-files>check_cpp_files</testng.check-cpp-files>
     <testng.check-go-files>check_go_files</testng.check-go-files>
     <testng.check-cpp-historical-files>check_cpp_historical_files</testng.check-cpp-historical-files>
 
-    <!-- System-wide properties -->
-    <maven.version>3.9.12</maven.version>
-    <java.version>25</java.version>
-    <maven.compiler.release>${java.version}</maven.compiler.release>
+    <!-- JVM arguments -->
     <jvm.mem>-Xmx4g</jvm.mem>
     <jvm.locale.language>-Duser.language=en</jvm.locale.language>
     <jvm.locale.country>-Duser.country=US</jvm.locale.country>
     <jvm.locale.encoding>-Dfile.encoding=UTF-8</jvm.locale.encoding>
     <jvm.args>${jvm.mem} ${jvm.locale.language} ${jvm.locale.country} ${jvm.locale.encoding}</jvm.args>
+    <argLine></argLine>
+
+    <!-- Encoding & Reporting properties -->
     <charset.encoding>UTF-8</charset.encoding>
-    <project.build.outputTimestamp>2026-01-09T19:00:20Z</project.build.outputTimestamp>
     <project.build.sourceEncoding>${charset.encoding}</project.build.sourceEncoding>
     <project.build.resourceEncoding>${charset.encoding}</project.build.resourceEncoding>
     <project.reporting.inputEncoding>${charset.encoding}</project.reporting.inputEncoding>
     <project.reporting.outputEncoding>${charset.encoding}</project.reporting.outputEncoding>
     <project.reporting.outputDirectory>${project.build.directory}/site</project.reporting.outputDirectory>
-    <maven.build.timestamp.format>yyyy-MM-dd'T'HH-mm-ss'Z'</maven.build.timestamp.format>
 
     <!--  org.apache.maven plugins -->
+    <maven-assembly-plugin.version>3.8.0</maven-assembly-plugin.version>
+    <maven-clean-plugin.version>3.5.0</maven-clean-plugin.version>
     <maven-compiler-plugin.version>3.15.0</maven-compiler-plugin.version>
     <maven-deploy-plugin.version>3.1.4</maven-deploy-plugin.version>
     <maven-enforcer-plugin.version>3.6.2</maven-enforcer-plugin.version>
@@ -131,67 +167,83 @@ under the License.
     <maven-jar-plugin.version>3.4.2</maven-jar-plugin.version>
     <maven-javadoc-plugin.version>3.12.0</maven-javadoc-plugin.version>
     <maven-release-plugin.version>3.3.1</maven-release-plugin.version>
+    <maven-resources-plugin.version>3.5.0</maven-resources-plugin.version>
     <maven-source-plugin.version>3.4.0</maven-source-plugin.version>
     <maven-surefire-failsafe-plugins.version>3.5.4</maven-surefire-failsafe-plugins.version> <!-- surefire, failsafe, surefire-report -->
     <maven-toolchains-plugin.version>3.2.0</maven-toolchains-plugin.version>
 
-    <!--  org.apache.rat plugins -->
-    <apache-rat-plugin.version>0.17</apache-rat-plugin.version>
+    <!-- non-org.apache.maven plugins -->
+
+    <!-- org.apache plugins -->
+    <apache-rat-plugin.version>0.18</apache-rat-plugin.version>
+    <apache-source-release-assembly-descriptor.version>1.8</apache-source-release-assembly-descriptor.version>
 
-    <!-- com.github maven plugins -->
+    <!-- com.github.hazendaz.maven plugins -->
     <coveralls-repo-token></coveralls-repo-token>
     <coveralls-maven-plugin.version>5.0.0</coveralls-maven-plugin.version>
 
-    <!-- io.github plugins -->
-    <git-commit-id-maven-plugin.version>9.0.2</git-commit-id-maven-plugin.version>
-
-    <!-- org.jacoco.maven plugins -->
+    <!-- org.jacoco plugins -->
     <jacoco-maven-plugin.version>0.8.14</jacoco-maven-plugin.version>
 
-    <!-- other -->
-    <lifecycle-mapping.version>1.0.0</lifecycle-mapping.version>
-    <argLine></argLine>
-  </properties>
+    <!-- org.sonatype.plugins -->
+    <nexus-staging-maven-plugin.version>1.7.0</nexus-staging-maven-plugin.version>
 
-  <repositories>
-    <repository>
-      <id>apache.snapshots</id>
-      <name>Apache Snapshot Repository</name>
-      <url>https://repository.apache.org/content/groups/snapshots</url>
-      <releases>
-        <enabled>false</enabled>
-      </releases>
-      <snapshots>
-        <enabled>true</enabled>
-      </snapshots>
-    </repository>
-    <repository>
-      <id>apache</id>
-      <name>Apache Releases Repository</name>
-      <url>https://repository.apache.org/content/groups/public</url>
-      <releases>
-        <enabled>true</enabled>
-      </releases>
-      <snapshots>
-        <enabled>false</enabled>
-      </snapshots>
-    </repository>
-  </repositories>
+    <!-- Default fallback properties in case of a build from distributed source (non-git):
+    <git.branch>source-release-no-git</git.branch>
+    <git.closest.tag.name>unknown</git.closest.tag.name>
+    <git.commit.id.full>unknown</git.commit.id.full>
+    <git.commit.time>unknown</git.commit.time>
+    <git.build.user.email>unknown</git.build.user.email> -->
+  </properties>
 
   <dependencies>
-    <!-- Test Scope -->
     <dependency>
       <groupId>org.testng</groupId>
       <artifactId>testng</artifactId>
       <version>${testng.version}</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+      <version>${org-slf4j.version}</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>
     <pluginManagement>
       <plugins>
 
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-assembly-plugin</artifactId>
+          <version>${maven-assembly-plugin.version}</version>
+          <inherited>false</inherited>
+          <executions>
+            <execution>
+              <id>source-release-assembly</id>
+              <phase>package</phase>
+              <goals>
+                <goal>single</goal>
+              </goals>
+              <configuration>
+                <runOnlyAtExecutionRoot>true</runOnlyAtExecutionRoot>
+                <descriptors>
+                  <descriptor>src/assembly/source-release.xml</descriptor>
+                </descriptors>
+                <tarLongFileMode>posix</tarLongFileMode>
+              </configuration>
+            </execution>
+          </executions>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-clean-plugin</artifactId>
+          <version>${maven-clean-plugin.version}</version>
+        </plugin>
+
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-compiler-plugin</artifactId>
@@ -219,11 +271,11 @@ under the License.
               </goals>
               <configuration>
                 <rules>
-                  <!-- The Java enforcer rule is toolchain unaware
-                  and only checks the compiler version used by the Maven runtime.
+                  <!-- The Java enforcer rule is not toolchain aware
+                  and it only checks the compiler used by the Maven runtime.
                   In the context of toolchains this rule is useless.
                   See: https://github.com/paulmoloney/maven-enforcer-toolchain-rules
-                  <requireJavaVersion> ... </requireJavaVersion>
+                  <requireJavaVersion> </requireJavaVersion>
                   -->
                   <requireMavenVersion>
                     <version>[${maven.version},4.0.0)</version>
@@ -241,6 +293,25 @@ under the License.
           </executions>
         </plugin>
 
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-gpg-plugin</artifactId>
+          <version>${maven-gpg-plugin.version}</version>
+          <executions>
+            <execution>
+              <id>sign-artifacts</id>
+              <phase>verify</phase>
+              <goals><goal>sign</goal></goals>
+            </execution>
+          </executions>
+          <configuration>
+            <gpgArguments>
+              <arg>--verbose</arg>
+              <arg>--personal-digest-preferences=SHA512</arg>
+            </gpgArguments>
+          </configuration>
+        </plugin>
+
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-install-plugin</artifactId>
@@ -255,18 +326,49 @@ under the License.
             <execution>
               <id>default-jar</id>
               <phase>package</phase>
-              <goals>
-                <goal>jar</goal>
-              </goals>
+              <goals><goal>jar</goal></goals>
+              <configuration>
+                <skipIfEmpty>true</skipIfEmpty>
+                <archive>
+                  <manifestEntries>
+                    <Automatic-Module-Name>org.apache.datasketches_java</Automatic-Module-Name>
+                  </manifestEntries>
+                </archive>
+              </configuration>
             </execution>
             <execution>
               <id>default-test-jar</id>
               <phase>package</phase>
-              <goals>
-                <goal>test-jar</goal>
-              </goals>
+              <goals><goal>test-jar</goal></goals>
+              <configuration>
+                <skipIfEmpty>true</skipIfEmpty>
+                <archive>
+                  <manifestEntries>
+                    <Automatic-Module-Name>org.apache.datasketches_java.tests</Automatic-Module-Name>
+                  </manifestEntries>
+                </archive>
+              </configuration>
             </execution>
           </executions>
+          <configuration>
+            <archive>
+              <!-- WARNING: MANIFEST SYNC REQUIRED. If you modify these manifest entries here you must
+                   make sure that all of these entries are identical across the maven-jar-plugin,
+                   maven-javadoc-plugin and maven-source-plugin with the sole exception of the
+                   Automatic-Module-Name, which only belongs in this plugin. -->
+              <manifestEntries>
+                <Build-Jdk-Spec>${java.runtime.version}</Build-Jdk-Spec>
+                <Build-OS>${os.name} ${os.arch} ${os.version}</Build-OS>
+                <Implementation-Vendor>The Apache Software Foundation</Implementation-Vendor>
+                <Group-ArtifactId>${project.groupId}:${project.artifactId}</Group-ArtifactId>
+                <git-branch>${git.branch}</git-branch>
+                <git-commit-tag>${git.closest.tag.name}</git-commit-tag>
+                <git-commit-id>${git.commit.id.full}</git-commit-id>
+                <git-commit-time>${git.commit.time}</git-commit-time>
+                <git-commit-user-email>${git.build.user.email}</git-commit-user-email>
+              </manifestEntries>
+            </archive>
+          </configuration>
         </plugin>
 
         <plugin>
@@ -274,23 +376,46 @@ under the License.
           <artifactId>maven-javadoc-plugin</artifactId>
           <version>${maven-javadoc-plugin.version}</version>
           <configuration>
+            <locale>en_US</locale>
             <outputDirectory>${project.reporting.outputDirectory}</outputDirectory>
             <docfilessubdirs>true</docfilessubdirs>
             <show>public</show>
             <doclint>none</doclint> <!-- use Checkstyle -->
+            <quiet>true</quiet>
             <additionalJOptions>
               <additionalJOption>-J${jvm.mem}</additionalJOption>
               <additionalJOption>-J${jvm.locale.language}</additionalJOption>
               <additionalJOption>-J${jvm.locale.country}</additionalJOption>
               <additionalJOption>-J${jvm.locale.encoding}</additionalJOption>
             </additionalJOptions>
+            <archive>
+              <!-- WARNING: MANIFEST SYNC REQUIRED. If you modify these manifest entries here you must
+                   make sure that all of these entries are identical across the maven-jar-plugin,
+                   maven-javadoc-plugin and maven-source-plugin. -->
+              <manifestEntries>
+                <Build-Jdk-Spec>${java.runtime.version}</Build-Jdk-Spec>
+                <Build-OS>${os.name} ${os.arch} ${os.version}</Build-OS>
+                <Implementation-Vendor>The Apache Software Foundation</Implementation-Vendor>
+                <Group-ArtifactId>${project.groupId}:${project.artifactId}</Group-ArtifactId>
+                <git-branch>${git.branch}</git-branch>
+                <git-commit-tag>${git.closest.tag.name}</git-commit-tag>
+                <git-commit-id>${git.commit.id.full}</git-commit-id>
+                <git-commit-time>${git.commit.time}</git-commit-time>
+                <git-commit-user-email>${git.build.user.email}</git-commit-user-email>
+              </manifestEntries>
+            </archive>
+            <bottom>
+              <![CDATA[
+                Copyright &#169; {inceptionYear}&#8211;{currentYear} The Apache Software Foundation. 
+                All rights reserved. (Commit Time: ${git.commit.time}, Commit: ${git.commit.id.abbrev})
+              ]]>
+            </bottom>
           </configuration>
           <executions>
             <execution>
               <id>attach-javadocs</id>
-              <goals>
-                <goal>jar</goal>
-              </goals>
+              <phase>package</phase>
+              <goals><goal>jar</goal></goals>
             </execution>
           </executions>
         </plugin>
@@ -301,6 +426,12 @@ under the License.
           <version>${maven-release-plugin.version}</version>
         </plugin>
 
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-resources-plugin</artifactId>
+          <version>${maven-resources-plugin.version}</version>
+        </plugin>
+
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-source-plugin</artifactId>
@@ -309,18 +440,32 @@ under the License.
             <execution>
               <id>attach-sources</id>
               <phase>package</phase>
-              <goals>
-                <goal>jar-no-fork</goal>
-              </goals>
+              <goals><goal>jar-no-fork</goal></goals>
             </execution>
             <execution>
               <id>attach-test-sources</id>
               <phase>package</phase>
-              <goals>
-                <goal>test-jar-no-fork</goal>
-              </goals>
+              <goals><goal>test-jar-no-fork</goal></goals>
             </execution>
           </executions>
+          <configuration>
+            <archive>
+              <!-- WARNING: MANIFEST SYNC REQUIRED. If you modify these manifest entries here you must
+                   make sure that all of these entries are identical across the maven-jar-plugin,
+                   maven-javadoc-plugin and maven-source-plugin. -->
+              <manifestEntries>
+                <Build-Jdk-Spec>${java.runtime.version}</Build-Jdk-Spec>
+                <Build-OS>${os.name} ${os.arch} ${os.version}</Build-OS>
+                <Implementation-Vendor>The Apache Software Foundation</Implementation-Vendor>
+                <Group-ArtifactId>${project.groupId}:${project.artifactId}</Group-ArtifactId>
+                <git-branch>${git.branch}</git-branch>
+                <git-commit-tag>${git.closest.tag.name}</git-commit-tag>
+                <git-commit-id>${git.commit.id.full}</git-commit-id>
+                <git-commit-time>${git.commit.time}</git-commit-time>
+                <git-commit-user-email>${git.build.user.email}</git-commit-user-email>
+              </manifestEntries>
+            </archive>
+          </configuration>
         </plugin>
 
         <plugin>
@@ -328,16 +473,19 @@ under the License.
           <artifactId>maven-surefire-plugin</artifactId>
           <version>${maven-surefire-failsafe-plugins.version}</version>
           <configuration>
-            <argLine>@{argLine} ${jvm.args}</argLine>
+            <argLine>@{argLine} ${jvm.args} -Dorg.slf4j.simpleLogger.log.org.testng=warn</argLine>
             <trimStackTrace>false</trimStackTrace>
+            <useFile>true</useFile>
             <useManifestOnlyJar>false</useManifestOnlyJar>
-            <redirectTestOutputToFile>false</redirectTestOutputToFile>
-            <reportsDirectory>${project.build.directory}/test-output</reportsDirectory>
-            <suiteXmlFiles>
-              <suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile>
-            </suiteXmlFiles>
-            <excludedGroups>${testng.generate-java-files},${testng.check-cpp-files},${testng.check-go-files},${testng.check-cpp-historical-files}</excludedGroups>
+            <redirectTestOutputToFile>true</redirectTestOutputToFile>
+            <reportsDirectory>${project.build.directory}/test-output/${maven.build.timestamp}</reportsDirectory>
             <perCoreThreadCount>false</perCoreThreadCount>
+            <properties>
+              <property>
+                <name>verbose</name>
+                <value>0</value> 
+              </property>
+            </properties>
           </configuration>
         </plugin>
 
@@ -347,9 +495,7 @@ under the License.
           <version>${maven-toolchains-plugin.version}</version>
           <executions>
             <execution>
-              <goals>
-                <goal>toolchain</goal>
-              </goals>
+              <goals><goal>toolchain</goal></goals>
             </execution>
           </executions>
           <configuration>
@@ -361,34 +507,39 @@ under the License.
           </configuration>
         </plugin>
 
+        <!-- non-org-apache-maven plugins -->
+
         <plugin>
           <groupId>org.apache.rat</groupId>
           <artifactId>apache-rat-plugin</artifactId>
           <version>${apache-rat-plugin.version}</version>
+          <inherited>true</inherited> <!-- Inherits the configuration to sub modules -->
           <executions>
             <execution>
               <phase>verify</phase>
-              <goals>
-                <goal>check</goal>
-              </goals>
+              <goals><goal>check</goal></goals>
             </execution>
           </executions>
           <configuration>
-            <outputDirectory>${project.basedir}/rat</outputDirectory>
+            <excludeSubProjects>false</excludeSubProjects> <!-- examine the whole project from the root -->
+            <outputDirectory>${project.build.directory}/rat</outputDirectory>
             <consoleOutput>true</consoleOutput>
             <inputExcludes>
-              <!-- rat uses .gitignore for excludes by default -->
-              <inputExcludeStd>StandardCollection</inputExcludeStd>
+              <inputExclude>StandardCollection</inputExclude>
               <inputExclude>**/*.yaml</inputExclude>
               <inputExclude>**/*.yml</inputExclude>
               <inputExclude>**/.*</inputExclude>
-              <inputExclude>**/test/resources/**/*.txt</inputExclude>
-              <inputExclude>**/git.properties</inputExclude>
+              <inputExclude>**/test-output/**/*</inputExclude>
+              <!-- <inputExclude>**/git.properties</inputExclude> -->
               <inputExclude>**/doc/**</inputExclude>
+              <inputExclude>**/docs/**</inputExclude>
               <inputExclude>**/*.sk</inputExclude>
               <inputExclude>LICENSE</inputExclude>
               <inputExclude>NOTICE</inputExclude>
               <inputExclude>**/*.code-workspace</inputExclude>
+              <inputExclude>**/*.txt</inputExclude>
+              <inputExclude>**/*.html</inputExclude>
+              <inputExclude>**/api-links.bin</inputExclude>
             </inputExcludes>
           </configuration>
         </plugin>
@@ -403,12 +554,6 @@ under the License.
           </configuration>
         </plugin>
 
-        <plugin>
-          <groupId>io.github.git-commit-id</groupId>
-          <artifactId>git-commit-id-maven-plugin</artifactId>
-          <version>${git-commit-id-maven-plugin.version}</version>
-        </plugin>
-
         <plugin>
           <!-- Generates code coverage report banner for website. -->
           <groupId>org.jacoco</groupId>
@@ -431,6 +576,16 @@ under the License.
           </executions>
         </plugin>
 
+        <plugin>
+          <groupId>org.sonatype.plugins</groupId>
+          <artifactId>nexus-staging-maven-plugin</artifactId>
+          <version>${nexus-staging-maven-plugin.version}</version>
+          <configuration>
+            <serverId>apache.releases.https</serverId>
+            <nexusUrl>https://repository.apache.org/</nexusUrl>
+            <autoReleaseAfterClose>false</autoReleaseAfterClose> 
+          </configuration>
+        </plugin>
       </plugins>
     </pluginManagement>
 
@@ -438,19 +593,27 @@ under the License.
 
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
+        <artifactId>maven-assembly-plugin</artifactId>
       </plugin>
 
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-deploy-plugin</artifactId>
+        <artifactId>maven-clean-plugin</artifactId>
       </plugin>
 
+      <!-- compiler plugin not required here -->
+
+      <!-- deploy plugin not required here -->
+
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-enforcer-plugin</artifactId>
       </plugin>
 
+      <!-- gpg plugin only activated in nexus-jars profile -->
+
+      <!-- install plugin not required here -->
+
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-jar-plugin</artifactId>
@@ -466,34 +629,32 @@ under the License.
         <artifactId>maven-release-plugin</artifactId>
       </plugin>
 
+      <!-- resources plugin not required here -->
+
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-source-plugin</artifactId>
       </plugin>
 
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-      </plugin>
+      <!-- surefire plugin not required here -->
 
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-toolchains-plugin</artifactId>
       </plugin>
 
-      <plugin>
-        <groupId>org.apache.rat</groupId>
-        <artifactId>apache-rat-plugin</artifactId>
-      </plugin>
+      <!-- non-maven plugins -->
 
       <plugin>
         <groupId>com.github.hazendaz.maven</groupId>
         <artifactId>coveralls-maven-plugin</artifactId>
       </plugin>
 
+
+
       <plugin>
-        <groupId>io.github.git-commit-id</groupId>
-        <artifactId>git-commit-id-maven-plugin</artifactId>
+        <groupId>org.apache.rat</groupId>
+        <artifactId>apache-rat-plugin</artifactId>
       </plugin>
 
       <plugin>
@@ -501,6 +662,8 @@ under the License.
         <artifactId>jacoco-maven-plugin</artifactId>
       </plugin>
 
+      <!-- org.sonatype / nexus-staging only activated in nexus-jars profile -->
+
     </plugins>
   </build>
 
@@ -512,141 +675,23 @@ under the License.
           The pom version in the release branch must be properly set to something like: "1.1.0".
           The pom version in the master would be set to something like: "1.2.0-SNAPSHOT".
           Test Command: mvn clean verify -Pnexus-jars -DskipTests=true
-          Command: mvn clean deploy -Dnexus-jars
+          Command: mvn clean deploy -Pnexus-jars -DskipTests=true
           Verify Command (from terminal): gpg -v &#45;&#45;verify $ASC $FILE # dashdashverify
     -->
     <profile>
       <id>nexus-jars</id>
       <build>
-        <pluginManagement>
-          <plugins>
-            <plugin>
-              <groupId>io.github.git-commit-id</groupId>
-              <artifactId>git-commit-id-maven-plugin</artifactId>
-              <version>${git-commit-id-maven-plugin.version}</version>
-              <executions>
-                <execution>
-                  <id>get-the-git-infos</id>
-                  <goals>
-                    <goal>revision</goal>
-                  </goals>
-                  <phase>initialize</phase>
-                </execution>
-              </executions>
-              <configuration>
-                <dotGitDirectory>${project.basedir}/.git</dotGitDirectory>
-                <dateFormatTimeZone>UTC</dateFormatTimeZone>
-                <verbose>false</verbose>
-                <skipPoms>false</skipPoms>
-                <format>json</format>
-                <generateGitPropertiesFile>true</generateGitPropertiesFile>
-                <generateGitPropertiesFilename>${project.build.directory}/git.properties</generateGitPropertiesFilename>
-                <!-- Maven commands are sometimes run on the release artifact directly, which is not a Git repository -->
-                <failOnNoGitDirectory>false</failOnNoGitDirectory>
-                <failOnUnableToExtractRepoInfo>true</failOnUnableToExtractRepoInfo>
-                <commitIdGenerationMode>full</commitIdGenerationMode>
-                <includeOnlyProperties>
-                  <includeProperty>git.branch</includeProperty>
-                  <includeProperty>git.commit.id.full</includeProperty>
-                  <includeProperty>git.commit.time</includeProperty>
-                  <includeProperty>git.commit.user.email</includeProperty>
-                  <includeProperty>git.tags</includeProperty>
-                </includeOnlyProperties>
-                <gitDescribe>
-                  <skip>false</skip>
-                  <always>true</always>
-                  <abbrev>7</abbrev>
-                  <dirty>-dirty</dirty>
-                  <tags>true</tags>
-                  <forceLongFormat>true</forceLongFormat>
-                </gitDescribe>
-              </configuration>
-            </plugin>
-
-            <!-- Extends Apache Parent pom, pluginManagement-->
-            <plugin>
-              <groupId>org.apache.maven.plugins</groupId>
-              <artifactId>maven-jar-plugin</artifactId>
-              <version>${maven-jar-plugin.version}</version>
-              <executions>
-                <execution>
-                  <id>default-jar</id>
-                  <goals>
-                    <goal>jar</goal>
-                  </goals>
-                </execution>
-                <execution>
-                  <id>default-test-jar</id>
-                  <goals>
-                    <goal>test-jar</goal>
-                  </goals>
-                </execution>
-              </executions>
-              <configuration>
-                <archive>
-                  <manifest>
-                    <addDefaultEntries>false</addDefaultEntries>
-                    <addDefaultSpecificationEntries>false</addDefaultSpecificationEntries>
-                    <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
-                    <addBuildEnvironmentEntries>true</addBuildEnvironmentEntries>
-                  </manifest>
-                  <manifestEntries>
-                    <Automatic-Module-Name>org.apache.datasketches</Automatic-Module-Name>
-                    <Implementation-Vendor>The Apache Software Foundation</Implementation-Vendor>
-                    <GroupId-ArtifactId>${project.groupId}:${project.artifactId}</GroupId-ArtifactId>
-                    <!-- these properties are generated by the git-commit-id-maven-plugin during initialize -->
-                    <!--suppress UnresolvedMavenProperty -->
-                    <git-branch>${git.branch}</git-branch>
-                    <!--suppress UnresolvedMavenProperty -->
-                    <git-commit-id>${git.commit.id.full}</git-commit-id>
-                    <!--suppress UnresolvedMavenProperty -->
-                    <git-commit-time>${git.commit.time}</git-commit-time>
-                    <!--suppress UnresolvedMavenProperty -->
-                    <git-commit-user-email>${git.commit.user.email}</git-commit-user-email>
-                    <!--suppress UnresolvedMavenProperty -->
-                    <git-commit-tag>${git.tags}</git-commit-tag>
-                  </manifestEntries>
-                </archive>
-              </configuration>
-            </plugin>
-
-            <!-- We want to sign the artifacts, POM, and all attached artifacts -->
-            <plugin>
-              <groupId>org.apache.maven.plugins</groupId>
-              <artifactId>maven-gpg-plugin</artifactId>
-              <version>${maven-gpg-plugin.version}</version>
-              <executions>
-                <execution>
-                  <id>sign-artifacts</id>
-                  <phase>verify</phase>
-                  <goals>
-                    <goal>sign</goal>
-                  </goals>
-                </execution>
-              </executions>
-              <configuration>
-                <gpgArguments>
-                  <arg>--verbose</arg>
-                  <!-- prints the algorithm used -->
-                  <arg>--personal-digest-preferences=SHA512</arg>
-                </gpgArguments>
-              </configuration>
-            </plugin>
-          </plugins>
-        </pluginManagement>
-
         <plugins>
-          <plugin>
-            <groupId>io.github.git-commit-id</groupId>
-            <artifactId>git-commit-id-maven-plugin</artifactId>
-          </plugin>
+          <!-- Activates GPG signing during verify -->
           <plugin>
             <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-jar-plugin</artifactId>
+            <artifactId>maven-gpg-plugin</artifactId>
           </plugin>
+          <!-- Activates Nexus staging deployment -->
           <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-gpg-plugin</artifactId>
+            <groupId>org.sonatype.plugins</groupId>
+            <artifactId>nexus-staging-maven-plugin</artifactId>
+            <extensions>true</extensions>
           </plugin>
         </plugins>
       </build>
@@ -655,73 +700,64 @@ under the License.
     <profile>
       <id>generate-java-files</id>
       <build>
-        <pluginManagement>
-          <plugins>
-            <plugin>
-              <groupId>org.apache.maven.plugins</groupId>
-              <artifactId>maven-surefire-plugin</artifactId>
-              <configuration>
-                <groups>${testng.generate-java-files}</groups>
-                <excludedGroups>${testng.check-cpp-files},${testng.check-go-files},${testng.check-cpp-historical-files}</excludedGroups>
-              </configuration>
-            </plugin>
-          </plugins>
-        </pluginManagement>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <configuration>
+              <groups>${testng.generate-java-files}</groups>
+              <excludedGroups>${testng.check-cpp-files},${testng.check-go-files},${testng.check-cpp-historical-files}</excludedGroups>
+            </configuration>
+          </plugin>
+        </plugins>
       </build>
     </profile>
 
     <profile>
       <id>check-cpp-files</id>
       <build>
-        <pluginManagement>
-          <plugins>
-            <plugin>
-              <groupId>org.apache.maven.plugins</groupId>
-              <artifactId>maven-surefire-plugin</artifactId>
-              <configuration>
-                <groups>${testng.check-cpp-files}</groups>
-                <excludedGroups>${testng.generate-java-files},${testng.check-go-files},${testng.check-cpp-historical-files}</excludedGroups>
-              </configuration>
-            </plugin>
-          </plugins>
-        </pluginManagement>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <configuration>
+              <groups>${testng.check-cpp-files}</groups>
+              <excludedGroups>${testng.generate-java-files},${testng.check-go-files},${testng.check-cpp-historical-files}</excludedGroups>
+            </configuration>
+          </plugin>
+        </plugins>
       </build>
     </profile>
 
     <profile>
       <id>check-go-files</id>
       <build>
-        <pluginManagement>
-          <plugins>
-            <plugin>
-              <groupId>org.apache.maven.plugins</groupId>
-              <artifactId>maven-surefire-plugin</artifactId>
-              <configuration>
-                <groups>${testng.check-go-files}</groups>
-                <excludedGroups>${testng.generate-java-files},${testng.check-cpp-files},${testng.check-cpp-historical-files}
-                </excludedGroups>
-              </configuration>
-            </plugin>
-          </plugins>
-        </pluginManagement>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <configuration>
+              <groups>${testng.check-go-files}</groups>
+              <excludedGroups>${testng.generate-java-files},${testng.check-cpp-files},${testng.check-cpp-historical-files}</excludedGroups>
+            </configuration>
+          </plugin>
+        </plugins>
       </build>
     </profile>
 
     <profile>
       <id>check-cpp-historical-files</id>
       <build>
-        <pluginManagement>
-          <plugins>
-            <plugin>
-              <groupId>org.apache.maven.plugins</groupId>
-              <artifactId>maven-surefire-plugin</artifactId>
-              <configuration>
-                <groups>${testng.check-cpp-historical-files}</groups>
-                <excludedGroups>${testng.generate-java-files},${testng.check-go-files},${testng.check-cpp-files}</excludedGroups>
-              </configuration>
-            </plugin>
-          </plugins>
-        </pluginManagement>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <configuration>
+              <groups>${testng.check-cpp-historical-files}</groups>
+              <excludedGroups>${testng.generate-java-files},${testng.check-go-files},${testng.check-cpp-files}</excludedGroups>
+            </configuration>
+          </plugin>
+        </plugins>
       </build>
     </profile>
 
diff --git a/src/assembly/source-release.xml b/src/assembly/source-release.xml
new file mode 100644
index 000000000..1d8d7ecb6
--- /dev/null
+++ b/src/assembly/source-release.xml
@@ -0,0 +1,46 @@
+<!--
+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.
+-->
+<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.2.0"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.2.0 http://maven.apache.org/xsd/assembly-2.2.0.xsd">
+  <id>source-release</id>
+  <formats>
+    <format>zip</format>
+  </formats>
+  <fileSets>
+    <fileSet>
+      <directory>${project.basedir}</directory>
+      <outputDirectory>/</outputDirectory>
+      <useDefaultExcludes>true</useDefaultExcludes>
+      <excludes>
+        <!-- Git & Build folders -->
+        <exclude>**/.git/**</exclude>
+        <exclude>**/target/**</exclude>
+        
+        <!-- Private / Tooling folders requested to be blocked -->
+        <exclude>**/.vscode/**</exclude>
+        <exclude>**/.settings/**</exclude>
+        <exclude>**/.asf.yaml</exclude>
+        <exclude>**/.classpath</exclude>
+        <exclude>**/.project</exclude>
+        <exclude>**/serialization_test_data/**</exclude>
+      </excludes>
+    </fileSet>
+  </fileSets>
+</assembly>
diff --git a/src/main/java/org/apache/datasketches/PackageDocumentation.java b/src/main/java/org/apache/datasketches/PackageDocumentation.java
new file mode 100644
index 000000000..8b4d678e2
--- /dev/null
+++ b/src/main/java/org/apache/datasketches/PackageDocumentation.java
@@ -0,0 +1,25 @@
+/*
+ * 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.datasketches;
+
+/**
+ * Internal package marker to satisfy JDK Javadoc source requirements for empty packages in jar files.
+ */
+@SuppressWarnings("unused")
+interface PackageDocumentation {}
diff --git a/src/main/java/org/apache/datasketches/filters/PackageDocumentation.java b/src/main/java/org/apache/datasketches/filters/PackageDocumentation.java
new file mode 100644
index 000000000..04d6e2544
--- /dev/null
+++ b/src/main/java/org/apache/datasketches/filters/PackageDocumentation.java
@@ -0,0 +1,25 @@
+/*
+ * 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.datasketches.filters;
+
+/**
+ * Internal package marker to satisfy JDK Javadoc source requirements for empty packages in jar files.
+ */
+@SuppressWarnings("unused")
+interface PackageDocumentation {}
diff --git a/tools/mvn_clean_install_or_deploy.sh b/tools/mvn_clean_install_or_deploy.sh
new file mode 100755
index 000000000..9f4672391
--- /dev/null
+++ b/tools/mvn_clean_install_or_deploy.sh
@@ -0,0 +1,41 @@
+#!/usr/bin/env bash
+set -e
+
+# Default goal to 'install' if no argument provided
+# Otherwise specify 'deploy', in which case it also adds: -DskipTests" -Pnexus-jars
+GOAL="${1:-install}"
+shift 1 2>/dev/null || true
+
+# Set goal-specific defaults
+EXTRA_ARGS=()
+if [ "$GOAL" = "deploy" ]; then
+  EXTRA_ARGS=("-DskipTests" "-Pnexus-jars")
+fi
+
+# Safe Git metadata extraction with fallbacks for non-git builds
+if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
+  BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
+  [ "$BRANCH" = "HEAD" ] && BRANCH=$(git name-rev --name-only HEAD 2>/dev/null)
+
+  TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "unknown")
+  COMMIT=$(git rev-parse HEAD 2>/dev/null || echo "unknown")
+  TIME=$(git log -1 --format=%cI 2>/dev/null || echo "unknown")
+  EMAIL=$(git config user.email 2>/dev/null)
+  [ -z "$EMAIL" ] && EMAIL="unknown"
+else
+  BRANCH="source-release-no-git"
+  TAG="unknown"
+  COMMIT="unknown"
+  TIME="unknown"
+  EMAIL="unknown"
+fi
+
+# Execute Maven clean + target goal with injected system properties
+exec mvn clean "$GOAL" \
+  "${EXTRA_ARGS[@]}" \
+  -Dgit.branch="${BRANCH:-source-release-no-git}" \
+  -Dgit.closest.tag.name="${TAG:-unknown}" \
+  -Dgit.commit.id.full="${COMMIT:-unknown}" \
+  -Dgit.commit.time="${TIME:-unknown}" \
+  -Dgit.build.user.email="${EMAIL:-unknown}" \
+  "$@"


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datasketches.apache.org
For additional commands, e-mail: commits-help@datasketches.apache.org