【问题标题】:Eclipse cannot load SWT librariesEclipse 无法加载 SWT 库
【发布时间】:2012-04-27 06:50:42
【问题描述】:

每次我尝试在 Ubuntu 12.04 中打开 Eclipse 时,都会收到 Unsatisfied Link 错误,并且无法打开。我最近安装了 java JDK 和 Android SDK,这可能是问题吗?我关注了this tutorial

这是日志信息:

!SESSION 2012-04-15 21:05:46.902 -----------------------------------------------
eclipse.buildId=I20110613-1736
java.version=1.7.0
java.vendor=Oracle Corporation
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=en_GB
Command-line arguments:  -os linux -ws gtk -arch x86_64

!ENTRY org.eclipse.osgi 4 0 2012-04-15 21:05:47.885
!MESSAGE Application error
!STACK 1
java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons: 
no swt-gtk-3740 in java.library.path
no swt-gtk in java.library.path
Can't load library: /home/tom/.swt/lib/linux/x86_64/libswt-gtk-3740.so
Can't load library: /home/tom/.swt/lib/linux/x86_64/libswt-gtk.so

at org.eclipse.swt.internal.Library.loadLibrary(Library.java:285)
at org.eclipse.swt.internal.Library.loadLibrary(Library.java:194)
at org.eclipse.swt.internal.C.<clinit>(C.java:21)
at org.eclipse.swt.internal.Converter.wcsToMbcs(Converter.java:63)
at org.eclipse.swt.internal.Converter.wcsToMbcs(Converter.java:54)
at org.eclipse.swt.widgets.Display.<clinit>(Display.java:132)
at org.eclipse.ui.internal.Workbench.createDisplay(Workbench.java:695)
at org.eclipse.ui.PlatformUI.createDisplay(PlatformUI.java:161)
at org.eclipse.ui.internal.ide.application.IDEApplication.createDisplay(IDEApplication.java:153)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:95)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
at org.eclipse.equinox.launcher.Main.main(Main.java:1386)

我已尝试卸载并重新安装,并删除了~/.eclipse 目录,但仍然无法正常工作

【问题讨论】:

  • 我必须说你的库路径看起来很奇怪。这些 .so 文件不应该在 eclipse/plugins 文件夹中的某个地方,在一个爆炸的 jar 中吗?你还有这样的目录吗(~/.swt/lib/...)?
  • 你安装了 libswt-java-gtk3 吗?
  • 虽然这在下面得到了回答,但似乎这仍然是 Ubuntu 安装系统中应该提出的一个错误,因为即使我使用 aptitude/apt-get 卸载并重新安装 eclipse,它仍然存在。如果有指向该问题的链接,最好在此处提供,以便人们对其进行投票。

标签: java eclipse ubuntu unsatisfiedlinkerror


【解决方案1】:

我在 debian linux amd64 上。我从 oracle 的 java 下载页面安装了 oracle 的 Java 11。从 eclipse.org 安装 eclipse。运行 eclipse 产生“无法加载 swt”错误。我听从了 Atorras 的建议并做了 apt install libswt-gtk-4-jni(它还安装了很多其他东西),然后 eclipse 开始了。虽然它开始了,但我确实收到了以下错误/警告:

org.eclipse.m2e.logback.configuration: The org.eclipse.m2e.logback.configuration bundle was activated before the state location was initialized.  Will retry after the state location is initialized.
SWT SessionManagerDBus: Failed to connect to org.gnome.SessionManager: Failed to execute child process “dbus-launch” (No such file or directory)
SWT SessionManagerDBus: Failed to connect to org.xfce.SessionManager: Failed to execute child process “dbus-launch” (No such file or directory)
org.eclipse.m2e.logback.configuration: Logback config file: /home/rusty/eclipse-workspace/.metadata/.plugins/org.eclipse.m2e.logback.configuration/logback.1.16.0.20200318-1040.xml
org.eclipse.m2e.logback.configuration: Initializing logback
SWT Webkit: Warning, You are using an old version of webkitgtk. (pre 2.4) BrowserFunction functionality will not be avaliable
SWT WebKit: error initializing DBus server, dBusServer == 0
SWT.CHROMIUM style was used but chromium.swt gtk (or CEF binaries) fragment/jar is missing.

