You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by st...@apache.org on 2026/09/06 14:09:56 UTC

(hadoop) branch build/HADOOP-19976-reproducible created (now 03832dc324e)

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

steveloughran pushed a change to branch build/HADOOP-19976-reproducible
in repository https://gitbox.apache.org/repos/asf/hadoop.git


      at 03832dc324e HADOOP-19976. Reproducible builds: maven-assembly-plugin 2.4 -> 3.8.0.

This branch includes the following new commits:

     new 0286eb6149b phase 0 of migration
     new 98b04e4babc phase 1 of migration
     new b3f299b8c43 phase 1 of migration
     new 03832dc324e HADOOP-19976. Reproducible builds: maven-assembly-plugin 2.4 -> 3.8.0.

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



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


(hadoop) 02/04: phase 1 of migration

Posted by st...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

steveloughran pushed a commit to branch build/HADOOP-19976-reproducible
in repository https://gitbox.apache.org/repos/asf/hadoop.git

commit 98b04e4babc868af5fdd56ddc54a3b69c703883a
Author: Steve Loughran <st...@apache.org>
AuthorDate: Sun Sep 6 12:58:02 2026 +0100

    phase 1 of migration
    
    repeatability
---
 hadoop-common-project/hadoop-auth/pom.xml          |   4 -
 .../main/resources/common-version-info.properties  |   4 +-
 hadoop-common-project/hadoop-nfs/pom.xml           |   1 -
 hadoop-common-project/hadoop-registry/pom.xml      |  47 ---------
 hadoop-hdfs-project/hadoop-hdfs-httpfs/pom.xml     |   2 -
 .../src/main/resources/httpfs.properties           |   2 +-
 hadoop-maven-plugins/pom.xml                       |  15 +++
 .../maven/plugin/versioninfo/VersionInfoMojo.java  | 108 +++++++++++++++++----
 .../main/resources/yarn-version-info.properties    |   2 +-
 .../hadoop-yarn/hadoop-yarn-ui/pom.xml             |  30 ++++++
 pom.xml                                            |  46 +++++++++
 11 files changed, 185 insertions(+), 76 deletions(-)

diff --git a/hadoop-common-project/hadoop-auth/pom.xml b/hadoop-common-project/hadoop-auth/pom.xml
index c35becc03a7..0822c90ac73 100644
--- a/hadoop-common-project/hadoop-auth/pom.xml
+++ b/hadoop-common-project/hadoop-auth/pom.xml
@@ -30,10 +30,6 @@
   <name>Apache Hadoop Auth</name>
   <description>Apache Hadoop Auth - Java HTTP SPNEGO</description>
 
-  <properties>
-    <maven.build.timestamp.format>yyyyMMdd</maven.build.timestamp.format>
-  </properties>
-
   <dependencies>
     <dependency>
       <!-- Used, even though 'mvn dependency:analyze' doesn't find it -->
diff --git a/hadoop-common-project/hadoop-common/src/main/resources/common-version-info.properties b/hadoop-common-project/hadoop-common/src/main/resources/common-version-info.properties
index 0f075c8139a..4aa024e45b6 100644
--- a/hadoop-common-project/hadoop-common/src/main/resources/common-version-info.properties
+++ b/hadoop-common-project/hadoop-common/src/main/resources/common-version-info.properties
@@ -19,9 +19,9 @@
 version=${declared.hadoop.version}
 revision=${version-info.scm.commit}
 branch=${version-info.scm.branch}
-user=${user.name}
+user=${hadoop.build.user}
 date=${version-info.build.time}
 url=${version-info.scm.uri}
 srcChecksum=${version-info.source.md5}
 protocVersion=${hadoop.protobuf.version}
-compilePlatform=${os.detected.classifier}
+compilePlatform=${hadoop.build.platform}
diff --git a/hadoop-common-project/hadoop-nfs/pom.xml b/hadoop-common-project/hadoop-nfs/pom.xml
index 685397e131d..7846a3ea1ea 100644
--- a/hadoop-common-project/hadoop-nfs/pom.xml
+++ b/hadoop-common-project/hadoop-nfs/pom.xml
@@ -31,7 +31,6 @@
   <description>Apache Hadoop NFS library</description>
 
   <properties>
-    <maven.build.timestamp.format>yyyyMMdd</maven.build.timestamp.format>
     <kerberos.realm>LOCALHOST</kerberos.realm>
   </properties>
 
diff --git a/hadoop-common-project/hadoop-registry/pom.xml b/hadoop-common-project/hadoop-registry/pom.xml
index 6a5540a17c7..3e91d4b8181 100644
--- a/hadoop-common-project/hadoop-registry/pom.xml
+++ b/hadoop-common-project/hadoop-registry/pom.xml
@@ -164,29 +164,6 @@
   </dependencies>
 
   <build>
-    <!--
-    Include all files in src/main/resources.  By default, do not apply property
-    substitution (filtering=false), but do apply property substitution to
-    yarn-version-info.properties (filtering=true).  This will substitute the
-    version information correctly, but prevent Maven from altering other files
-    like yarn-default.xml.
-    -->
-    <resources>
-      <resource>
-        <directory>${basedir}/src/main/resources</directory>
-        <excludes>
-          <exclude>yarn-version-info.properties</exclude>
-        </excludes>
-        <filtering>false</filtering>
-      </resource>
-      <resource>
-        <directory>${basedir}/src/main/resources</directory>
-        <includes>
-          <include>yarn-version-info.properties</include>
-        </includes>
-        <filtering>true</filtering>
-      </resource>
-    </resources>
     <plugins>
       <plugin>
         <groupId>com.github.spotbugs</groupId>
@@ -211,30 +188,6 @@
           </excludes>
         </configuration>
       </plugin>
