【问题标题】:Eclipse: Setting an environment variable that references a folder contained in a pluginEclipse:设置引用插件中包含的文件夹的环境变量
【发布时间】:2016-03-22 20:13:19
【问题描述】:

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

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

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

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 代码中动态加载这些变量?

【问题讨论】:

  • 您可能需要查看使用插件 MANIFEST.MF 中的“Bundle-NativeCode”条目。

标签: java eclipse eclipse-plugin eclipse-rcp


【解决方案1】:

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

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

案例一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 到本地框架如何设置搜索路径。

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

System.getProperty("user.dir");

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

也检查一下这些资源:

【讨论】:

  • 通过查看您提供的资源,我设法以System.loadLibrary("libname") 设法引用它的方式捆绑了该库。但是,由于我收到错误消息dyld: Library not loaded: libsrcml.dylib Reason: image not found,似乎本机应用程序仍然找不到它。您能否阐明Eclipse 可执行文件的根文件夹 的含义以及如何从那里引用库?
  • eclipse可执行文件的根文件夹是包含eclipse.exe的目录。在开发时,它是包含 Eclipse IDE 的文件夹。但是,如果您正在构建和发布 Eclipse RCP 产品,那么它就是包含“product”.exe 文件的文件夹。告诉我这是否清楚,以便我更新回复。
  • 很清楚,但我想找到一个解决方案,当我的插件用于标准 Eclipse 安装时也可以使用。
  • 解决方案取决于您的本地库如何相互引用。这不是 Eclipse 问题,但它取决于您使用哪个框架来访问您的库,以及您的本地库如何在路径上相互搜索。如前所述,简单的方法是将所有库放在根文件夹中。否则你需要用Bundle-Shape = dir来打包你的插件,所以插件是作为文件夹打开的,没有打包;然后注意这些库是如何相互链接的。
猜你喜欢
  • 2016-09-09
  • 2022-07-20
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 2018-03-01
  • 2014-02-15
  • 1970-01-01
相关资源
最近更新 更多