1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
mod logger;
pub use logger::*;
mod error;
pub use error::*;
#[cfg(test)]
mod test {
const SLF4J_BINDING: &str = "https://repo1.maven.org/maven2/org/slf4j/slf4j-log4j12/1.7.9/slf4j-log4j12-1.7.9.jar";
const SLF4J_API: &str = "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.9/slf4j-api-1.7.9.jar";
const LOG4J: &str = "https://repo1.maven.org/maven2/log4j/log4j/1.2.9/log4j-1.2.9.jar";
use jni::{InitArgsBuilder, JNIVersion, JavaVM};
use lazy_static::lazy_static;
use std::path::PathBuf;
use std::sync::Mutex;
lazy_static! {
pub static ref JVM: Mutex<JavaVM> = {
let binding = download_jar(SLF4J_BINDING);
let api = download_jar(SLF4J_API);
let log4j = download_jar(LOG4J);
let jvm_args = InitArgsBuilder::new()
.version(JNIVersion::V8)
.option("-Xcheck:jni")
.option(&format!("-Djava.class.path={}", binding.to_str().expect("Failed to convert slf4j.jar path to &str")))
.option(&format!("-Djava.class.path={}", api.to_str().expect("Failed to convert slf4j.jar path to &str")))
.option(&format!("-Djava.class.path={}", log4j.to_str().expect("Failed to convert slf4j.jar path to &str")))
.build()
.unwrap();
let java_vm = JavaVM::new(jvm_args).expect("Failed to create JavaVM");
Mutex::new(java_vm)
};
}
fn download_jar(url: &str) -> PathBuf {
let tmpdir = tempfile::tempdir().expect("Failed to create temporary directory");
let response = reqwest::blocking::get(url).expect("Failed to donwload SLF4j");
let pathbuf = PathBuf::from(tmpdir.into_path()).join("slf4j.jar");
let mut dest = std::fs::File::create(&pathbuf).expect("Failed to create slf4j.jar");
let content = response
.bytes()
.expect("Failed to read response bytes");
std::io::copy(&mut &*content, &mut dest).expect("Failed to copy response bytes into slf4j.jar");
pathbuf
}
}