-      <plugin>
-        <groupId>org.apache.hadoop</groupId>
-        <artifactId>hadoop-maven-plugins</artifactId>
-        <executions>
-          <execution>
-            <id>version-info</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>version-info</goal>
-            </goals>
-            <configuration>
-              <source>
-                <directory>${basedir}/src/main</directory>
-                <includes>
-                  <include>java/**/*.java</include>
-                  <!--
-                  <include>proto/**/*.proto</include>
-                    -->
-                </includes>
-              </source>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
       <plugin>
         <artifactId>maven-jar-plugin</artifactId>
         <executions>
diff --git a/hadoop-hdfs-project/hadoop-hdfs-httpfs/pom.xml b/hadoop-hdfs-project/hadoop-hdfs-httpfs/pom.xml
index f0c0e21ac12..96cf41c80ec 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-httpfs/pom.xml
+++ b/hadoop-hdfs-project/hadoop-hdfs-httpfs/pom.xml
@@ -35,8 +35,6 @@
   <properties>
     <httpfs.source.repository>REPO NOT AVAIL</httpfs.source.repository>
     <httpfs.source.revision>REVISION NOT AVAIL</httpfs.source.revision>
-    <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm:ssZ</maven.build.timestamp.format>
-    <httpfs.build.timestamp>${maven.build.timestamp}</httpfs.build.timestamp>
     <kerberos.realm>LOCALHOST</kerberos.realm>
     <test.exclude.kerberos.test>**/TestHttpFSWithKerberos.java</test.exclude.kerberos.test>
   </properties>
diff --git a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/resources/httpfs.properties b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/resources/httpfs.properties
index 164896e1f05..9731de74898 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/resources/httpfs.properties
+++ b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/resources/httpfs.properties
@@ -17,5 +17,5 @@ httpfs.version=${project.version}
 httpfs.source.repository=${httpfs.source.repository}
 httpfs.source.revision=${httpfs.source.revision}
 
-httpfs.build.username=${user.name}
+httpfs.build.username=${hadoop.build.user}
 httpfs.build.timestamp=${httpfs.build.timestamp}
diff --git a/hadoop-maven-plugins/pom.xml b/hadoop-maven-plugins/pom.xml
index e45dfa08330..d17a3e042d2 100644
--- a/hadoop-maven-plugins/pom.xml
+++ b/hadoop-maven-plugins/pom.xml
@@ -102,6 +102,21 @@
       <groupId>org.apache.hadoop.thirdparty</groupId>
       <artifactId>hadoop-shaded-guava</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter-api</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter-engine</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.junit.platform</groupId>
+      <artifactId>junit-platform-launcher</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
   <build>
     <plugins>
diff --git a/hadoop-maven-plugins/src/main/java/org/apache/hadoop/maven/plugin/versioninfo/VersionInfoMojo.java b/hadoop-maven-plugins/src/main/java/org/apache/hadoop/maven/plugin/versioninfo/VersionInfoMojo.java
index ca970c63d01..5bd682a111b 100644
--- a/hadoop-maven-plugins/src/main/java/org/apache/hadoop/maven/plugin/versioninfo/VersionInfoMojo.java
+++ b/hadoop-maven-plugins/src/main/java/org/apache/hadoop/maven/plugin/versioninfo/VersionInfoMojo.java
@@ -29,25 +29,39 @@
 import java.io.RandomAccessFile;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.Date;
 import java.util.List;
