diff --git a/java/patchbukkit/build.gradle.kts b/java/patchbukkit/build.gradle.kts index 13169ee..518479c 100644 --- a/java/patchbukkit/build.gradle.kts +++ b/java/patchbukkit/build.gradle.kts @@ -47,7 +47,7 @@ repositories { dependencies { implementation("io.papermc.paper:paper-api:26.2.build.87-stable") implementation("net.sf.jopt-simple:jopt-simple:6.0-alpha-3") - implementation("io.github.astonbitecode:j4rs:0.25.0") + implementation("io.github.astonbitecode:j4rs:0.25.2") implementation("org.apache.maven:maven-resolver-provider:3.9.6") implementation("org.apache.maven.resolver:maven-resolver-impl:1.9.18") implementation("org.apache.maven.resolver:maven-resolver-connector-basic:1.9.18") diff --git a/rust/build/java.rs b/rust/build/java.rs index 13ed36e..9db97f7 100644 --- a/rust/build/java.rs +++ b/rust/build/java.rs @@ -1,6 +1,6 @@ use std::{fs, path::PathBuf}; -use j4rs::{JvmBuilder, LocalJarArtifact, MavenArtifactRepo, MavenSettings}; +use j4rs::{JvmBuilder, MavenArtifactRepo, MavenSettings}; pub fn setup_java(base: PathBuf) { let resources = base.join("resources"); @@ -16,16 +16,37 @@ pub fn setup_java(base: PathBuf) { .join("libs") .join("patchbukkit.jar"); - let jvm = JvmBuilder::new() + let jassets = resources.join("jassets"); + let mut classpath_entries = Vec::new(); + + if let Ok(entries) = fs::read_dir(&jassets) { + for entry in entries.flatten() { + let path = entry.path(); + if let Some(filename) = path.file_name().and_then(|n| n.to_str()) { + if filename.starts_with("j4rs") && filename.ends_with(".jar") { + classpath_entries.push(j4rs::ClasspathEntry::new(&path)); + } + } + } + } + + let mut jvm_builder = JvmBuilder::new(); + let mut jvm_builder = jvm_builder .with_maven_settings(MavenSettings::new(vec![MavenArtifactRepo::from( "papermc::https://repo.papermc.io/repository/maven-public/", )])) .skip_setting_native_lib() - .with_base_path(resources) + .with_base_path(&resources) .java_opts(vec![ j4rs::JavaOpt::new("--enable-native-access=ALL-UNNAMED"), j4rs::JavaOpt::new("-Dcom.google.protobuf.useUnsafe=false"), - ]) + ]); + + for entry in classpath_entries { + jvm_builder = jvm_builder.classpath_entry(entry); + } + + let _jvm = jvm_builder .build() .map_err(|err| format!("jvm failed to init: {err:?}")) .unwrap(); @@ -36,7 +57,10 @@ pub fn setup_java(base: PathBuf) { ); } - jvm.deploy_artifact(&LocalJarArtifact::new(&patchbukkit_jar.to_string_lossy())) + fs::create_dir_all(&jassets).unwrap(); + let dest_jar = jassets.join("patchbukkit.jar"); + fs::copy(&patchbukkit_jar, &dest_jar) + .map_err(|err| format!("Failed to copy patchbukkit.jar to jassets: {err:?}")) .unwrap(); let cdylib = std::env::var("CARGO_CDYLIB_FILE_J4RS").unwrap(); diff --git a/rust/src/java/jvm/worker.rs b/rust/src/java/jvm/worker.rs index 350618d..80c6029 100644 --- a/rust/src/java/jvm/worker.rs +++ b/rust/src/java/jvm/worker.rs @@ -209,13 +209,31 @@ impl JvmWorker { fn initialize_jvm(&mut self, j4rs_path: &PathBuf) -> anyhow::Result<()> { tracing::info!("Initializing JVM with path: {j4rs_path:?}"); - let jvm = JvmBuilder::new() - .with_base_path(j4rs_path) - .java_opts(vec![ - j4rs::JavaOpt::new("--enable-native-access=ALL-UNNAMED"), - j4rs::JavaOpt::new("-Dcom.google.protobuf.useUnsafe=false"), - ]) - .build()?; + let jassets = j4rs_path.join("jassets"); + let mut classpath_entries = Vec::new(); + + if let Ok(entries) = std::fs::read_dir(&jassets) { + for entry in entries.flatten() { + let path = entry.path(); + if let Some(filename) = path.file_name().and_then(|n| n.to_str()) { + if filename.starts_with("j4rs") && filename.ends_with(".jar") { + classpath_entries.push(j4rs::ClasspathEntry::new(&path)); + } + } + } + } + + let mut jvm_builder = JvmBuilder::new(); + let mut jvm_builder = jvm_builder.with_base_path(j4rs_path).java_opts(vec![ + j4rs::JavaOpt::new("--enable-native-access=ALL-UNNAMED"), + j4rs::JavaOpt::new("-Dcom.google.protobuf.useUnsafe=false"), + ]); + + for entry in classpath_entries { + jvm_builder = jvm_builder.classpath_entry(entry); + } + + let jvm = jvm_builder.build()?; initialize_callbacks(&jvm)?;