【问题标题】:How to execute jar in Mac OS X using SWT/Eclipse?如何使用 SWT/Eclipse 在 Mac OS X 中执行 jar?
【发布时间】:2011-11-19 14:58:20
【问题描述】:

我将 Java 更改为 32 位模式,以允许 SWT 运行,当我调试时,它运行良好。但是当我使用 Eclipse 导出 .jar 时,它会显示此错误。

我已经添加了 chmod 777。我做错了什么?

这是控制台结果:

20/11/2011 12:10:36 AM  [0x0-0x3d89d86].com.apple.JarLauncher[73111]    Exception in thread "main" 
20/11/2011 12:10:36 AM  [0x0-0x3d89d86].com.apple.JarLauncher[73111]    java.lang.UnsatisfiedLinkError: Cannot load 32-bit SWT libraries on 64-bit JVM
20/11/2011 12:10:36 AM  [0x0-0x3d89d86].com.apple.JarLauncher[73111]        at org.eclipse.swt.internal.Library.loadLibrary(Unknown Source)
20/11/2011 12:10:36 AM  [0x0-0x3d89d86].com.apple.JarLauncher[73111]        at org.eclipse.swt.internal.Library.loadLibrary(Unknown Source)
20/11/2011 12:10:36 AM  [0x0-0x3d89d86].com.apple.JarLauncher[73111]        at org.eclipse.swt.internal.C.<clinit>(Unknown Source)
20/11/2011 12:10:36 AM  [0x0-0x3d89d86].com.apple.JarLauncher[73111]        at org.eclipse.swt.widgets.Display.<clinit>(Unknown Source)
20/11/2011 12:10:36 AM  [0x0-0x3d89d86].com.apple.JarLauncher[73111]        at com.testing.SWTApp.main(SWTApp.java:54)

清单如下:

Manifest-Version: 1.0
Class-Path: .
Main-Class: com.testing.SWTApp 

【问题讨论】:

  • 控制台的错误信息是什么?
  • 如何查看清单文件?我什么也没做。
  • 使用控制台结果更新问题。
  • 要获取 MANIFEST.MF 文件,您需要从 jar 文件中提取它。例如unzip app.jar META-INF/*。您需要在您最喜欢的文本编辑器中查看该文件,以查看它是否具有 Main-Class 属性。从命令行执行应该类似于java -jar app.jar
  • 实际上在 Mac 上,您也可以使用open app.jar 从命令行启动,您的对话框和@Perception 所指的“控制台”是 /Applications/Utilities/Console.app 而不是终端.app

标签: java swt executable executable-jar


【解决方案1】:

试试这个:

java -d32 -XstartOnFirstThread -jar myapp.jar

-d32 选项将导致 VM 在 32 位模式下运行。 -XstartOnFirstThread 选项对于 SWT 应用程序是必需的。

【讨论】:

    【解决方案2】:

    问题在于执行构建的 jar 的不是 Eclipse,而是 Finder / java 启动器。您需要做的是转到/Applications/Utilities/Java Preferences.app 并重新排序(单击拖动),以便在 64 位版本之前选择您的 32 位版本。作为参考,我的看起来像这样:

    然后当您执行java -version(没有-d 参数)时,您将选择32 位JRE。当您双击 finder 中的 jar 或使用 open app.jar 时,它应该可以工作。

    【讨论】:

      【解决方案3】:
      20/11/2011 12:10:36 AM  [0x0-0x3d89d86].com.apple.JarLauncher[73111]    java.lang.UnsatisfiedLinkError: Cannot load 32-bit SWT libraries on 64-bit JVM
      

      请关注这个错误。您需要 64 位依赖库来启动它。这取决于加载的默认 java。如果是 32 位包,则需要默认 jvm 类路径为 32 位 java。您可以选择在 eclipse 中更改它。

      【讨论】:

        【解决方案4】:

        swt jar 执行依赖于您的操作系统的本机库。
        您有一个 swt 版本,用于: macOS 32 位和 64 位
        winsows 32 位和 64 位
        linux 32 位和 64 位

        您可以指定-d32 jvm 选项。它将强制 JVM 以 32 位模式运行。但是,您需要在您的操作系统中提供 JVM 的 32 位实现。

        您还可以在运行时动态加载正确的 SWT Jar:您在应用中包含两个 jar(swt-macosx-32bits 和 swt-macosx-64bits)并以编程方式加载所需的 jar:

        String osArch = System.getProperty ("sun.arch.data.model");
        if (osArch == null) {
            osArch = System.getProperty ("com.ibm.vm.bitmode");
        }
        URLClassLoader classLoader = (URLClassLoader) JarLoaderUtils.class.getClassLoader();
        URL.setURLStreamHandlerFactory(new RsrcURLStreamHandlerFactory(classLoader));
        Method addUrlMethod = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
        addUrlMethod.setAccessible(true);
        swtFileName = osArch.contains("64") ? SWT_MAC_x86_64 : SWT_MAC_x86;
        URL swtFileUrl = new URL("rsrc:" + swtFileName);
        addUrlMethod.invoke(classLoader, swtFileUrl);
        

        请注意,您似乎在 macosx 中运行您的应用程序,您还应该添加 -XstartOnFirstThread 选项。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-04
          • 2011-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-10
          • 2014-10-30
          • 1970-01-01
          相关资源
          最近更新 更多