rust - 如何将Aeron驱动程序JAR嵌入Rust程序中,并在以后启动它?

标签 rust aeron

我有一个Rust程序,通过Aeron条板箱使用aeron-rs
每次我要运行程序时,都需要先手动启动驱动程序。实际上,该 crate 明确声明它只是作为运行中的驱动程序的包装器而工作。
我希望驱动程序在启动我的程序时启动。
我知道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())
}

关于rust - 如何将Aeron驱动程序JAR嵌入Rust程序中,并在以后启动它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65673906/

相关文章:

java - 如何清除 Aeron 过期的存档和快照文件?

java - 我看不到方法在哪里执行 Aeron 低延迟库

java - 如何在运行 Aeron 示例时设置 Aeron 订阅者和发布者数量限制

rust - 为什么 Rust 书中的多线程 Web 服务器示例无法编译?

rust - 为什么通过提取方法进行重构会触发借用检查器错误?

reference - 如何为对结构的引用实现 Add 特性?

if-statement - 我如何传播 Rust 中的错误?

rust - 如何将保存特征对象的结构克隆到 `Fn`