This is an automated email from the ASF dual-hosted git repository.
JingsongLi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/paimon-mosaic.git
The following commit(s) were added to refs/heads/main by this push:
new 78263ef Rename Java package to org.apache.paimon.mosaic and update
pom.xml (#12)
78263ef is described below
commit 78263ef2e661119c92ebb51378a92b42ed073404
Author: Jingsong Lee <[email protected]>
AuthorDate: Wed May 20 11:57:20 2026 +0800
Rename Java package to org.apache.paimon.mosaic and update pom.xml (#12)
- Rename package from io.mosaic to org.apache.paimon.mosaic
- Update groupId to org.apache.paimon.mosaic with Apache parent pom
- Downgrade to Java 1.8 source/target and Arrow 15.0.0
- Add enhanced NativeLib with JAR-embedded native library loading
- Add release profile with GPG signing and enforcer plugin
- Update JNI function names to match new package path
---
docs/java-api.html | 4 +-
java/pom.xml | 85 +++++++++++++++++++++-
.../apache/paimon}/mosaic/ColumnStatistics.java | 2 +-
.../apache/paimon}/mosaic/InputFile.java | 2 +-
.../apache/paimon}/mosaic/MosaicReader.java | 2 +-
.../apache/paimon}/mosaic/MosaicWriter.java | 2 +-
.../apache/paimon}/mosaic/NativeLib.java | 75 ++++++++++++++++++-
.../apache/paimon}/mosaic/WriterOptions.java | 2 +-
.../apache/paimon}/mosaic/MosaicRoundtripTest.java | 2 +-
jni/src/lib.rs | 38 +++++-----
10 files changed, 181 insertions(+), 33 deletions(-)
diff --git a/docs/java-api.html b/docs/java-api.html
index c14a834..edc4323 100644
--- a/docs/java-api.html
+++ b/docs/java-api.html
@@ -75,7 +75,7 @@
<dependency>
<groupId>org.apache.arrow</groupId>
<artifactId>arrow-bom</artifactId>
- <version>18.1.0</version>
+ <version>15.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
@@ -299,7 +299,7 @@
</p>
<h2>Complete Example</h2>
-<pre><code><span class="kw">import</span> io.mosaic.*;
+<pre><code><span class="kw">import</span> org.apache.paimon.mosaic.*;
<span class="kw">import</span> org.apache.arrow.memory.*;
<span class="kw">import</span> org.apache.arrow.vector.*;
<span class="kw">import</span> org.apache.arrow.vector.types.pojo.*;
diff --git a/java/pom.xml b/java/pom.xml
index f295fcc..bfe3127 100644
--- a/java/pom.xml
+++ b/java/pom.xml
@@ -22,19 +22,50 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
- <groupId>io.mosaic</groupId>
+ <parent>
+ <groupId>org.apache</groupId>
+ <artifactId>apache</artifactId>
+ <version>23</version>
+ </parent>
+
+ <groupId>org.apache.paimon.mosaic</groupId>
<artifactId>mosaic-writer</artifactId>
<version>0.1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Mosaic Writer</name>
<description>Mosaic file format writer for Java (backed by Rust via
JNI)</description>
+ <url>https://paimon.apache.org</url>
+ <inceptionYear>2025</inceptionYear>
+
+ <licenses>
+ <license>
+ <name>The Apache Software License, Version 2.0</name>
+ <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+ <distribution>repo</distribution>
+ </license>
+ </licenses>
+
+ <scm>
+ <url>https://github.com/apache/paimon-mosaic</url>
+ <connection>[email protected]:apache/paimon-mosaic.git</connection>
+
<developerConnection>scm:git:https://gitbox.apache.org/repos/asf/paimon-mosaic.git</developerConnection>
+ </scm>
+
+ <developers>
+ <developer>
+ <name>Apache Paimon Contributors</name>
+ <email>[email protected]</email>
+ <organization>Apache Software Foundation</organization>
+ <organizationUrl>https://www.apache.org</organizationUrl>
+ </developer>
+ </developers>
<properties>
- <maven.compiler.source>11</maven.compiler.source>
- <maven.compiler.target>11</maven.compiler.target>
+ <maven.compiler.source>1.8</maven.compiler.source>
+ <maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <arrow.version>18.1.0</arrow.version>
+ <arrow.version>15.0.0</arrow.version>
</properties>
<dependencyManagement>
@@ -70,4 +101,50 @@
<scope>test</scope>
</dependency>
</dependencies>
+
+ <profiles>
+ <profile>
+ <id>release</id>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-gpg-plugin</artifactId>
+ <version>1.4</version>
+ <executions>
+ <execution>
+ <id>sign-artifacts</id>
+ <phase>verify</phase>
+ <goals>
+ <goal>sign</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-enforcer-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>enforce-maven</id>
+ <goals>
+ <goal>enforce</goal>
+ </goals>
+ <configuration>
+ <rules>
+ <requireJavaVersion>
+ <version>1.8.0</version>
+ </requireJavaVersion>
+ <requireMavenVersion>
+ <version>[3.1.1,)</version>
+ </requireMavenVersion>
+ </rules>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
</project>
diff --git a/java/src/main/java/io/mosaic/ColumnStatistics.java
b/java/src/main/java/org/apache/paimon/mosaic/ColumnStatistics.java
similarity index 97%
rename from java/src/main/java/io/mosaic/ColumnStatistics.java
rename to java/src/main/java/org/apache/paimon/mosaic/ColumnStatistics.java
index e4733d7..2a37271 100644
--- a/java/src/main/java/io/mosaic/ColumnStatistics.java
+++ b/java/src/main/java/org/apache/paimon/mosaic/ColumnStatistics.java
@@ -17,7 +17,7 @@
* under the License.
*/
-package io.mosaic;
+package org.apache.paimon.mosaic;
public class ColumnStatistics {
diff --git a/java/src/main/java/io/mosaic/InputFile.java
b/java/src/main/java/org/apache/paimon/mosaic/InputFile.java
similarity index 97%
rename from java/src/main/java/io/mosaic/InputFile.java
rename to java/src/main/java/org/apache/paimon/mosaic/InputFile.java
index 9808d1f..980ceb3 100644
--- a/java/src/main/java/io/mosaic/InputFile.java
+++ b/java/src/main/java/org/apache/paimon/mosaic/InputFile.java
@@ -17,7 +17,7 @@
* under the License.
*/
-package io.mosaic;
+package org.apache.paimon.mosaic;
import java.io.IOException;
diff --git a/java/src/main/java/io/mosaic/MosaicReader.java
b/java/src/main/java/org/apache/paimon/mosaic/MosaicReader.java
similarity index 99%
rename from java/src/main/java/io/mosaic/MosaicReader.java
rename to java/src/main/java/org/apache/paimon/mosaic/MosaicReader.java
index 95d8f47..c59a04b 100644
--- a/java/src/main/java/io/mosaic/MosaicReader.java
+++ b/java/src/main/java/org/apache/paimon/mosaic/MosaicReader.java
@@ -17,7 +17,7 @@
* under the License.
*/
-package io.mosaic;
+package org.apache.paimon.mosaic;
import java.util.ArrayList;
import java.util.List;
diff --git a/java/src/main/java/io/mosaic/MosaicWriter.java
b/java/src/main/java/org/apache/paimon/mosaic/MosaicWriter.java
similarity index 98%
rename from java/src/main/java/io/mosaic/MosaicWriter.java
rename to java/src/main/java/org/apache/paimon/mosaic/MosaicWriter.java
index 09f6a3a..c23449d 100644
--- a/java/src/main/java/io/mosaic/MosaicWriter.java
+++ b/java/src/main/java/org/apache/paimon/mosaic/MosaicWriter.java
@@ -17,7 +17,7 @@
* under the License.
*/
-package io.mosaic;
+package org.apache.paimon.mosaic;
import java.io.OutputStream;
diff --git a/java/src/main/java/io/mosaic/NativeLib.java
b/java/src/main/java/org/apache/paimon/mosaic/NativeLib.java
similarity index 50%
rename from java/src/main/java/io/mosaic/NativeLib.java
rename to java/src/main/java/org/apache/paimon/mosaic/NativeLib.java
index 1805269..d09cd9b 100644
--- a/java/src/main/java/io/mosaic/NativeLib.java
+++ b/java/src/main/java/org/apache/paimon/mosaic/NativeLib.java
@@ -17,18 +17,89 @@
* under the License.
*/
-package io.mosaic;
+package org.apache.paimon.mosaic;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
final class NativeLib {
+ private static final String LIB_NAME = "mosaic_jni";
+
static {
- System.loadLibrary("mosaic_jni");
+ loadNativeLibrary();
}
private NativeLib() {}
+ private static void loadNativeLibrary() {
+ // First try java.library.path (for development / manual override)
+ try {
+ System.loadLibrary(LIB_NAME);
+ return;
+ } catch (UnsatisfiedLinkError ignored) {
+ }
+
+ // Extract from JAR resources
+ String os = normalizeOs(System.getProperty("os.name", ""));
+ String arch = normalizeArch(System.getProperty("os.arch", ""));
+ String libFileName = mapLibraryName(os);
+ String resourcePath = "/native/" + os + "/" + arch + "/" + libFileName;
+
+ try (InputStream in =
NativeLib.class.getResourceAsStream(resourcePath)) {
+ if (in == null) {
+ throw new UnsatisfiedLinkError(
+ "Native library not found in JAR: " + resourcePath);
+ }
+ File tempFile = File.createTempFile("mosaic_jni", libFileName);
+ tempFile.deleteOnExit();
+ Files.copy(in, tempFile.toPath(),
StandardCopyOption.REPLACE_EXISTING);
+ System.load(tempFile.getAbsolutePath());
+ } catch (IOException e) {
+ throw new UnsatisfiedLinkError(
+ "Failed to extract native library: " + e.getMessage());
+ }
+ }
+
+ private static String normalizeOs(String osName) {
+ String lower = osName.toLowerCase();
+ if (lower.contains("linux")) {
+ return "linux";
+ } else if (lower.contains("mac") || lower.contains("darwin")) {
+ return "macos";
+ } else if (lower.contains("win")) {
+ return "windows";
+ }
+ throw new UnsatisfiedLinkError("Unsupported OS: " + osName);
+ }
+
+ private static String normalizeArch(String archName) {
+ String lower = archName.toLowerCase();
+ if (lower.equals("amd64") || lower.equals("x86_64")) {
+ return "x86_64";
+ } else if (lower.equals("aarch64") || lower.equals("arm64")) {
+ return "aarch64";
+ }
+ throw new UnsatisfiedLinkError("Unsupported architecture: " +
archName);
+ }
+
+ private static String mapLibraryName(String os) {
+ switch (os) {
+ case "linux":
+ return "libmosaic_jni.so";
+ case "macos":
+ return "libmosaic_jni.dylib";
+ case "windows":
+ return "mosaic_jni.dll";
+ default:
+ throw new UnsatisfiedLinkError("Unsupported OS: " + os);
+ }
+ }
+
// Writer
static native long nativeWriterOpen(OutputStream stream, long
arrowSchemaAddr,
int numBuckets, int compression, int
zstdLevel,
diff --git a/java/src/main/java/io/mosaic/WriterOptions.java
b/java/src/main/java/org/apache/paimon/mosaic/WriterOptions.java
similarity index 98%
rename from java/src/main/java/io/mosaic/WriterOptions.java
rename to java/src/main/java/org/apache/paimon/mosaic/WriterOptions.java
index 8b8d687..8a46ad7 100644
--- a/java/src/main/java/io/mosaic/WriterOptions.java
+++ b/java/src/main/java/org/apache/paimon/mosaic/WriterOptions.java
@@ -17,7 +17,7 @@
* under the License.
*/
-package io.mosaic;
+package org.apache.paimon.mosaic;
public class WriterOptions {
diff --git a/java/src/test/java/io/mosaic/MosaicRoundtripTest.java
b/java/src/test/java/org/apache/paimon/mosaic/MosaicRoundtripTest.java
similarity index 99%
rename from java/src/test/java/io/mosaic/MosaicRoundtripTest.java
rename to java/src/test/java/org/apache/paimon/mosaic/MosaicRoundtripTest.java
index 7fd777a..ba6ff93 100644
--- a/java/src/test/java/io/mosaic/MosaicRoundtripTest.java
+++ b/java/src/test/java/org/apache/paimon/mosaic/MosaicRoundtripTest.java
@@ -17,7 +17,7 @@
* under the License.
*/
-package io.mosaic;
+package org.apache.paimon.mosaic;
import java.io.ByteArrayOutputStream;
import java.nio.ByteBuffer;
diff --git a/jni/src/lib.rs b/jni/src/lib.rs
index 2c845c6..c21ae65 100644
--- a/jni/src/lib.rs
+++ b/jni/src/lib.rs
@@ -194,7 +194,7 @@ struct WriterHandle {
// ======================== Writer ========================
#[no_mangle]
-pub extern "system" fn Java_io_mosaic_NativeLib_nativeWriterOpen(
+pub extern "system" fn
Java_org_apache_paimon_mosaic_NativeLib_nativeWriterOpen(
mut env: JNIEnv,
_class: JClass,
stream: JObject,
@@ -321,7 +321,7 @@ pub extern "system" fn
Java_io_mosaic_NativeLib_nativeWriterOpen(
}
#[no_mangle]
-pub extern "system" fn Java_io_mosaic_NativeLib_nativeWriterClose(
+pub extern "system" fn
Java_org_apache_paimon_mosaic_NativeLib_nativeWriterClose(
mut env: JNIEnv,
_class: JClass,
handle: jlong,
@@ -343,7 +343,7 @@ pub extern "system" fn
Java_io_mosaic_NativeLib_nativeWriterClose(
}
#[no_mangle]
-pub extern "system" fn Java_io_mosaic_NativeLib_nativeWriterFree(
+pub extern "system" fn
Java_org_apache_paimon_mosaic_NativeLib_nativeWriterFree(
_env: JNIEnv,
_class: JClass,
handle: jlong,
@@ -356,7 +356,7 @@ pub extern "system" fn
Java_io_mosaic_NativeLib_nativeWriterFree(
// ======================== Writer.estimatedSize ========================
#[no_mangle]
-pub extern "system" fn Java_io_mosaic_NativeLib_nativeWriterEstimatedSize(
+pub extern "system" fn
Java_org_apache_paimon_mosaic_NativeLib_nativeWriterEstimatedSize(
_env: JNIEnv,
_class: JClass,
handle: jlong,
@@ -371,7 +371,7 @@ pub extern "system" fn
Java_io_mosaic_NativeLib_nativeWriterEstimatedSize(
// ======================== Writer.writeBatch (Arrow C Data Interface)
========================
#[no_mangle]
-pub extern "system" fn Java_io_mosaic_NativeLib_nativeWriterWriteBatch(
+pub extern "system" fn
Java_org_apache_paimon_mosaic_NativeLib_nativeWriterWriteBatch(
mut env: JNIEnv,
_class: JClass,
writer_handle: jlong,
@@ -427,7 +427,7 @@ struct RowGroupReaderHandle {
}
#[no_mangle]
-pub extern "system" fn Java_io_mosaic_NativeLib_nativeReaderOpen(
+pub extern "system" fn
Java_org_apache_paimon_mosaic_NativeLib_nativeReaderOpen(
mut env: JNIEnv,
_class: JClass,
input_file: JObject,
@@ -483,7 +483,7 @@ pub extern "system" fn
Java_io_mosaic_NativeLib_nativeReaderOpen(
}
#[no_mangle]
-pub extern "system" fn Java_io_mosaic_NativeLib_nativeReaderFree(
+pub extern "system" fn
Java_org_apache_paimon_mosaic_NativeLib_nativeReaderFree(
_env: JNIEnv,
_class: JClass,
handle: jlong,
@@ -494,7 +494,7 @@ pub extern "system" fn
Java_io_mosaic_NativeLib_nativeReaderFree(
}
#[no_mangle]
-pub extern "system" fn Java_io_mosaic_NativeLib_nativeReaderExportSchema(
+pub extern "system" fn
Java_org_apache_paimon_mosaic_NativeLib_nativeReaderExportSchema(
_env: JNIEnv,
_class: JClass,
handle: jlong,
@@ -527,7 +527,7 @@ pub extern "system" fn
Java_io_mosaic_NativeLib_nativeReaderExportSchema(
}
#[no_mangle]
-pub extern "system" fn Java_io_mosaic_NativeLib_nativeReaderNumRowGroups(
+pub extern "system" fn
Java_org_apache_paimon_mosaic_NativeLib_nativeReaderNumRowGroups(
_env: JNIEnv,
_class: JClass,
handle: jlong,
@@ -541,7 +541,7 @@ pub extern "system" fn
Java_io_mosaic_NativeLib_nativeReaderNumRowGroups(
}
#[no_mangle]
-pub extern "system" fn Java_io_mosaic_NativeLib_nativeReaderOpenRowGroup(
+pub extern "system" fn
Java_org_apache_paimon_mosaic_NativeLib_nativeReaderOpenRowGroup(
mut env: JNIEnv,
_class: JClass,
handle: jlong,
@@ -576,7 +576,7 @@ pub extern "system" fn
Java_io_mosaic_NativeLib_nativeReaderOpenRowGroup(
}
#[no_mangle]
-pub extern "system" fn
Java_io_mosaic_NativeLib_nativeReaderOpenRowGroupProjected(
+pub extern "system" fn
Java_org_apache_paimon_mosaic_NativeLib_nativeReaderOpenRowGroupProjected(
mut env: JNIEnv,
_class: JClass,
handle: jlong,
@@ -629,7 +629,7 @@ pub extern "system" fn
Java_io_mosaic_NativeLib_nativeReaderOpenRowGroupProjecte
// ======================== RowGroupReader ========================
#[no_mangle]
-pub extern "system" fn Java_io_mosaic_NativeLib_nativeRowGroupReaderNumRows(
+pub extern "system" fn
Java_org_apache_paimon_mosaic_NativeLib_nativeRowGroupReaderNumRows(
_env: JNIEnv,
_class: JClass,
handle: jlong,
@@ -642,7 +642,7 @@ pub extern "system" fn
Java_io_mosaic_NativeLib_nativeRowGroupReaderNumRows(
}
#[no_mangle]
-pub extern "system" fn Java_io_mosaic_NativeLib_nativeRowGroupReaderFree(
+pub extern "system" fn
Java_org_apache_paimon_mosaic_NativeLib_nativeRowGroupReaderFree(
_env: JNIEnv,
_class: JClass,
handle: jlong,
@@ -655,7 +655,7 @@ pub extern "system" fn
Java_io_mosaic_NativeLib_nativeRowGroupReaderFree(
// ======================== Row Group Stats ========================
#[no_mangle]
-pub extern "system" fn Java_io_mosaic_NativeLib_nativeReaderRowGroupNumStats(
+pub extern "system" fn
Java_org_apache_paimon_mosaic_NativeLib_nativeReaderRowGroupNumStats(
_env: JNIEnv,
_class: JClass,
handle: jlong,
@@ -672,7 +672,7 @@ pub extern "system" fn
Java_io_mosaic_NativeLib_nativeReaderRowGroupNumStats(
}
#[no_mangle]
-pub extern "system" fn
Java_io_mosaic_NativeLib_nativeReaderRowGroupStatColumnIndex(
+pub extern "system" fn
Java_org_apache_paimon_mosaic_NativeLib_nativeReaderRowGroupStatColumnIndex(
_env: JNIEnv,
_class: JClass,
handle: jlong,
@@ -695,7 +695,7 @@ pub extern "system" fn
Java_io_mosaic_NativeLib_nativeReaderRowGroupStatColumnIn
}
#[no_mangle]
-pub extern "system" fn
Java_io_mosaic_NativeLib_nativeReaderRowGroupStatNullCount(
+pub extern "system" fn
Java_org_apache_paimon_mosaic_NativeLib_nativeReaderRowGroupStatNullCount(
_env: JNIEnv,
_class: JClass,
handle: jlong,
@@ -718,7 +718,7 @@ pub extern "system" fn
Java_io_mosaic_NativeLib_nativeReaderRowGroupStatNullCoun
}
#[no_mangle]
-pub extern "system" fn
Java_io_mosaic_NativeLib_nativeReaderRowGroupStatMin<'a>(
+pub extern "system" fn
Java_org_apache_paimon_mosaic_NativeLib_nativeReaderRowGroupStatMin<'a>(
env: JNIEnv<'a>,
_class: JClass<'a>,
handle: jlong,
@@ -748,7 +748,7 @@ pub extern "system" fn
Java_io_mosaic_NativeLib_nativeReaderRowGroupStatMin<'a>(
}
#[no_mangle]
-pub extern "system" fn
Java_io_mosaic_NativeLib_nativeReaderRowGroupStatMax<'a>(
+pub extern "system" fn
Java_org_apache_paimon_mosaic_NativeLib_nativeReaderRowGroupStatMax<'a>(
env: JNIEnv<'a>,
_class: JClass<'a>,
handle: jlong,
@@ -780,7 +780,7 @@ pub extern "system" fn
Java_io_mosaic_NativeLib_nativeReaderRowGroupStatMax<'a>(
// ======================== Columnar Read (Arrow C Data Interface)
========================
#[no_mangle]
-pub extern "system" fn
Java_io_mosaic_NativeLib_nativeRowGroupReaderReadColumns(
+pub extern "system" fn
Java_org_apache_paimon_mosaic_NativeLib_nativeRowGroupReaderReadColumns(
mut env: JNIEnv,
_class: JClass,
handle: jlong,