【发布时间】:2019-07-10 11:58:57
【问题描述】:
问题 - 在 Linux 上为一些奇怪的客户端获取 .exe 的文件版本。
解决方案 -
我使用 JNA 库来读取使用 Java 的文件版本。鉴于以下代码在 Windows 平台上运行良好,但在 Linux docker 映像上抛出以下错误。
“无法加载库'version':加载共享库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);
}
}
【问题讨论】:
-
"...没有这样的文件或目录..." 向我表明该文件的路径不正确或容器内不存在目标文件。从 Win 转到 *nix 文件路径可能会很痛苦。仔细检查资源的位置。
-
嘿@DavidJEddy,我不是Java/Linux 专家。你能帮我解决这个问题吗?这个“版本”类来自 JNA 库,我无法控制。
-
遗憾的是我不熟悉 JNA。尽管您似乎遇到的问题是文件路径/文件存在之一。应用程序正在查找文件,但该文件在给定位置不存在。
-
@DavidJEddy,你能删除否决票吗?我花了几个小时后发布了这个问题。
-
你对这个问题做了哪些研究?您是否有针对 Linux 编译的本机代码版本?它安装在你的 Linux 机器上吗?在 Linux 机器上查找
exe文件的用例是什么?这是什么程序的一部分?您的问题缺少很多信息。