我想我可以忽略大部分,如果不是全部的话。我在我的 Windows 电脑上使用 mobaXterm 对 linux 框进行 ssh,所以它在我的电脑上显示它的窗口。我的 linux 盒子是无头的。

【讨论】:

    【解决方案2】:

    对于适用于 Linux 的 Windows 子系统 (WSL),您需要

    apt install libswt-gtk-4-jni
    

    如果您没有 OpenJDK 8,您还需要

    apt install openjdk-8-jdk
    

    【讨论】:

      【解决方案3】:

      我安装了 JDK 32 位,因为我收到了错误。安装JDK 64位后http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html jdk-8u131-linux-x64.tar.gz(请下载64位版本) 并下载 64 位“eclipse-inst-linux64.tar.gz”。

      【讨论】:

        【解决方案4】:

        一个可能更通用的方法是:

        • 安装非无头版本的openjdk,
        • 安装、运行和关闭 eclipse。
        • 卸载openjdk
        • 安装oracle的JDK

        【讨论】:

          【解决方案5】:

          在 redhat7 上:

          yum install gtk2 libXtst xorg-x11-fonts-Type1
          

          因为 swt 依赖而完成了这项工作。

          找到here

          【讨论】:

            【解决方案6】:

            就我而言,我完全错过了/usr/lib/jni 目录。修复者

            sudo apt-get install libswt-gtk-3-jni libswt-gtk-3-java
            

            之后无需符号链接。 Eclipse正常启动。

            【讨论】:

            • 安装 jni 后。我使用此命令复制了 32 位文件:ln -s /usr/lib/jni/libswt-* ~/.swt/lib/linux/x86/
            • 就我而言,我需要 sudo apt-get install libswt-gtk-4-jni libswt-gtk-4-java
            • @padman 复制由包管理(在本例中为 APT)安装的文件不是一个好主意。复制的文件不会在包管理下,当包管理下的文件升级时,您可能会遇到各种其他错误。相反,找到一种方法将您的 Eclipse 指向这些库的正确位置(参见上面 dzlatkov 的答案)。
            【解决方案7】:

            我在尝试在 64 位 Linux 下启动 Eclipse 的 32 位构建时遇到了这个错误。安装 ia32-libs 包后问题解决。

            【讨论】:

              【解决方案8】:

              只需指定库的路径:

              echo "-Djava.library.path=/usr/lib/jni/" >> /etc/eclipse.ini
              

              【讨论】:

              • 看来这是最干净的解决方案了。
              • 同意,最干净,这种方法将永久避免 Ubuntu 系统上容易发生 Java 版本更改的错误 - 考虑到 OpenJDK 升级以重新配置 Java 相关文件位置的副作用
              • 确实在 Ubuntu 64 位 Cleanest 解决方案上为我工作,我建议任何人选择此解决方案而不是创建符号链接
              • 如果您使用 oracle java 7 且未打开 JDK,则可以使用此方法
              • 投票最多的答案有效,但不适用于“sudo eclipse”。这个答案是优越的,它适用于所有情况!
              【解决方案9】:

              我同意 Scott 的观点,他列出的内容很有效。但是,仅从任何目录运行它都不起作用。我不得不 cd 到 /home/*/.swt/lib/linux/x86_64/ 0 个文件

              先目录再运行链接命令:

              对于 32 位:

              ln -s /usr/lib/jni/libswt-* ~/.swt/lib/linux/x86/
              

              在 Ubuntu 12.04 64 位上:

              ln -s /usr/lib/jni/libswt-* ~/.swt/lib/linux/x86_64/
              

              【讨论】:

                【解决方案10】:

                请确保您的主分区挂载了可执行权限。这是默认设置,但如果您碰巧在没有 exec 选项的情况下挂载它,则会收到此错误。

                【讨论】:

                  【解决方案11】:

                  如果您使用 oracle java 启动 eclipse,则 eclipse 可能无法找到 SWT 或 SVN 库等本地库。 SWT-JNI 库位于 /usr/lib/jni/,SVN-JNI 库位于 /usr/lib/x86_64-linux-gnu/jni/。

                  而不是用命令启动eclipse

                  eclipse
                  

                  你可以使用命令

                  env LD_LIBRARY_PATH=/usr/lib/jni/:/usr/lib/x86_64-linux-gnu/jni/:$LD_LIBRARY_PATH eclipse
                  

                  将环境变量 LD_LIBRARY_PATH 传递给 eclipse。 Eclipse 将找到本机库并正常运行。

                  【讨论】:

                  • 这给了我这个错误Java HotSpot(TM) 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0 WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by org.eclipse.osgi.internal.baseadaptor.BaseStorage (file:/usr/lib/eclipse/plugins/org.eclipse.osgi_3.8.1.dist.jar) to method java.net.URLClassLoader.addURL(java.net.URL) WARNING: Please consider reporting this to the maintainers of org.eclipse.osgi.internal.baseadaptor.BaseStorage我该如何解决?
                  【解决方案12】:

                  在我的 Ubuntu 12.04 32 位上。我将命令编辑为:

                  ln -s /usr/lib/jni/libswt-* ~/.swt/lib/linux/x86/
                  

                  在 Ubuntu 12.04 64 位上试试:

                  ln -s /usr/lib/jni/libswt-* ~/.swt/lib/linux/x86_64/
                  

                  【讨论】:

                  • 我完全按照您的方式执行了该命令,并且成功了!带有 Oracle Java 7 的 Ubuntu 12.04
                  • 我更喜欢这种方法,因为我必须将 Oracle Java 7 用于项目
                  • 谢谢。我的道路略有不同,但这为我解决了问题。 ln -s /usr/lib/jni/libswt-* ~/.swt/lib/linux/x86/
                  • 这是我第二次这样做:几个月前在我的工作计算机上一次,现在在我的家用计算机上,两次都是在使用 Eclipse 几个月后没有出现任何问题. swt 库会消失有什么特别的原因吗?
                  • 这是真正的救星!注意 ARM 上的任何人(比如我在 Chromebook 上运行 Eclipse)都应该用“arm”替换“x86”,否则它将无法工作!
                  【解决方案13】:

                  已解决:

                  因为我安装了 Oracle Java 7,所以将默认 Java 更改为 Oracle Java 7,但它必须是 Open JDK。

                  要修复,打开终端并输入

                  sudo update-alternatives --config java
                  

                  这会列出不同类型的 Java。只需选择 Open JDK。

                  【讨论】:

                  • 但是,如果您想在 Eclipse 中使用 Oracle Java,而不是 Open JDK,该怎么做呢?谢谢!
                  • 这是因为 Oracle Java 7 不再在 Jars 中寻找本机库了吗?我在带有 Java 7 的 Windows 上也有同样的问题。 swt 程序过去可以正常工作
                  • 为我工作的 linux mint maya。
                  • 当然,如果您更喜欢 FOSS,OpenJDK 是首选平台,但是(与这些企业 troglodytes 一样)Oracle 在其版本中施加了某些挂钩,阻止了某些应用程序的移植(以及大多数 java webstart应用程序)Java 平台之间。这违背了 Java 的主要目标,即可移植性,这就是为什么他们通过练习供应商锁定来自取其辱...... Python 万岁!万岁!
                  【解决方案14】:
                  无法加载库:/home/tom/.swt/lib/linux/x86_64/libswt-gtk-3740.so 无法加载库:/home/tom/.swt/lib/linux/x86_64/libswt-gtk.so

                  看起来图书馆应该在 .swt/lib/linux/x86_64/ 如果没有你可以 试试这个命令:

                  找到 libswt-gtk.so

                  这应该找到库将整个目录复制到/home/tom/.swt/lib/linux/x86_64

                  【讨论】:

                  猜你喜欢
                  • 2018-05-22
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-04-20
                  • 2023-03-15
                  • 2013-06-07
                  • 1970-01-01
                  • 2014-01-30
                  • 2012-12-07
                  相关资源
                  最近更新 更多