首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我怎样才能在一个Rust程序中嵌入并在以后启动它呢?

我怎样才能在一个Rust程序中嵌入并在以后启动它呢?
EN

Stack Overflow用户
提问于 2021-01-12 04:16:01
回答 1查看 105关注 0票数 2

我有一个通过aeron-rs板条箱使用Aeron的Rust程序。

每次我想运行我的程序时,我都需要先手动启动驱动程序。事实上,机箱显式地声明它只是作为运行的驱动程序的包装器工作。

我希望驱动程序在启动我的程序时启动。

我知道Aeron提供了一个嵌入式驱动程序,但我不知道如何集成它。

到目前为止,我已经将嵌入式驱动程序JAR放在我的src文件夹中

代码语言:javascript
复制
my-project/
   src/
      aeron-all-1.32.0-SNAPSHOT.jar

我使用了include_bytes!宏来尝试将JAR包含在构建中

代码语言:javascript
复制
fn main() {
    include_bytes!("aeron-all-1.32.0-SNAPSHOT.jar");
}

我在build文件夹中没有看到jar。

然后,下面的代码应该在启动时运行驱动程序:

代码语言:javascript
复制
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文件的正确方式吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-12 05:26:06

我必须将这些字节提取到一个临时JAR文件中,然后我才能运行这样的JAR

代码语言:javascript
复制
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())
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65673906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档