如何将 Aeron 驱动程序 JAR 嵌入到 Rust 程序中并稍后启动它?
How can I embed the Aeron driver JAR in a Rust program and start it later?
我有一个使用 Aeron through the aeron-rs crate 的 Rust 程序。
每次我想运行我的程序,我都需要先手动启动驱动程序。事实上,包装箱明确指出它只是作为 运行ning 驱动程序的包装器工作。
我希望驱动程序在启动我的程序时启动。
我知道 Aeron 提供了一个嵌入式驱动程序,但我不知道如何集成它。
到目前为止,我已经将嵌入式驱动程序 JAR 放在我的 src 文件夹中
my-project/
src/
aeron-all-1.32.0-SNAPSHOT.jar
我使用 include_bytes!
宏尝试在构建中包含 JAR
fn main() {
include_bytes!("aeron-all-1.32.0-SNAPSHOT.jar");
}
我在构建文件夹中没有看到 jar。
那么,下面的代码应该运行驱动启动时:
if cfg!(target_os = "windows") {
Command::new("cmd")
.args(&[
"/C",
"%JAVA_HOME%\bin\java \
-cp aeron-all-1.32.0-SNAPSHOT.jar \
%JVM_OPTS% io.aeron.driver.MediaDriver %*",
])
.output()
.expect("Failed to execute external process.")
} else {
Command::new("sh")
.arg("-c")
.arg(
"${JAVA_HOME}/bin/java \
-cp aeron-all-1.32.0-SNAPSHOT.jar \
${JVM_OPTS} io.aeron.driver.MediaDriver \"$@\"",
)
.output()
.expect("Failed to execute external process.")
};
这是 运行 jar 文件的正确方法吗?
我不得不将字节提取到一个临时 JAR 文件中,我能够 运行 这样的 JAR
fn main() -> std::io::Result<()> {
let driver_path = extract_driver();
if cfg!(target_os = "windows") {
let mut command = String::from("%JAVA_HOME%\bin\java -cp ");
command.push_str(driver_path.as_str());
command.push_str("%JVM_OPTS% io.aeron.driver.MediaDriver %*");
Command::new("cmd")
.args(&["/C", command.as_str()])
.spawn()
.expect("Error spawning Aeron driver process")
} else {
let mut command = String::from("${JAVA_HOME}/bin/java -cp ");
command.push_str(driver_path.as_str());
command.push_str("${JVM_OPTS} io.aeron.driver.MediaDriver \"$@\"");
Command::new("sh")
.arg("-c")
.arg(command.as_str())
.spawn()
.expect("Error spawning Aeron driver process")
};
}
fn extract_driver() -> String {
let bytes = include_bytes!("aeron-all-1.32.0-SNAPSHOT.jar");
let mut driver_path = temp_dir();
driver_path.push("aeron-driver.jar");
let mut file = File::create(driver_path.to_owned()).expect("Error extracting Aeron driver jar");
file.write_all(bytes).unwrap();
String::from(driver_path.to_str().unwrap())
}
我有一个使用 Aeron through the aeron-rs crate 的 Rust 程序。
每次我想运行我的程序,我都需要先手动启动驱动程序。事实上,包装箱明确指出它只是作为 运行ning 驱动程序的包装器工作。
我希望驱动程序在启动我的程序时启动。
我知道 Aeron 提供了一个嵌入式驱动程序,但我不知道如何集成它。
到目前为止,我已经将嵌入式驱动程序 JAR 放在我的 src 文件夹中
my-project/
src/
aeron-all-1.32.0-SNAPSHOT.jar
我使用 include_bytes!
宏尝试在构建中包含 JAR
fn main() {
include_bytes!("aeron-all-1.32.0-SNAPSHOT.jar");
}
我在构建文件夹中没有看到 jar。
那么,下面的代码应该运行驱动启动时:
if cfg!(target_os = "windows") {
Command::new("cmd")
.args(&[
"/C",
"%JAVA_HOME%\bin\java \
-cp aeron-all-1.32.0-SNAPSHOT.jar \
%JVM_OPTS% io.aeron.driver.MediaDriver %*",
])
.output()
.expect("Failed to execute external process.")
} else {
Command::new("sh")
.arg("-c")
.arg(
"${JAVA_HOME}/bin/java \
-cp aeron-all-1.32.0-SNAPSHOT.jar \
${JVM_OPTS} io.aeron.driver.MediaDriver \"$@\"",
)
.output()
.expect("Failed to execute external process.")
};
这是 运行 jar 文件的正确方法吗?
我不得不将字节提取到一个临时 JAR 文件中,我能够 运行 这样的 JAR
fn main() -> std::io::Result<()> {
let driver_path = extract_driver();
if cfg!(target_os = "windows") {
let mut command = String::from("%JAVA_HOME%\bin\java -cp ");
command.push_str(driver_path.as_str());
command.push_str("%JVM_OPTS% io.aeron.driver.MediaDriver %*");
Command::new("cmd")
.args(&["/C", command.as_str()])
.spawn()
.expect("Error spawning Aeron driver process")
} else {
let mut command = String::from("${JAVA_HOME}/bin/java -cp ");
command.push_str(driver_path.as_str());
command.push_str("${JVM_OPTS} io.aeron.driver.MediaDriver \"$@\"");
Command::new("sh")
.arg("-c")
.arg(command.as_str())
.spawn()
.expect("Error spawning Aeron driver process")
};
}
fn extract_driver() -> String {
let bytes = include_bytes!("aeron-all-1.32.0-SNAPSHOT.jar");
let mut driver_path = temp_dir();
driver_path.push("aeron-driver.jar");
let mut file = File::create(driver_path.to_owned()).expect("Error extracting Aeron driver jar");
file.write_all(bytes).unwrap();
String::from(driver_path.to_str().unwrap())
}