-import java.util.TimeZone;
 
 /**
  * VersionInfoMojo calculates information about the current version of the
  * codebase and exports the information as properties for further use in a Maven
  * build.  The version information includes build time, SCM URI, SCM branch, SCM
  * commit, and an MD5 checksum of the contents of the files in the codebase.
+ * <p>
+ * The build time and the SCM fields can each be pinned to a fixed value so that
+ * two builds of the same source produce the same output; see
+ * {@code version-info.build.time.value} and {@code version-info.scm.static}.
  */
 @Mojo(name="version-info")
 public class VersionInfoMojo extends AbstractMojo {
 
+  static final String UNKNOWN = "Unknown";
+
+  /**
+   * Rendered into {@code common-version-info.properties} and read back by
+   * {@code VersionInfo}; the minute precision is long-standing and retained.
+   */
+  private static final DateTimeFormatter BUILD_TIME_FORMAT =
+      DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm'Z'")
+          .withZone(ZoneOffset.UTC);
+
   @Parameter(defaultValue="${project}", readonly=true)
   private MavenProject project;
 
@@ -72,16 +86,48 @@ public class VersionInfoMojo extends AbstractMojo {
   @Parameter(defaultValue="git")
   private String gitCommand;
 
+  /**
+   * Build time to record, as an ISO-8601 instant or as seconds since the epoch.
+   * Defaults to the Maven-wide reproducible-build timestamp; a value of one
+   * character or less means unset, following the maven-archiver convention, and
+   * the current time is used instead.
+   */
+  @Parameter(property="version-info.build.time.value",
+      defaultValue="${project.build.outputTimestamp}")
+  private String buildTimeValue;
+
+  /**
+   * When true, report the SCM values below instead of running git.
+   */
+  @Parameter(property="version-info.scm.static", defaultValue="false")
+  private boolean staticScmInfo;
+
+  @Parameter(property="version-info.scm.uri.value", defaultValue=VersionInfoMojo.UNKNOWN)
+  private String scmUriValue;
+
+  @Parameter(property="version-info.scm.branch.value", defaultValue=VersionInfoMojo.UNKNOWN)
+  private String scmBranchValue;
+
+  @Parameter(property="version-info.scm.commit.value", defaultValue=VersionInfoMojo.UNKNOWN)
+  private String scmCommitValue;
+
   private enum SCM {NONE, GIT}
 
   @Override
   public void execute() throws MojoExecutionException {
     try {
-      SCM scm = determineSCM();
       project.getProperties().setProperty(buildTimeProperty, getBuildTime());
-      project.getProperties().setProperty(scmUriProperty, getSCMUri(scm));
-      project.getProperties().setProperty(scmBranchProperty, getSCMBranch(scm));
-      project.getProperties().setProperty(scmCommitProperty, getSCMCommit(scm));
+      if (staticScmInfo) {
+        getLog().info("SCM: static");
+        project.getProperties().setProperty(scmUriProperty, scmUriValue);
+        project.getProperties().setProperty(scmBranchProperty, scmBranchValue);
+        project.getProperties().setProperty(scmCommitProperty, scmCommitValue);
+      } else {
+        SCM scm = determineSCM();
+        project.getProperties().setProperty(scmUriProperty, getSCMUri(scm));
+        project.getProperties().setProperty(scmBranchProperty, getSCMBranch(scm));
+        project.getProperties().setProperty(scmCommitProperty, getSCMCommit(scm));
+      }
       project.getProperties().setProperty(md5Property, computeMD5());
     } catch (Throwable ex) {
       throw new MojoExecutionException(ex.toString(), ex);
@@ -89,14 +135,40 @@ public void execute() throws MojoExecutionException {
   }
 
   /**
-   * Returns a string representing current build time.
-   * 
-   * @return String representing current build time
+   * Returns the build time to record, formatted in UTC.
+   *
+   * @return String representing the build time
+   * @throws MojoExecutionException if the configured value cannot be parsed
+   */
+  private String getBuildTime() throws MojoExecutionException {
+    Instant instant = parseBuildTime(buildTimeValue);
+    return BUILD_TIME_FORMAT.format(instant != null ? instant : Instant.now());
+  }
+
+  /**
+   * Parses a build timestamp given either as seconds since the epoch or as an
+   * ISO-8601 instant.
+   *
+   * @param value configured value; null, empty or a single character all mean
+   *              "not set"
+   * @return the instant, or null if the value was not set
+   * @throws MojoExecutionException if the value is set but unparseable
    */
-  private String getBuildTime() {
-    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
-    dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
-    return dateFormat.format(new Date());
+  static Instant parseBuildTime(String value) throws MojoExecutionException {
+    if (value == null || value.length() <= 1) {
+      return null;
+    }
+    try {
+      return Instant.ofEpochSecond(Long.parseLong(value));
+    } catch (NumberFormatException ignored) {
+      // not epoch seconds, fall through to ISO-8601
+    }
+    try {
+      return DateTimeFormatter.ISO_DATE_TIME.parse(value, Instant::from);
+    } catch (DateTimeParseException e) {
+      throw new MojoExecutionException("Cannot parse build time '" + value
+          + "'; expected epoch seconds or an ISO-8601 instant", e);
+    }
   }
   private List<String> scmOut;
 
@@ -143,7 +215,7 @@ private SCM determineSCM() throws Exception {
    * @return String URI of SCM
    */
   private String getSCMUri(SCM scm) {
-    String uri = "Unknown";
+    String uri = UNKNOWN;
     switch (scm) {
       case GIT:
         for (String s : scmOut) {
@@ -165,7 +237,7 @@ private String getSCMUri(SCM scm) {
    * @return String commit of SCM
    */
   private String getSCMCommit(SCM scm) {
-    String commit = "Unknown";
+    String commit = UNKNOWN;
     switch (scm) {
       case GIT:
         for (String s : scmOut) {
@@ -186,7 +258,7 @@ private String getSCMCommit(SCM scm) {
    * @return String branch of SCM
    */
   private String getSCMBranch(SCM scm) {
-    String branch = "Unknown";
+    String branch = UNKNOWN;
     switch (scm) {
       case GIT:
         for (String s : scmOut) {
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-version-info.properties b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-version-info.properties
index ee6f13d77df..7178a964d33 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-version-info.properties
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-version-info.properties
@@ -19,7 +19,7 @@
 version=${declared.hadoop.version}
 revision=${version-info.scm.commit}
 branch=${version-info.scm.branch}
-user=${user.name}
+user=${hadoop.build.user}
 date=${version-info.build.time}
 url=${version-info.scm.uri}
 srcChecksum=${version-info.source.md5}
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/pom.xml b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/pom.xml
index c5e771b12e4..8965a809b1d 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/pom.xml
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/pom.xml
@@ -153,6 +153,16 @@
                       </excludes>
                     </resource>
                   </resources>
+                  <nonFilteredFileExtensions>
+                    <!-- beyond the plugin's own jpg/jpeg/gif/bmp/png defaults -->
+                    <nonFilteredFileExtension>ico</nonFilteredFileExtension>
+                    <nonFilteredFileExtension>psd</nonFilteredFileExtension>
+                    <nonFilteredFileExtension>svgz</nonFilteredFileExtension>
+                    <nonFilteredFileExtension>woff</nonFilteredFileExtension>
+                    <nonFilteredFileExtension>woff2</nonFilteredFileExtension>
+                    <nonFilteredFileExtension>ttf</nonFilteredFileExtension>
+                    <nonFilteredFileExtension>eot</nonFilteredFileExtension>
+                  </nonFilteredFileExtensions>
                 </configuration>
               </execution>
               <execution>
@@ -173,6 +183,16 @@
                       </includes>
                     </resource>
                   </resources>
+                  <nonFilteredFileExtensions>
+                    <!-- beyond the plugin's own jpg/jpeg/gif/bmp/png defaults -->
+                    <nonFilteredFileExtension>ico</nonFilteredFileExtension>
+                    <nonFilteredFileExtension>psd</nonFilteredFileExtension>
+                    <nonFilteredFileExtension>svgz</nonFilteredFileExtension>
+                    <nonFilteredFileExtension>woff</nonFilteredFileExtension>
+                    <nonFilteredFileExtension>woff2</nonFilteredFileExtension>
+                    <nonFilteredFileExtension>ttf</nonFilteredFileExtension>
+                    <nonFilteredFileExtension>eot</nonFilteredFileExtension>
+                  </nonFilteredFileExtensions>
                 </configuration>
               </execution>
               <execution>
@@ -193,6 +213,16 @@
                       </includes>
                     </resource>
                   </resources>
+                  <nonFilteredFileExtensions>
+                    <!-- beyond the plugin's own jpg/jpeg/gif/bmp/png defaults -->
+                    <nonFilteredFileExtension>ico</nonFilteredFileExtension>
+                    <nonFilteredFileExtension>psd</nonFilteredFileExtension>
+                    <nonFilteredFileExtension>svgz</nonFilteredFileExtension>
+                    <nonFilteredFileExtension>woff</nonFilteredFileExtension>
+                    <nonFilteredFileExtension>woff2</nonFilteredFileExtension>
+                    <nonFilteredFileExtension>ttf</nonFilteredFileExtension>
+                    <nonFilteredFileExtension>eot</nonFilteredFileExtension>
+                  </nonFilteredFileExtensions>
                 </configuration>
               </execution>
             </executions>
diff --git a/pom.xml b/pom.xml
index ded594dee59..147935fe0a7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -174,6 +174,19 @@ child.project.url.inherit.append.path="false">
          release manager bumps this when cutting a release branch. -->
     <hadoop.build.timestamp>2026-01-01T00:00:00Z</hadoop.build.timestamp>
 
+    <!-- Recorded in the version resources. Declared here rather than in the
+         module that consumes each one, so that the repeatable profile can
+         replace them: a module's own properties outrank inherited values.
+         Interpolated in the consuming module, where the os-maven-plugin
+         extension is in scope. -->
+    <hadoop.build.user>${user.name}</hadoop.build.user>
+    <hadoop.build.platform>${os.detected.classifier}</hadoop.build.platform>
+    <!-- The format belongs with the one property that consumes it. It is
+         project-wide, but httpfs is the only reference to the Maven build
+         timestamp anywhere in the tree. -->
+    <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm:ssZ</maven.build.timestamp.format>
+    <httpfs.build.timestamp>${maven.build.timestamp}</httpfs.build.timestamp>
+
     <!-- Off by default; -Prepeatable sets it to ${hadoop.build.timestamp}.
          A single character disables it, per the maven-archiver convention.
          Overrides the value inherited from the apache parent. -->
@@ -952,5 +965,38 @@ child.project.url.inherit.append.path="false">
         <docker.image>${user.name}/hadoop:${project.version}</docker.image>
       </properties>
     </profile>
+
+    <!-- Replaces every value derived from the building host, user, clock or git
+         checkout with a fixed one, so that two builds of the same source with
+         the same JDK produce the same bytes. See BUILDING.txt. -->
+    <profile>
+      <id>repeatable</id>
+      <properties>
+        <!-- Picked up by maven-archiver, maven-assembly-plugin and cyclonedx to
+             normalise archive entry times and drop generation timestamps. -->
+        <project.build.outputTimestamp>${hadoop.build.timestamp}</project.build.outputTimestamp>
+
+        <!-- Recorded in the version resources in place of the git checkout, the
+             OS user and the wall clock. TestYarnVersionInfo requires a user
+             other than Unknown. -->
+        <version-info.scm.static>true</version-info.scm.static>
+        <hadoop.build.user>hadoop</hadoop.build.user>
+        <hadoop.build.platform>Unknown</hadoop.build.platform>
+        <httpfs.build.timestamp>${hadoop.build.timestamp}</httpfs.build.timestamp>
+      </properties>
+      <build>
+        <pluginManagement>
+          <plugins>
+            <plugin>
+              <groupId>org.apache.maven.plugins</groupId>
+              <artifactId>maven-javadoc-plugin</artifactId>
+              <configuration>
+                <notimestamp>true</notimestamp>
+              </configuration>
+            </plugin>
+          </plugins>
+        </pluginManagement>
+      </build>
+    </profile>
   </profiles>
 </project>


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


(hadoop) 04/04: HADOOP-19976. Reproducible builds: maven-assembly-plugin 2.4 -> 3.8.0.

Posted by st...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

steveloughran pushed a commit to branch build/HADOOP-19976-reproducible
in repository https://gitbox.apache.org/repos/asf/hadoop.git

commit 03832dc324ec8f707243bbf560ccded2465639e7
Author: Steve Loughran <st...@apache.org>
AuthorDate: Sun Sep 6 14:13:10 2026 +0100

    HADOOP-19976. Reproducible builds: maven-assembly-plugin 2.4 -> 3.8.0.
    
    Inherit maven-assembly-plugin 3.8.0 from the ASF parent instead of
    pinning 2.4, which predates reproducible-build support. Under
    -Prepeatable the plugin now normalises tar entry timestamps, ownership
    and ordering, making hadoop-<version>-src.tar.gz byte-identical across
    builds.
    
    * Delete the 2.4 pin and its version-only pluginManagement entry.
    * timelineservice-hbase-server-2: wrap <descriptor> in <descriptors>.
      The singular form was removed in assembly 3.x and fails the build
      with "No assembly descriptors found".
    * hadoop-src.xml: exclude dependency-reduced-pom.xml, .idea, .claude
      and *.versionsBackup, and add the recursive form of the .settings
      exclude, which pruned only the directory entry and not its contents.
      Removes 479 untracked files from the source tarball.
    * .gitignore: ignore /.claude/.
    
    Binary tarball gains bcprov-jdk18on (test scope, hadoop-hdfs) and
    hadoop-annotations (provided scope, tools-dist and dynamometer-dist):
    assembly >= 3.7 admits non-runtime artifacts into a runtime
    dependencySet. Both are already in LICENSE-binary and duplicate jars
    that ship elsewhere at the same version, so this is redundancy rather
    than a version conflict.
    
    AI-Authored claude.ai
---
 .gitignore                                                     |  1 +
 hadoop-assemblies/src/main/resources/assemblies/hadoop-src.xml |  8 ++++++++
 .../hadoop-yarn-server-timelineservice-hbase-server-2/pom.xml  |  4 +++-
 pom.xml                                                        | 10 ++--------
 4 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/.gitignore b/.gitignore
index 8e20dcd0ccd..bc01c391edf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -62,3 +62,4 @@ output.xml
 report.html
 
 .mvn/wrapper/maven-wrapper.jar
+/.claude/
diff --git a/hadoop-assemblies/src/main/resources/assemblies/hadoop-src.xml b/hadoop-assemblies/src/main/resources/assemblies/hadoop-src.xml
index 7895f4e5714..a1bc67c149d 100644
--- a/hadoop-assemblies/src/main/resources/assemblies/hadoop-src.xml
+++ b/hadoop-assemblies/src/main/resources/assemblies/hadoop-src.xml
@@ -43,6 +43,8 @@
       <excludes>
         <exclude>.git/**</exclude>
         <exclude>**/.gitignore</exclude>
+        <!-- written by the shade plugin into the module dir, not target/ -->
+        <exclude>**/dependency-reduced-pom.xml</exclude>
         <exclude>**/.svn</exclude>
         <exclude>**/*.iws</exclude>
         <exclude>**/*.ipr</exclude>
@@ -50,6 +52,12 @@
         <exclude>**/.classpath</exclude>
         <exclude>**/.project</exclude>
         <exclude>**/.settings</exclude>
+        <!-- the bare directory name above prunes only the entry, not its
+             contents, so each of these needs the recursive form -->
+        <exclude>**/.settings/**</exclude>
+        <exclude>**/.idea/**</exclude>
+        <exclude>**/.claude/**</exclude>
+        <exclude>**/*.versionsBackup</exclude>
         <exclude>**/target/**</exclude>
         <!-- until the code that does this is fixed -->
         <exclude>**/*.log</exclude>
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-timelineservice-hbase/hadoop-yarn-server-timelineservice-hbase-server/hadoop-yarn-server-timelineservice-hbase-server-2/pom.xml b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-timelineservice-hbase/hadoop-yarn-server-timelineservice-hbase-server/hadoop-yarn-server-timelineservice-hbase-server-2/pom.xml
index 03de52c14c5..2ddc0b3c007 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-timelineservice-hbase/hadoop-yarn-server-timelineservice-hbase-server/hadoop-yarn-server-timelineservice-hbase-server-2/pom.xml
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-timelineservice-hbase/hadoop-yarn-server-timelineservice-hbase-server/hadoop-yarn-server-timelineservice-hbase-server-2/pom.xml
@@ -201,7 +201,9 @@
                   <goal>single</goal>
                 </goals>
                 <configuration>
-                  <descriptor>src/assembly/coprocessor.xml</descriptor>
+                  <descriptors>
+                    <descriptor>src/assembly/coprocessor.xml</descriptor>
+                  </descriptors>
                   <attach>true</attach>
                 </configuration>
               </execution>
diff --git a/pom.xml b/pom.xml
index 147935fe0a7..8b373138d47 100644
--- a/pom.xml
+++ b/pom.xml
@@ -117,7 +117,6 @@ child.project.url.inherit.append.path="false">
     <maven-site-plugin.version>3.9.1</maven-site-plugin.version>
     <maven-stylus-skin.version>1.5</maven-stylus-skin.version>
     <maven-antrun-plugin.version>1.7</maven-antrun-plugin.version>
-    <maven-assembly-plugin.version>2.4</maven-assembly-plugin.version>
     <maven-dependency-plugin.version>3.8.1</maven-dependency-plugin.version>
     <maven-enforcer-plugin.version>3.5.0</maven-enforcer-plugin.version>
     <restrict-imports.enforcer.version>2.0.0</restrict-imports.enforcer.version>
@@ -166,8 +165,8 @@ child.project.url.inherit.append.path="false">
          java version its own enforcer execution requires -->
     <javaVersion>${javac.version}</javaVersion>
     <minimalMavenBuildVersion>${enforced.maven.version}</minimalMavenBuildVersion>
-    <!-- The parent's default of posix is rejected by maven-assembly-plugin 2.4;
-         gnu is valid in both and is what the dist descriptors already set. -->
+    <!-- What the dist descriptors already set; keeps tar headers unchanged
+         from the 2.4 output rather than switching to the parent's posix. -->
     <assembly.tarLongFileMode>gnu</assembly.tarLongFileMode>
 
     <!-- Fixed instant recorded in artifacts built with -Prepeatable; the
@@ -392,11 +391,6 @@ child.project.url.inherit.append.path="false">
             </execution>
           </executions>
         </plugin>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-assembly-plugin</artifactId>
-          <version>${maven-assembly-plugin.version}</version>
-        </plugin>
         <plugin>
           <groupId>org.apache.rat</groupId>
           <artifactId>apache-rat-plugin</artifactId>


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


(hadoop) 03/04: phase 1 of migration

Posted by st...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

steveloughran pushed a commit to branch build/HADOOP-19976-reproducible
in repository https://gitbox.apache.org/repos/asf/hadoop.git

commit b3f299b8c43e341f70619fd71c7af77fc267db14
Author: Steve Loughran <st...@apache.org>
AuthorDate: Sun Sep 6 13:00:44 2026 +0100

    phase 1 of migration
    
    repeatability
    + claude generated TestVersionInfoMojo test which uses junit5 asserts, not assertj.
    + stevel moved to assertj
    
    written by claude.ai
---
 hadoop-maven-plugins/pom.xml                       |  5 ++
 .../plugin/versioninfo/TestVersionInfoMojo.java    | 79 ++++++++++++++++++++++
 2 files changed, 84 insertions(+)

diff --git a/hadoop-maven-plugins/pom.xml b/hadoop-maven-plugins/pom.xml
index d17a3e042d2..dc76cad8bd1 100644
--- a/hadoop-maven-plugins/pom.xml
+++ b/hadoop-maven-plugins/pom.xml
@@ -117,6 +117,11 @@
       <artifactId>junit-platform-launcher</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.assertj</groupId>
+      <artifactId>assertj-core</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
   <build>
     <plugins>
diff --git a/hadoop-maven-plugins/src/test/java/org/apache/hadoop/maven/plugin/versioninfo/TestVersionInfoMojo.java b/hadoop-maven-plugins/src/test/java/org/apache/hadoop/maven/plugin/versioninfo/TestVersionInfoMojo.java
new file mode 100644
index 00000000000..f7785c47097
--- /dev/null
+++ b/hadoop-maven-plugins/src/test/java/org/apache/hadoop/maven/plugin/versioninfo/TestVersionInfoMojo.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed 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.hadoop.maven.plugin.versioninfo;
+
+import java.time.Instant;
+
+import org.apache.maven.plugin.MojoExecutionException;
+
+import org.assertj.core.api.AbstractInstantAssert;
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import static org.apache.hadoop.maven.plugin.versioninfo.VersionInfoMojo.parseBuildTime;
+
+/**
+ * Unit tests for build timestamp parsing in {@link VersionInfoMojo}.
+ */
+class TestVersionInfoMojo {
+
+  private static final Instant EXPECTED =
+      Instant.parse("2026-01-01T00:00:00Z");
+
+  @Test
+  void testUnsetValues() throws Exception {
+    assertParsedBuildTime(null).isNull();
+    assertParsedBuildTime("").isNull();
+    assertParsedBuildTime("-").isNull();
+  }
+
+  private static AbstractInstantAssert<?> assertParsedBuildTime(final String v)
+      throws MojoExecutionException {
+    return Assertions.assertThat(parseBuildTime(v)).describedAs("parsed build time '%s'", v);
+  }
+
+  @Test
+  void testExpectedSeconds() throws Exception {
+    assertParsedBuildTime("1767225600").isEqualTo(EXPECTED);
+  }
+
+  @Test
+  void testEpochSeconds() throws Exception {
+    assertParsedBuildTime("0000000000").isEqualTo(Instant.EPOCH);
+  }
+
+  @Test
+  void testIso8601UTC() throws Exception {
+    assertParsedBuildTime("2026-01-01T00:00:00Z").isEqualTo(EXPECTED);
+  }
+
+  @Test
+  void testIso8601() throws Exception {
+    assertParsedBuildTime("2026-01-01T01:00:00+01:00").isEqualTo(EXPECTED);
+  }
+
+  @Test
+  void testUnparseableValueIsReported() {
+    Assertions.assertThatThrownBy(() -> parseBuildTime("last thursday"))
+        .isInstanceOf(MojoExecutionException.class)
+        .hasMessageContaining("last thursday");
+  }
+
+  @Test
+  void testMissingZoneIsRejected() {
+    // no offset means no instant; better to fail than to guess a zone
+    Assertions.assertThatThrownBy(() -> parseBuildTime("2026-01-01T00:00:00"))
+        .isInstanceOf(MojoExecutionException.class);
+  }
+}


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


(hadoop) 01/04: phase 0 of migration

Posted by st...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

steveloughran pushed a commit to branch build/HADOOP-19976-reproducible
in repository https://gitbox.apache.org/repos/asf/hadoop.git

commit 0286eb6149bb96cd8da5cba0cbb1c4c9cba2f330
Author: Steve Loughran <st...@apache.org>
AuthorDate: Sun Sep 6 10:19:47 2026 +0100

    phase 0 of migration
    
    * asf parent pom
    * updated cyclone dx
    * build timestamp support.
---
 hadoop-build-tools/pom.xml                         |  1 -
 hadoop-common-project/hadoop-annotations/pom.xml   | 15 ++++++
 hadoop-common-project/hadoop-auth/pom.xml          |  2 +-
 hadoop-project-dist/pom.xml                        |  2 +-
 hadoop-project/pom.xml                             | 26 ----------
 hadoop-tools/hadoop-distcp/pom.xml                 |  2 +-
 hadoop-tools/hadoop-federation-balance/pom.xml     |  2 +-
 .../pom.xml                                        |  1 +
 pom.xml                                            | 60 ++++++++++++++++++----
 9 files changed, 71 insertions(+), 40 deletions(-)

diff --git a/hadoop-build-tools/pom.xml b/hadoop-build-tools/pom.xml
index d322dfc6d40..0335ceb5a4b 100644
--- a/hadoop-build-tools/pom.xml
+++ b/hadoop-build-tools/pom.xml
@@ -51,7 +51,6 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-resources-plugin</artifactId>
-        <version>${maven-resources-plugin.version}</version>
         <executions>
           <execution>
             <id>copy-resources</id>
diff --git a/hadoop-common-project/hadoop-annotations/pom.xml b/hadoop-common-project/hadoop-annotations/pom.xml
index 893bf0310e8..c7e38951e7d 100644
--- a/hadoop-common-project/hadoop-annotations/pom.xml
+++ b/hadoop-common-project/hadoop-annotations/pom.xml
@@ -29,6 +29,11 @@
   <name>Apache Hadoop Annotations</name>
   <packaging>jar</packaging>
 
+  <properties>
+    <!-- this module reads JDK internal API, which the compiler release flag forbids -->
+    <maven.compiler.release></maven.compiler.release>
+  </properties>
+
   <dependencies>
     <dependency>
       <groupId>io.github.zhtttylz</groupId>
@@ -55,6 +60,16 @@
           </compilerArgs>
         </configuration>
       </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-javadoc-plugin</artifactId>
+        <configuration>
+          <!-- build-time doclets; HadoopDocEnvImpl uses jdk.javadoc internals
+               which are not visible to javadoc under the release flag -->
+          <release>${javac.version}</release>
+          <excludePackageNames>org.apache.hadoop.classification.tools</excludePackageNames>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
 </project>
diff --git a/hadoop-common-project/hadoop-auth/pom.xml b/hadoop-common-project/hadoop-auth/pom.xml
index 4b8854887c1..c35becc03a7 100644
--- a/hadoop-common-project/hadoop-auth/pom.xml
+++ b/hadoop-common-project/hadoop-auth/pom.xml
@@ -248,7 +248,7 @@
         <artifactId>maven-jar-plugin</artifactId>
         <executions>
           <execution>
-            <id>prepare-jar</id>
+            <id>default-jar</id>
             <phase>prepare-package</phase>
             <goals>
               <goal>jar</goal>
diff --git a/hadoop-project-dist/pom.xml b/hadoop-project-dist/pom.xml
index 5a3851a4ff9..592d173974a 100644
--- a/hadoop-project-dist/pom.xml
+++ b/hadoop-project-dist/pom.xml
@@ -62,7 +62,7 @@
         <artifactId>maven-jar-plugin</artifactId>
         <executions>
           <execution>
-            <id>prepare-jar</id>
+            <id>default-jar</id>
             <phase>prepare-package</phase>
             <goals>
               <goal>jar</goal>
diff --git a/hadoop-project/pom.xml b/hadoop-project/pom.xml
index 79f9b8093da..660c006e1d4 100644
--- a/hadoop-project/pom.xml
+++ b/hadoop-project/pom.xml
@@ -195,12 +195,8 @@
     <trimStackTrace>false</trimStackTrace>
 
     <maven-clean-plugin.version>3.1.0</maven-clean-plugin.version>
-    <maven-install-plugin.version>2.5.1</maven-install-plugin.version>
-    <maven-resources-plugin.version>2.6</maven-resources-plugin.version>
     <maven-shade-plugin.version>3.6.0</maven-shade-plugin.version>
-    <maven-jar-plugin.version>2.5</maven-jar-plugin.version>
     <maven-war-plugin.version>3.4.0</maven-war-plugin.version>
-    <maven-source-plugin.version>2.3</maven-source-plugin.version>
     <maven-pdf-plugin.version>1.2</maven-pdf-plugin.version>
     <maven-remote-resources-plugin.version>1.5</maven-remote-resources-plugin.version>
     <build-helper-maven-plugin.version>1.9</build-helper-maven-plugin.version>
@@ -2315,16 +2311,6 @@
             <argLine>${maven-surefire-plugin.argLine} @{argLine}</argLine>
           </configuration>
         </plugin>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-install-plugin</artifactId>
-          <version>${maven-install-plugin.version}</version>
-        </plugin>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-jar-plugin</artifactId>
-          <version>${maven-jar-plugin.version}</version>
-        </plugin>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-javadoc-plugin</artifactId>
@@ -2337,8 +2323,6 @@
             </additionalJOptions>
             <additionalOptions>
               <!-- To fix doclet compile error -->
-              <additionalOption>--add-exports</additionalOption>
-              <additionalOption>jdk.javadoc/jdk.javadoc.internal.tool=ALL-UNNAMED</additionalOption>
               <additionalOption>-Xmaxwarns 10000</additionalOption>
             </additionalOptions>
           </configuration>
@@ -2353,21 +2337,11 @@
           <artifactId>make-maven-plugin</artifactId>
           <version>${make-maven-plugin.version}</version>
         </plugin>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-source-plugin</artifactId>
-          <version>${maven-source-plugin.version}</version>
-        </plugin>
         <plugin>
           <groupId>org.apache.avro</groupId>
           <artifactId>avro-maven-plugin</artifactId>
           <version>${avro.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.codehaus.mojo</groupId>
           <artifactId>exec-maven-plugin</artifactId>
diff --git a/hadoop-tools/hadoop-distcp/pom.xml b/hadoop-tools/hadoop-distcp/pom.xml
index 02c0ed768f4..a1f6ebe2af7 100644
--- a/hadoop-tools/hadoop-distcp/pom.xml
+++ b/hadoop-tools/hadoop-distcp/pom.xml
@@ -202,7 +202,7 @@
         </configuration>
         <executions>
           <execution>
-            <id>prepare-jar</id>
+            <id>default-jar</id>
             <phase>prepare-package</phase>
             <goals>
               <goal>jar</goal>
diff --git a/hadoop-tools/hadoop-federation-balance/pom.xml b/hadoop-tools/hadoop-federation-balance/pom.xml
index d8d329fc4f6..31bfc593bec 100644
--- a/hadoop-tools/hadoop-federation-balance/pom.xml
+++ b/hadoop-tools/hadoop-federation-balance/pom.xml
@@ -212,7 +212,7 @@
         </configuration>
         <executions>
           <execution>
-            <id>prepare-jar</id>
+            <id>default-jar</id>
             <phase>prepare-package</phase>
             <goals>
               <goal>jar</goal>
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/pom.xml b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/pom.xml
index 668ddc7b906..32729638f60 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/pom.xml
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/pom.xml
@@ -190,6 +190,7 @@
         <artifactId>maven-jar-plugin</artifactId>
         <executions>
           <execution>
+            <id>default-jar</id>
             <goals>
               <goal>jar</goal>
             </goals>
diff --git a/pom.xml b/pom.xml
index 10c5b366691..ded594dee59 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,14 +14,33 @@
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
+child.project.url.inherit.append.path="false">
   <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache</groupId>
+    <artifactId>apache</artifactId>
+    <version>39</version>
+    <relativePath />
+  </parent>
+
   <groupId>org.apache.hadoop</groupId>
   <artifactId>hadoop-main</artifactId>
   <version>3.6.0-SNAPSHOT</version>
   <description>Apache Hadoop Main</description>
   <name>Apache Hadoop Main</name>
   <packaging>pom</packaging>
+  <url>https://hadoop.apache.org/</url>
+
+  <scm child.scm.connection.inherit.append.path="false"
+       child.scm.developerConnection.inherit.append.path="false"
+       child.scm.url.inherit.append.path="false">
+    <connection>scm:git:https://gitbox.apache.org/repos/asf/hadoop.git</connection>
+    <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/hadoop.git</developerConnection>
+    <url>https://github.com/apache/hadoop/tree/${project.scm.tag}</url>
+    <tag>trunk</tag>
+  </scm>
 
   <distributionManagement>
     <repository>
@@ -95,7 +114,6 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/x
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 
     <!-- maven plugin versions -->
-    <maven-deploy-plugin.version>2.8.1</maven-deploy-plugin.version>
     <maven-site-plugin.version>3.9.1</maven-site-plugin.version>
     <maven-stylus-skin.version>1.5</maven-stylus-skin.version>
     <maven-antrun-plugin.version>1.7</maven-antrun-plugin.version>
@@ -106,7 +124,6 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/x
     <maven-javadoc-plugin.version>3.8.0</maven-javadoc-plugin.version>
     <maven-gpg-plugin.version>1.5</maven-gpg-plugin.version>
     <maven-remote-resources-plugin.version>1.5</maven-remote-resources-plugin.version>
-    <maven-resources-plugin.version>3.0.1</maven-resources-plugin.version>
     <apache-rat-plugin.version>0.12</apache-rat-plugin.version>
     <wagon-ssh.version>2.4</wagon-ssh.version>
     <jacoco-maven-plugin.version>0.8.15</jacoco-maven-plugin.version>
@@ -119,7 +136,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/x
     <spotbugs-maven-plugin.version>4.9.7.0</spotbugs-maven-plugin.version>
     <jsonschema2pojo-maven-plugin.version>1.1.1</jsonschema2pojo-maven-plugin.version>
     <maven-compiler-plugin.version>3.10.1</maven-compiler-plugin.version>
-    <cyclonedx.version>2.9.1</cyclonedx.version>
+    <cyclonedx.version>2.9.3</cyclonedx.version>
     <docker-maven-plugin.version>0.29.0</docker-maven-plugin.version>
 
     <shell-executable>bash</shell-executable>
@@ -144,6 +161,23 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/x
     -->
     <enforced.java.version>[${javac.version},)</enforced.java.version>
     <enforced.maven.version>[3.9.15,)</enforced.maven.version>
+
+    <!-- consumed by the apache parent to set maven.compiler.release and the
+         java version its own enforcer execution requires -->
+    <javaVersion>${javac.version}</javaVersion>
+    <minimalMavenBuildVersion>${enforced.maven.version}</minimalMavenBuildVersion>
+    <!-- The parent's default of posix is rejected by maven-assembly-plugin 2.4;
+         gnu is valid in both and is what the dist descriptors already set. -->
+    <assembly.tarLongFileMode>gnu</assembly.tarLongFileMode>
+
+    <!-- Fixed instant recorded in artifacts built with -Prepeatable; the
+         release manager bumps this when cutting a release branch. -->
+    <hadoop.build.timestamp>2026-01-01T00:00:00Z</hadoop.build.timestamp>
+
+    <!-- Off by default; -Prepeatable sets it to ${hadoop.build.timestamp}.
+         A single character disables it, per the maven-archiver convention.
+         Overrides the value inherited from the apache parent. -->
+    <project.build.outputTimestamp>-</project.build.outputTimestamp>
   </properties>
 
   <modules>
@@ -350,11 +384,6 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/x
           <artifactId>maven-assembly-plugin</artifactId>
           <version>${maven-assembly-plugin.version}</version>
         </plugin>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-deploy-plugin</artifactId>
-          <version>${maven-deploy-plugin.version}</version>
-        </plugin>
         <plugin>
           <groupId>org.apache.rat</groupId>
           <artifactId>apache-rat-plugin</artifactId>
@@ -558,6 +587,19 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/x
     </pluginManagement>
 
     <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-remote-resources-plugin</artifactId>
+        <version>${maven-remote-resources-plugin.version}</version>
+        <executions>
+          <!-- Hadoop ships its own L&N bundle from hadoop-build-tools; unbind
+               the apache parent's bundle so jar contents are unchanged. -->
+          <execution>
+            <id>process-resource-bundles</id>
+            <phase>none</phase>
+          </execution>
+        </executions>
+      </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-enforcer-plugin</artifactId>


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