diff --git a/lance-spark-4.0_2.13/pom.xml b/lance-spark-4.0_2.13/pom.xml
index 0b4b3e76..aa3baa82 100644
--- a/lance-spark-4.0_2.13/pom.xml
+++ b/lance-spark-4.0_2.13/pom.xml
@@ -18,6 +18,7 @@
${scala213.version}
${scala213.compat.version}
4.13.1
+ 17
@@ -143,6 +144,8 @@
-feature
+ -release
+ ${java.release}
@@ -151,7 +154,7 @@
maven-compiler-plugin
${maven-compiler-plugin.version}
- 17
+ ${java.release}
@@ -195,4 +198,12 @@
+
+
+ java21
+
+ 21
+
+
+
diff --git a/lance-spark-4.0_2.13/src/test/java/org/lance/spark/BlobCreateTableTest.java b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/BlobCreateTableTest.java
new file mode 100644
index 00000000..6800efb6
--- /dev/null
+++ b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/BlobCreateTableTest.java
@@ -0,0 +1,19 @@
+/*
+ * 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.lance.spark;
+
+/** Concrete implementation of BaseBlobCreateTableTest for Spark 3.4. */
+public class BlobCreateTableTest extends BaseBlobCreateTableTest {
+ // All test methods are inherited from BaseBlobCreateTableTest
+}
diff --git a/lance-spark-4.0_2.13/src/test/java/org/lance/spark/LanceFormatTest.java b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/LanceFormatTest.java
new file mode 100644
index 00000000..327d3f29
--- /dev/null
+++ b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/LanceFormatTest.java
@@ -0,0 +1,16 @@
+/*
+ * 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.lance.spark;
+
+public class LanceFormatTest extends BaseLanceFormatTest {}
diff --git a/lance-spark-4.0_2.13/src/test/java/org/lance/spark/TestSparkDirectoryNamespace.java b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/TestSparkDirectoryNamespace.java
new file mode 100644
index 00000000..7f43cf3e
--- /dev/null
+++ b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/TestSparkDirectoryNamespace.java
@@ -0,0 +1,16 @@
+/*
+ * 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.lance.spark;
+
+public class TestSparkDirectoryNamespace extends BaseTestSparkDirectoryNamespace {}
diff --git a/lance-spark-4.0_2.13/src/test/java/org/lance/spark/TestSparkLanceDbRestNamespace.java b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/TestSparkLanceDbRestNamespace.java
new file mode 100644
index 00000000..a811b018
--- /dev/null
+++ b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/TestSparkLanceDbRestNamespace.java
@@ -0,0 +1,16 @@
+/*
+ * 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.lance.spark;
+
+public class TestSparkLanceDbRestNamespace extends BaseTestSparkLanceDbRestNamespace {}
diff --git a/lance-spark-4.0_2.13/src/test/java/org/lance/spark/VectorCreateTableTest.java b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/VectorCreateTableTest.java
new file mode 100644
index 00000000..032fc9a2
--- /dev/null
+++ b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/VectorCreateTableTest.java
@@ -0,0 +1,16 @@
+/*
+ * 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.lance.spark;
+
+public class VectorCreateTableTest extends BaseVectorCreateTableTest {}
diff --git a/lance-spark-4.0_2.13/src/test/java/org/lance/spark/read/SparkConnectorAggPushdownTest.java b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/read/SparkConnectorAggPushdownTest.java
new file mode 100644
index 00000000..380d7198
--- /dev/null
+++ b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/read/SparkConnectorAggPushdownTest.java
@@ -0,0 +1,16 @@
+/*
+ * 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.lance.spark.read;
+
+public class SparkConnectorAggPushdownTest extends BaseSparkConnectorAggPushdownTest {}
diff --git a/lance-spark-4.0_2.13/src/test/java/org/lance/spark/read/SparkConnectorLineItemTest.java b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/read/SparkConnectorLineItemTest.java
new file mode 100644
index 00000000..dc3554c1
--- /dev/null
+++ b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/read/SparkConnectorLineItemTest.java
@@ -0,0 +1,16 @@
+/*
+ * 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.lance.spark.read;
+
+public class SparkConnectorLineItemTest extends BaseSparkConnectorLineItemTest {}
diff --git a/lance-spark-4.0_2.13/src/test/java/org/lance/spark/read/SparkConnectorReadTest.java b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/read/SparkConnectorReadTest.java
new file mode 100644
index 00000000..125fbda7
--- /dev/null
+++ b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/read/SparkConnectorReadTest.java
@@ -0,0 +1,16 @@
+/*
+ * 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.lance.spark.read;
+
+public class SparkConnectorReadTest extends BaseSparkConnectorReadTest {}
diff --git a/lance-spark-4.0_2.13/src/test/java/org/lance/spark/read/SparkConnectorReadWithRowAddressTest.java b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/read/SparkConnectorReadWithRowAddressTest.java
new file mode 100644
index 00000000..3b42f08f
--- /dev/null
+++ b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/read/SparkConnectorReadWithRowAddressTest.java
@@ -0,0 +1,17 @@
+/*
+ * 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.lance.spark.read;
+
+public class SparkConnectorReadWithRowAddressTest
+ extends BaseSparkConnectorReadWithRowAddressTest {}
diff --git a/lance-spark-4.0_2.13/src/test/java/org/lance/spark/read/SparkConnectorReadWithRowIdTest.java b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/read/SparkConnectorReadWithRowIdTest.java
new file mode 100644
index 00000000..522dc651
--- /dev/null
+++ b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/read/SparkConnectorReadWithRowIdTest.java
@@ -0,0 +1,16 @@
+/*
+ * 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.lance.spark.read;
+
+public class SparkConnectorReadWithRowIdTest extends BaseSparkConnectorReadWithRowIdTest {}
diff --git a/lance-spark-4.0_2.13/src/test/java/org/lance/spark/update/AddColumnsBackfillTest.java b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/update/AddColumnsBackfillTest.java
new file mode 100644
index 00000000..b85d33ea
--- /dev/null
+++ b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/update/AddColumnsBackfillTest.java
@@ -0,0 +1,18 @@
+/*
+ * 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.lance.spark.update;
+
+public class AddColumnsBackfillTest extends BaseAddColumnsBackfillTest {
+ // All test methods are inherited from BaseAddColumnsBackfillTest
+}
diff --git a/lance-spark-4.0_2.13/src/test/java/org/lance/spark/update/OptimizeTest.java b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/update/OptimizeTest.java
new file mode 100644
index 00000000..c07da3ce
--- /dev/null
+++ b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/update/OptimizeTest.java
@@ -0,0 +1,16 @@
+/*
+ * 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.lance.spark.update;
+
+public class OptimizeTest extends BaseOptimizeTest {}
diff --git a/lance-spark-4.0_2.13/src/test/java/org/lance/spark/update/VacuumTest.java b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/update/VacuumTest.java
new file mode 100644
index 00000000..0d7e4e28
--- /dev/null
+++ b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/update/VacuumTest.java
@@ -0,0 +1,16 @@
+/*
+ * 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.lance.spark.update;
+
+public class VacuumTest extends BaseVacuumTest {}
diff --git a/lance-spark-4.0_2.13/src/test/java/org/lance/spark/write/SparkConnectorWriteTest.java b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/write/SparkConnectorWriteTest.java
new file mode 100644
index 00000000..87a30a32
--- /dev/null
+++ b/lance-spark-4.0_2.13/src/test/java/org/lance/spark/write/SparkConnectorWriteTest.java
@@ -0,0 +1,16 @@
+/*
+ * 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.lance.spark.write;
+
+public class SparkConnectorWriteTest extends BaseSparkConnectorWriteTest {}
diff --git a/lance-spark-bundle-4.0_2.13/pom.xml b/lance-spark-bundle-4.0_2.13/pom.xml
index b0697bf9..ffda5a10 100644
--- a/lance-spark-bundle-4.0_2.13/pom.xml
+++ b/lance-spark-bundle-4.0_2.13/pom.xml
@@ -108,4 +108,4 @@
-
\ No newline at end of file
+
diff --git a/pom.xml b/pom.xml
index b0adc744..0f15125e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -112,6 +112,7 @@
2.5.2
3.0.2
3.2.5
+ 11
@@ -328,7 +329,7 @@
- 11
+ ${java.release}
@@ -363,6 +364,59 @@
+
+ java21
+
+ false
+
+
+ 21
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+
+ -h
+ target/headers
+
+ 21
+
+
+
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+
+ -XX:+IgnoreUnrecognizedVMOptions
+ --add-opens=java.base/java.lang=ALL-UNNAMED
+ --add-opens=java.base/java.lang.invoke=ALL-UNNAMED
+ --add-opens=java.base/java.lang.reflect=ALL-UNNAMED
+ --add-opens=java.base/java.io=ALL-UNNAMED
+ --add-opens=java.base/java.net=ALL-UNNAMED
+ --add-opens=java.base/java.nio=ALL-UNNAMED
+ --add-opens=java.base/java.util=ALL-UNNAMED
+ --add-opens=java.base/java.util.concurrent=ALL-UNNAMED
+ --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED
+ --add-opens=java.base/jdk.internal.ref=ALL-UNNAMED
+ --add-opens=java.base/sun.nio.ch=ALL-UNNAMED
+ --add-opens=java.base/sun.nio.cs=ALL-UNNAMED
+ --add-opens=java.base/sun.security.action=ALL-UNNAMED
+ --add-opens=java.base/sun.util.calendar=ALL-UNNAMED
+ --add-opens=java.security.jgss/sun.security.krb5=ALL-UNNAMED
+ -Djdk.reflect.useDirectMethodHandle=false
+ -Dio.netty.tryReflectionSetAccessible=true
+
+
+ false
+
+
+
+
+
scala-2.12