diff --git a/.github/workflows/bindings_java.yml b/.github/workflows/bindings_java.yml
index 55d48b3f9c22..5af665e2a5e5 100644
--- a/.github/workflows/bindings_java.yml
+++ b/.github/workflows/bindings_java.yml
@@ -49,6 +49,6 @@ jobs:
distribution: 'temurin'
java-version: '11'
cache: 'maven'
- - name: Build with Maven
- run: mvn test --file ${{ github.workspace }}/bindings/java/pom.xml
-
+ - name: Build and test
+ working-directory: bindings/java
+ run: mvn clean verify
diff --git a/Cargo.lock b/Cargo.lock
index b2df511659db..734e88d31ac7 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -94,9 +94,9 @@ dependencies = [
[[package]]
name = "anyhow"
-version = "1.0.70"
+version = "1.0.71"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4"
+checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8"
[[package]]
name = "arc-swap"
@@ -262,7 +262,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.12",
+ "syn 2.0.16",
]
[[package]]
@@ -292,7 +292,7 @@ checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.12",
+ "syn 2.0.16",
]
[[package]]
@@ -1008,7 +1008,7 @@ dependencies = [
"proc-macro2",
"quote",
"scratch",
- "syn 2.0.12",
+ "syn 2.0.16",
]
[[package]]
@@ -1025,7 +1025,7 @@ checksum = "631569015d0d8d54e6c241733f944042623ab6df7bc3be7466874b05fcdb1c5f"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.12",
+ "syn 2.0.16",
]
[[package]]
@@ -1426,7 +1426,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.12",
+ "syn 2.0.16",
]
[[package]]
@@ -3302,9 +3302,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
[[package]]
name = "proc-macro2"
-version = "1.0.52"
+version = "1.0.58"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d0e1ae9e836cc3beddd63db0df682593d7e2d3d891ae8c9083d2113e1744224"
+checksum = "fa1fb82fc0c281dd9671101b66b771ebbe1eaf967b96ac8740dcba4b70005ca8"
dependencies = [
"unicode-ident",
]
@@ -4056,7 +4056,7 @@ checksum = "e801c1712f48475582b7696ac71e0ca34ebb30e09338425384269d9717c62cad"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.12",
+ "syn 2.0.16",
]
[[package]]
@@ -4372,9 +4372,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.12"
+version = "2.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79d9531f94112cfc3e4c8f5f02cb2b58f72c97b7efd85f70203cc6d8efda5927"
+checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01"
dependencies = [
"proc-macro2",
"quote",
@@ -4456,7 +4456,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.12",
+ "syn 2.0.16",
]
[[package]]
@@ -4565,9 +4565,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.27.0"
+version = "1.28.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001"
+checksum = "0aa32867d44e6f2ce3385e89dceb990188b8bb0fb25b0cf576647a6f98ac5105"
dependencies = [
"autocfg",
"bytes",
@@ -4579,7 +4579,7 @@ dependencies = [
"signal-hook-registry",
"socket2",
"tokio-macros",
- "windows-sys 0.45.0",
+ "windows-sys 0.48.0",
]
[[package]]
@@ -4594,13 +4594,13 @@ dependencies = [
[[package]]
name = "tokio-macros"
-version = "2.0.0"
+version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce"
+checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.12",
+ "syn 2.0.16",
]
[[package]]
diff --git a/bindings/java/Cargo.toml b/bindings/java/Cargo.toml
index 92612ca592fb..60728fd78115 100644
--- a/bindings/java/Cargo.toml
+++ b/bindings/java/Cargo.toml
@@ -32,10 +32,9 @@ crate-type = ["cdylib"]
doc = false
[dependencies]
-jni = "0.21.1"
opendal.workspace = true
+jni = "0.21.1"
once_cell = "1.17.1"
-tokio = { version = "1", features = ["full"] }
-
+tokio = { version = "1.28.1", features = ["full"] }
num_cpus = "1.15.0"
diff --git a/bindings/java/readme.md b/bindings/java/README.md
similarity index 58%
rename from bindings/java/readme.md
rename to bindings/java/README.md
index 638ca3babf6f..1ec380decb0d 100644
--- a/bindings/java/readme.md
+++ b/bindings/java/README.md
@@ -1,3 +1,13 @@
+# OpenDAL Java Bindings
+
+## Build and test
+
+Following the command below to build `opendal-java` and run the tests:
+
+```shell
+mvn clean verify
+```
+
## Todos
- [ ] Readme for usage
@@ -5,4 +15,4 @@
- [ ] Exceptions need polish to conform Java files related interface.
- [ ] Cucumber test cases
- [ ] Experiment: Java doesn't support async/await hence using Kotlin to implement async related API.
-- [ ] Cross platform build for release build.
\ No newline at end of file
+- [ ] Cross-platform build for release build.
diff --git a/bindings/java/pom.xml b/bindings/java/pom.xml
index abe86ad936b0..70b4c44be821 100644
--- a/bindings/java/pom.xml
+++ b/bindings/java/pom.xml
@@ -25,14 +25,18 @@
4.0.0
org.apache.opendal
- java-binding
+ opendal-java
1.0-SNAPSHOT
- 8
- 8
+ 1.8
+ 1.8
UTF-8
- 1.0.0
+
+ 1.0.0
+
+ 3.0.0
+ 3.3.1
@@ -58,46 +62,43 @@
org.questdb
jar-jni
- ${rust-maven-plugin.version}
+ ${questdb.version}
+
io.cucumber
cucumber-java
test
-
io.cucumber
cucumber-junit-platform-engine
test
-
org.junit.platform
junit-platform-suite
test
-
org.junit.jupiter
junit-jupiter
test
-
-
+
+
+ src/test/resources
+ true
+
+
-
org.questdb
rust-maven-plugin
- ${rust-maven-plugin.version}
+ ${questdb.version}
opendal-java
@@ -105,9 +106,9 @@
build
- ../java
+ ${project.basedir}
true
- ${project.build.directory}/classes/org/apache/opendal/rust/libs
+ ${project.build.directory}/classes/native
true
--color=always
@@ -119,18 +120,14 @@
org.apache.maven.plugins
- maven-compiler-plugin
- 3.11.0
-
- UTF-8
-
- 1.8
-
+ maven-resources-plugin
+ ${maven-resources-plugin.version}
+
org.apache.maven.plugins
maven-surefire-plugin
- 3.0.0
+ ${maven-surefire-plugin.version}
diff --git a/bindings/java/src/lib.rs b/bindings/java/src/lib.rs
index 1d41d7c8af99..2da8a6af3c4b 100644
--- a/bindings/java/src/lib.rs
+++ b/bindings/java/src/lib.rs
@@ -19,7 +19,6 @@ use std::cell::RefCell;
use std::collections::HashMap;
use std::ffi::c_void;
use std::str::FromStr;
-use std::sync::Arc;
use jni::objects::JClass;
use jni::objects::JMap;
@@ -27,24 +26,20 @@ use jni::objects::JObject;
use jni::objects::JString;
use jni::objects::JThrowable;
use jni::objects::JValue;
-use jni::sys::jboolean;
-use jni::sys::jint;
-use jni::sys::jlong;
-use jni::sys::JNI_VERSION_1_8;
-use jni::JNIEnv;
-use jni::JavaVM;
+use jni::sys::{jboolean, jobject, JNI_VERSION_1_8};
+use jni::sys::{jint, jlong};
+use jni::{JNIEnv, JavaVM};
use once_cell::sync::OnceCell;
-use opendal::BlockingOperator;
-use opendal::Operator;
-use opendal::Scheme;
use tokio::runtime::Builder;
use tokio::runtime::Runtime;
-static mut RUNTIME: OnceCell = OnceCell::new();
+use opendal::Operator;
+use opendal::Scheme;
+use opendal::{BlockingOperator, ErrorKind};
+static mut RUNTIME: OnceCell = OnceCell::new();
thread_local! {
- static JAVA_VM: RefCell