Как я могу встроить JAR-файл драйвера Aeron в программу на Rust и запустить его позже?

У меня есть программа на Rust, которая использует Aeron через aeron-rs ящик.

Каждый раз, когда я хочу запустить свою программу, мне нужно сначала вручную запустить драйвер. На самом деле в крейте прямо указано, что он работает просто как оболочка для работающего драйвера.

Я хотел бы, чтобы драйвер запускался при запуске моей программы.

Я знаю, что 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");
}

Я не вижу банку в папке сборки.

Затем следующий код должен запускать драйвер при запуске:

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?


person digital illusion    schedule 11.01.2021    source источник
comment
Вы можете перечитать документацию по include_bytes, чтобы понять, что он делает.   -  person Shepmaster    schedule 11.01.2021
comment
Я понимаю, что включение jar в бинарник - неправильный путь. У вас есть предложение о том, как я должен сделать это вместо этого?   -  person digital illusion    schedule 11.01.2021


Ответы (1)


Мне пришлось извлечь байты во временный файл 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())
}
person digital illusion    schedule 11.01.2021