88 lines
2.9 KiB
Rust
88 lines
2.9 KiB
Rust
use std::{fs, path::PathBuf};
|
|
|
|
use j4rs::{JvmBuilder, MavenArtifactRepo, MavenSettings};
|
|
|
|
pub fn setup_java(base: PathBuf) {
|
|
let resources = base.join("resources");
|
|
let deps = resources.join("deps");
|
|
|
|
let mut java_path = base.clone();
|
|
java_path.pop();
|
|
let java_path = java_path.join("java");
|
|
|
|
let patchbukkit_jar = java_path
|
|
.join("patchbukkit")
|
|
.join("build")
|
|
.join("libs")
|
|
.join("patchbukkit.jar");
|
|
|
|
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())
|
|
&& 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)
|
|
.java_opts(vec![
|
|
j4rs::JavaOpt::new("--enable-native-access=ALL-UNNAMED"),
|
|
j4rs::JavaOpt::new("--enable-final-field-mutation=ALL-UNNAMED"),
|
|
j4rs::JavaOpt::new("--add-opens=java.base/java.lang=ALL-UNNAMED"),
|
|
j4rs::JavaOpt::new("--add-opens=java.base/java.lang.reflect=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();
|
|
|
|
if !&patchbukkit_jar.exists() {
|
|
panic!(
|
|
"Failed to find patchbukkit.jar, build the java library first by running `gradle build` in the java directory!"
|
|
);
|
|
}
|
|
|
|
fs::create_dir_all(&jassets).unwrap();
|
|
|
|
let cdylib = std::env::var("CARGO_CDYLIB_FILE_J4RS").unwrap();
|
|
let cdylib = PathBuf::from(cdylib);
|
|
|
|
let mut cdylib_to = deps;
|
|
fs::create_dir_all(&cdylib_to).unwrap();
|
|
|
|
let original_name = cdylib.file_name().unwrap().to_string_lossy();
|
|
let mut target_name = original_name.split('-').next().unwrap().to_string();
|
|
if !target_name.ends_with(".dll")
|
|
&& !target_name.ends_with(".so")
|
|
&& !target_name.ends_with(".dylib")
|
|
&& let Some(ext) = cdylib.extension()
|
|
{
|
|
target_name = format!("{target_name}.{}", ext.to_string_lossy());
|
|
}
|
|
|
|
cdylib_to.push(target_name);
|
|
|
|
fs::copy(&cdylib, &cdylib_to)
|
|
.map_err(|err| format!("Failed to copy j4rs native lib: {err:?}"))
|
|
.unwrap();
|
|
}
|