Eclipse:设置引用插件中包含的文件夹的环境变量

Eclipse: Setting an environment variable that references a folder contained in a plugin

我有一些 Java 代码可以包装现有的本机应用程序并执行以下操作:

  1. 接受用户的一些输入
  2. 执行本机应用程序,提供第 1 步中的输入作为参数
  3. 对步骤 2 中生成的输出文件执行更多操作

步骤 2 中的本机应用程序需要一些动态库。因此,在 运行 Configurations -> Environment 下,我设置了以下变量来引用库。

DYLD_LIBRARY_PATH = ${project_loc}/path/to/libs
DYLD_FALLBACK_LIBRARY_PATH = ${project_loc}/path/to/libs

到目前为止一切正常。现在我已经将我的代码和现有的本机应用程序打包为 Eclipse 插件。每当我尝试 运行 插件中的代码时,我都会收到以下错误:

dyld: Library not loaded: libsrcml.dylib
Referenced from: workspace/Project/src/nativeApp
Reason: image not found 

据我了解,发生这种情况是因为我之前设置的环境变量引用了 {$project_loc},这是我的 Eclipse 项目的存储位置。现在,我的代码不再包含在该项目中,而是包含在一个插件中,因此变量的路径不再有效。问题是,如何设置引用插件中文件夹的路径?或者,是否有可能以某种方式在我的 Java 代码中动态加载这些变量?

path variables用于指定文件系统中的固定位置。

要识别插件中的资源,我会使用其 URL

案例 1: Platform.getBundle("").getEntry("")

Bundle bundle = Platform.getBundle("your.bundle.id");
URL url = bundle.getEntry("yourDir/yourFile.txt");
File f = new File(FileLocator.resolve(url).toURI());

案例 2:平台 URL 到您的资源:

url = new URL("platform:/plugin/your.bundle.id/yourDir/yourFile.txt");
File f = new File(FileLocator.resolve(url).toURI());

感谢 Vogella 提供此提示。

但是, 对于您插件中的库来说有点不同,因为 System.loadLibrary("libname") 必须能够解析您的库。

如果您在插件中发布和使用本机库,请将您的插件打包为目录,而不是压缩的 jar 文件。 所以编辑你的插件 MANIFEST.MF 并设置你的 Eclipse-BundleShape: dir

Eclipse-BundleShape: dir

然后,您的插件将被打包为一个文件夹,然后您有责任让您的 Native 库进行交互。通常这取决于本地库如何相互链接,以及您的 Java-to-native 框架如何设置搜索路径。

我的简单解决方案, 是将所有本机库放入 Eclipse 可执行文件的根文件夹,即 Java 执行目录,这样我就可以得到该路径使用 "user.dir" 环境变量,如下所示:

System.getProperty("user.dir");

然后,当所有本地人都在同一个文件夹中时,他们可以毫无问题地相互引用。

同时检查这些资源: