From 6620b1ed9fb344d2d18c618ca57b91711d76a425 Mon Sep 17 00:00:00 2001
From: Cheng Pan <chengpan@apache.org>
Date: Fri, 20 Jun 2025 17:14:05 +0800
Subject: [PATCH 1/2] Test Maven 4

---
 build/mvn                |  2 +-
 dev/test-dependencies.sh |  6 +++---
 pom.xml                  | 18 ++++++------------
 3 files changed, 10 insertions(+), 16 deletions(-)

diff --git a/build/mvn b/build/mvn
index fef589fc03476..94c205b62b75e 100755
--- a/build/mvn
+++ b/build/mvn
@@ -125,7 +125,7 @@ install_mvn() {
   fi
   if [ $(version $MVN_DETECTED_VERSION) -ne $(version $MVN_VERSION) ]; then
     local MVN_TARBALL="apache-maven-${MVN_VERSION}-bin.tar.gz"
-    local FILE_PATH="maven/maven-3/${MVN_VERSION}/binaries/${MVN_TARBALL}"
+    local FILE_PATH="maven/maven-${MVN_VERSION:0:1}/${MVN_VERSION}/binaries/${MVN_TARBALL}"
     local APACHE_MIRROR=${APACHE_MIRROR:-'https://www.apache.org/dyn/closer.lua'}
     local MIRROR_URL_QUERY="?action=download"
 
diff --git a/dev/test-dependencies.sh b/dev/test-dependencies.sh
index 68c61232ea2af..36e97b8998484 100755
--- a/dev/test-dependencies.sh
+++ b/dev/test-dependencies.sh
@@ -38,7 +38,7 @@ HADOOP_HIVE_PROFILES=(
 )
 
 MVN_EXEC_PLUGIN_VERSION=$(build/mvn help:evaluate \
-    -Dexpression=exec-maven-plugin.version -q -DforceStdout | grep -E "[0-9]+\.[0-9]+\.[0-9]+")
+    -Dexpression=exec-maven-plugin.version -q -DforceStdout | grep -o -E "[0-9]+\.[0-9]+\.[0-9]+")
 
 # We'll switch the version to a temp. one, publish POMs using that new version, then switch back to
 # the old version. We need to do this because the `dependency:build-classpath` task needs to
@@ -52,9 +52,9 @@ OLD_VERSION=$($MVN -q \
     --non-recursive \
     org.codehaus.mojo:exec-maven-plugin:${MVN_EXEC_PLUGIN_VERSION}:exec | grep -E '[0-9]+\.[0-9]+\.[0-9]+')
 # dependency:get for guava and jetty-io are workaround for SPARK-37302.
-GUAVA_VERSION=$(build/mvn help:evaluate -Dexpression=guava.version -q -DforceStdout | grep -E "^[0-9\.]+")
+GUAVA_VERSION=$(build/mvn help:evaluate -Dexpression=guava.version -q -DforceStdout | grep -o -E "[0-9][0-9a-zA-Z\.\-]+")
 build/mvn dependency:get -Dartifact=com.google.guava:guava:${GUAVA_VERSION} -q
-JETTY_VERSION=$(build/mvn help:evaluate -Dexpression=jetty.version -q -DforceStdout | grep -E "[0-9]+\.[0-9]+\.[0-9]+")
+JETTY_VERSION=$(build/mvn help:evaluate -Dexpression=jetty.version -q -DforceStdout | grep -o -E "[0-9]+\.[0-9]+\.[0-9]+")
 build/mvn dependency:get -Dartifact=org.eclipse.jetty:jetty-io:${JETTY_VERSION} -q
 if [ $? != 0 ]; then
     echo -e "Error while getting version string from Maven:\n$OLD_VERSION"
diff --git a/pom.xml b/pom.xml
index aa0b984cfa874..0e32e4e762adc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -117,7 +117,7 @@
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
     <java.version>17</java.version>
     <maven.compiler.release>${java.version}</maven.compiler.release>
-    <maven.version>3.9.10</maven.version>
+    <maven.version>4.0.0-rc-4</maven.version>
     <exec-maven-plugin.version>3.5.0</exec-maven-plugin.version>
     <sbt.project.name>spark</sbt.project.name>
     <asm.version>9.8</asm.version>
@@ -2953,7 +2953,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-clean-plugin</artifactId>
-          <version>3.4.1</version>
+          <version>3.5.0</version>
           <configuration>
             <filesets>
               <fileset>
@@ -3475,20 +3475,14 @@
      -->
     <profile>
       <id>snapshots-and-staging</id>
-      <properties>
-        <!-- override point for ASF staging/snapshot repos -->
-        <asf.staging>https://repository.apache.org/content/groups/staging/</asf.staging>
-        <asf.snapshots>https://repository.apache.org/content/repositories/snapshots/</asf.snapshots>
-      </properties>
-
       <pluginRepositories>
         <pluginRepository>
           <id>ASF Staging</id>
-          <url>${asf.staging}</url>
+          <url>https://repository.apache.org/content/groups/staging/</url>
         </pluginRepository>
         <pluginRepository>
           <id>ASF Snapshots</id>
-          <url>${asf.snapshots}</url>
+          <url>https://repository.apache.org/content/repositories/snapshots/</url>
           <snapshots>
             <enabled>true</enabled>
           </snapshots>
@@ -3501,11 +3495,11 @@
       <repositories>
         <repository>
           <id>ASF Staging</id>
-          <url>${asf.staging}</url>
+          <url>https://repository.apache.org/content/groups/staging/</url>
         </repository>
         <repository>
           <id>ASF Snapshots</id>
-          <url>${asf.snapshots}</url>
+          <url>https://repository.apache.org/content/repositories/snapshots/</url>
           <snapshots>
             <enabled>true</enabled>
           </snapshots>

From 1fdedd3cc22f4661b30f144db20299dec5abc3d4 Mon Sep 17 00:00:00 2001
From: Cheng Pan <chengpan@apache.org>
Date: Mon, 23 Jun 2025 10:47:17 +0800
Subject: [PATCH 2/2] mvn ci

---
 .github/workflows/build_and_test.yml | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml
index 7580393ec0635..a25030a53202e 100644
--- a/.github/workflows/build_and_test.yml
+++ b/.github/workflows/build_and_test.yml
@@ -1359,3 +1359,9 @@ jobs:
           cd ui-test
           npm install --save-dev
           node --experimental-vm-modules node_modules/.bin/jest
+
+  maven-test:
+    permissions:
+      packages: write
+    name: Run
+    uses: ./.github/workflows/maven_test.yml