Получить версию файла .exe в java для Linux - PullRequest
0 голосов
/ 10 июля 2019

Вопрос - Получить версию файла .exe в java для Linux для какого-то странного клиента.

Решение -

Я использовал библиотеку JNA для чтения версии файла с использованием Java. Приведенный ниже код работает нормально на платформе Windows, но выдает ошибку ниже на образе Linux-докера.

"Невозможно загрузить библиотеку" версия ": Ошибка загрузки общей библиотеки libversion.so: Нет такого файла или каталога Ошибка загрузки общей библиотеки libversion.so: Нет такого файла или каталога Собственная библиотека (linux-x86-64 / libversion.so ) не найден в пути к ресурсу .. ".

private String GetFileVersion(String filePath) {

    File fileToCheck = new File(filePath);
    short[] rtnData = new short[4];


    int infoSize = Version.INSTANCE.GetFileVersionInfoSize(fileToCheck.getAbsolutePath(), null);
    Pointer buffer = Kernel32.INSTANCE.LocalAlloc(WinBase.LMEM_ZEROINIT, infoSize);

    try {

        Version.INSTANCE.GetFileVersionInfo(fileToCheck.getAbsolutePath(), 0, infoSize, buffer);
        IntByReference outputSize = new IntByReference();
        PointerByReference pointer = new PointerByReference();
        Version.INSTANCE.VerQueryValue(buffer, "\\", pointer, outputSize);
        VerRsrc.VS_FIXEDFILEINFO fileInfoStructure = new VerRsrc.VS_FIXEDFILEINFO(pointer.getValue());

        rtnData[0] = (short) (fileInfoStructure.dwFileVersionMS.longValue() >> 16);
        rtnData[1] = (short) (fileInfoStructure.dwFileVersionMS.longValue() & 0xffff);
        rtnData[2] = (short) (fileInfoStructure.dwFileVersionLS.longValue() >> 16);
        rtnData[3] = (short) (fileInfoStructure.dwFileVersionLS.longValue() & 0xffff);

        return String.format("%s.%s.%s.%s", rtnData[0], rtnData[1], rtnData[2], rtnData[3]);

    } catch (Exception exception) {

        return null;

    } finally {
        Kernel32.INSTANCE.GlobalFree(buffer);
    }
}

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Я думаю, что наконец-то понял, что вы делаете.

Version, который вы используете, на самом деле происходит из пакета com.sun.jna.platform.win32.Он не является частью библиотеки JNA (jna.jar).Я думаю, что это на самом деле часть jna-platform.jar.Если я правильно понимаю, то это сгенерированная библиотека JNA-адаптера для Windows COM dll.

Если я правильно понял, вам действительно понадобятся собственные библиотеки Windows COM, скомпилированные и собранные для платформы Linux, чтобы делать то, чтоВы пытаетесь это сделать.

AFAIK, это невозможно.

Так как вы могли бы заставить эту работу?В основном вам необходимо выполнить одно из следующих действий:

  • Найти существующую библиотеку pure Java для извлечения информации о версии из файла Windows .exe.Я не думаю, что вы, вероятно, найдете его.

  • Найдите спецификацию для формата файлов Windows ".exe" и напишите свой собственный код Java для извлечения информации о версии.Я не искал спецификации, чтобы увидеть, сколько это будет стоить.

Тогда вы переписываете код, который вы добавили в свой вопрос для использования альтернативного API.


Файл "libversion", который я упоминал в моем другом ответе, не имеет значения.Это что-то еще.Это красная сельдь.

0 голосов
/ 10 июля 2019

Я начну с ответа на вопрос, который вы задали, хотя я сомневаюсь, что это то, что вам действительно нужно знать.

Типы различных форматов исполняемых файлов кодируются в первых нескольких байтах файла.Например, ELF-файлы (исполняемые файлы, общие библиотеки) описаны на этой странице Википедии.

Таким образом, существует несколько способов узнать, какой тип исполняемого файла в Java:

  1. Напишите некоторый код, который читает первые несколько байтов и декодирует информацию заголовка файла в соответствии с форматом, описанным в ссылке на Википедию выше.
  2. Найдите существующую библиотеку Java, которая делает это, и отработайтекак это сделать(Поищите в Google «волшебную библиотеку файлов Java» и посмотрите, что вы можете найти.)
  3. Прочитайте о команде Linux file и напишите некоторый код Java для запуска file в каждой библиотеке и проанализируйте вывод.

То, что вам нужно на самом деле , нужно сделать немного по-другому:

  1. Найдите файл или файлы в файловой системе, которыеJava ищет: по всей видимости libversion.so или linux-x86-64/libversion.so.(Файл вполне может быть символической ссылкой. Перейдите по нему.)
  2. Запустите file для каждого файла, чтобы убедиться, что это правильный тип библиотеки.Они должны быть 32- или 64-битными , соответствующими JVM, с которой вы работаете , и правильными ABI и ISA для платформы.
  3. Убедитесь, что файлы находятся там, где JVM ожидает их найти.JVM ищет библиотеки в каталогах, перечисленных в системном свойстве «java.library.path».Вы можете (при необходимости) установить путь с помощью опции -Djava.library.path=... JVM.

См. "java.library.path - что это такое и как использовать" для получения дополнительной информации.информация о загрузке библиотеки.

(Нет необходимости выполнять шаг 2 «из» или «в» Java.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...