背景:
我目前正在 Linux 虚拟机中使用一些 Java 插件,通过将它们放入 中,我将它们安装到 Eclipse 中。/opt/eclipse/dropins 文件夹。我的插件需要同时支持 CentOS 6 和 CentOS 7 虚拟机(应该没什么大不了的,因为它们是用 Java 编写的,而且两种 CentOS 都安装了 Java 1.8.0)。我的插件在两个操作系统上构建和安装都很好。我在 Eclipse 中看到了它们,并且可以按预期与它们进行交互。
我需要支持的 VM 可以位于我的机器本地(使用 VMWare Player/Workstation 打开),也可以托管在云服务器上。我们使用 Windows 远程桌面通过 Linux 服务器上的 xrdp 进入云 VM。
问题:
我的一个插件需要 nddsjava.so 来自 /opt/rti_connext_dds-5.2.3/lib/x64Linux3gcc4.8.2 .
在两个本地虚拟机(CentOS 6 和 7)上,我可以在/etc/profile.d 脚本中设置 LD_LIBRARY_PATH 以便任何登录的用户都可以获得所需 C++ 库的路径。
然而,在 CentOS 7 云虚拟机上,当调用此插件时,我得到 java.lang.UnsatisfiedLinkError: no nddsjava in java.library.path
.发生这种情况仅限 通过 Linux 菜单打开 Eclipse 时。如果我打开一个终端并从那里启动 Eclipse,插件可以找到 C++ 库(因为我的 LD_LIBRARY_PATH 设置在我的/bin/bash 终端中)。我做了一点挖掘,发现运行 chmod g-s /usr/bin/ssh-agent
修复了从 Linux 菜单打开 Eclipse 时的问题(是的,我知道 chmod 会打开一个安全漏洞。我愿意跳过这个)。
在 CentOS 6 云虚拟机上,我从来没有找到 C++ 库的插件。通过 登录时,LD_LIBRARY_PATH 似乎被清除了xrdp 无论出于何种原因,CentOS 6 似乎明确没有在主要的顶级 gnome-session 进程中获取任何配置文件脚本,这意味着从 GUI 产生的其他进程也不会有 LD_LIBRARY_PATH。
我也试过添加-Djava.library.path
给我的eclipse.ini
文件没有运气。即使它位于同一目录中,它也会在下一个所需的 C++ 库上失败:java.lang.UnsatisfiedLinkError: /opt/rti_connext_dds-5.2.3/lib/x64Linux3gcc4.8.2/libnddsjava.so: libnddsc.so: cannot open shared object file: No such file or directory
问题:
是否有一个地方可以为我尝试支持的所有 Linux 风格(本地 CentOS 6、xrdp CentOS 6、本地 CentOS 7 和 xrdp CentOS 7)设置我的 LD_LIBRARY_PATH?
最佳答案
注:当我在下面说云虚拟机时,我的意思是服务器托管的虚拟机,我通过 xrdp 进入了 Windows-远程桌面。
This服务器故障的答案在 CentOS 6 云虚拟机中为我工作。 CentOS 7 云虚拟机没有 startwm.sh
/etc/xrdp
中的脚本.相反,它住在 /usr/libexec/xrdp
并且不包含 xinitrc
导致 CentOS 6 云虚拟机出现问题的行(在服务器故障链接中引用)。必须有其他东西在 CentOS 7 云虚拟机中删除 LD_LIBRARY_PATH 变量,所以我仍然需要执行 chmod g-s /usr/bin/ssh-agent
允许我的/etc/profile.d
启动时调用的脚本。
关于java - 通过 xrdp 登录时清除 LD_LIBRARY_PATH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48749389/