在Mac上正确运行基于SWT的跨平台jar [英] Running SWT based, cross-platform jar properly on a Mac

查看:109
本文介绍了在Mac上正确运行基于SWT的跨平台jar的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直致力于基于SWT的项目,该项目旨在部署为Java Web Start,因此可以在多个平台上使用。

I have been working on a SWT-based project which is intended to be deployed as Java Web Start, and thus be used on multiple platforms.

到目前为止,我已设法解决由于SWT所依赖的系统特定库而导致的导出问题(参见相关的线程)。由此产生的jar似乎可以在32/64位Linux和64位窗口上正常工作,但是在具有以下输出的Mac上执行失败:

So far I have managed to tackle the exporting problem that arises due to the system-specific libraries SWT depends on (see relevant thread). The resultant jar seems to work start fine on 32/64-bit linux and 64-bit windows, however execution fails on a Mac with the following output:

$ java -jar dist/test.jar 
Adding { file:/Volumes/LaCie/ChiBE_Local/swt/swt-cocoa-macosx-x86_64-3.6.1.jar } to the classpath
***WARNING: Display must be created on main thread due to Cocoa restrictions.
Exception in thread "main" java.lang.reflect.InvocationTargetException
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.ExceptionInInitializerError
   at org.eclipse.gef.tools.MarqueeSelectionTool.<init>(MarqueeSelectionTool.java:99)
   at org.gvt.MarqueeZoomTool.<init>(MarqueeZoomTool.java:16)
   at org.gvt.action.MarqueeZoomToolAction$1.<init>(MarqueeZoomToolAction.java:28)
   at org.gvt.action.MarqueeZoomToolAction.createTool(MarqueeZoomToolAction.java:28)
   at org.gvt.action.AbstractGEFToolAction.<init>(AbstractGEFToolAction.java:24)
   at org.gvt.action.MarqueeZoomToolAction.<init>(MarqueeZoomToolAction.java:20)
   at org.gvt.TopMenuBar.createBarMenu(TopMenuBar.java:113)
   at org.gvt.ChisioMain.createMenuManager(ChisioMain.java:617)
   at org.eclipse.jface.window.ApplicationWindow.addMenuBar(ApplicationWindow.java:235)
   at org.gvt.ChisioMain.main(ChisioMain.java:149)
   at org.gvt.RuntimeMain.main(RuntimeMain.java:14)
   ... 5 more
Caused by: org.eclipse.swt.SWTException: Invalid thread access
   at org.eclipse.swt.SWT.error(Unknown Source)
   at org.eclipse.swt.SWT.error(Unknown Source)
   at org.eclipse.swt.SWT.error(Unknown Source)
   at org.eclipse.swt.widgets.Display.error(Unknown Source)
   at org.eclipse.swt.widgets.Display.createDisplay(Unknown Source)
   at org.eclipse.swt.widgets.Display.create(Unknown Source)
   at org.eclipse.swt.graphics.Device.<init>(Unknown Source)
   at org.eclipse.swt.widgets.Display.<init>(Unknown Source)
   at org.eclipse.swt.widgets.Display.<init>(Unknown Source)
   at org.eclipse.swt.widgets.Display.getDefault(Unknown Source)
   at org.eclipse.swt.widgets.Display$1.run(Unknown Source)
   at org.eclipse.swt.graphics.Device.getDevice(Unknown Source)
   at org.eclipse.swt.graphics.Resource.<init>(Unknown Source)
   at org.eclipse.swt.graphics.Cursor.<init>(Unknown Source)
   at org.eclipse.draw2d.Cursors.<clinit>(Cursors.java:170)
   ... 16 more

我查了一个号码相关主题:( 无法在Mac OS X上获得SWT显示 Mac上的SWT问题)以及 SWT常见问题解答上的UI线程条目和将您的Java应用程序带到Mac 在Mac OSX上部署SWT应用程序

I have checked a number of relevant threads: (Can't get SWT Display on Mac OS X, Problems With SWT on Mac) as well as the UI Thread entry on the SWT FAQ and tutorials such as Bringing your Java App to Mac and Deploying SWT applications on Mac OSX.

我的理解是问题源于Mac OSX上的线程处理,我应该尝试实现JVM参数 -XstartOnFirstThread 执行时。这是对吗?

It's my understanding that the problem originates from thread handling on Mac OSX, and I should try to implement the JVM argument -XstartOnFirstThread at the execution. Is this right?

假设我对问题的理解是准确的,我有点困惑,因为这个软件旨在跨平台并在javaws上运行。我是否需要创建一个 info.plist 文件,如果是这样,在包中的位置以及如何,否则如何在执行时有条件地将该参数传递给JVM ?

Assuming that my understanding of the problem is accurate, I am a bit confused as this software is intended to be cross-platform and run on javaws. Do I need to create an info.plist file, if so where in the package and how, otherwise how can I "conditionally" pass that argument to JVM at the time of execution?

提前致谢,

推荐答案

是的,你一定会的需要 -XstartOnFirstThread 才能在Mac OS X上运行。由于它是一个VM参数,您只能在启动应用程序时指定它,因此从您的代码和设置中检测操作系统如果它是Mac OS X是不可能的。 Eclipse网站上的解决方案创建了一个合适的Mac OS X 我的Application.app ,这是特定于平台的,并且在您的情况下再次不可行。

Yes, you will definitely need -XstartOnFirstThread to get this working on Mac OS X. Since it's a VM parameter, you can only specify it when launching your application, so detecting the OS from you code and setting it if it's Mac OS X is not possible. The solution on the Eclipse site creates a proper Mac OS X My Application.app, which is platform specific and, again, not feasible in your case.

但是,我刚尝试在Windows XP上运行Eclipse RCP应用程序,并指定了 -XstartOnFirstThread 参数,并且没有抱怨。这意味着您可以在JNLP文件中指定此参数,并且可能在所有其他平台上都会被忽略并在Mac OS X上获取。

However, I just tried running an Eclipse RCP application on Windows XP with the -XstartOnFirstThread argument specified, and it didn't complain at all. This means that you can specify this argument in your JNLP file and presumably it will be ignored on all other platforms and picked up on Mac OS X.

更新: 如果由于某种原因 -XstartOnFirstThread 在任何平台上造成问题,或者您只是想做正确的事,还有另一种可能解。您可以在浏览器中检测用户的操作系统 - 假设应用程序是从网页启动的 - 并为Mac OS X和其他平台提供不同的JNLP。

UPDATE: If for some reason -XstartOnFirstThread causes trouble on any platform, or you just want to Do The Right Thing, there is another possible solution. You could detect the user's OS in the browser — assuming that the application is launched from a web page —, and supply a different JNLP for Mac OS X and other platforms.

更新2:正如评论中所指出的,有一个关于部署SWT的教程Java Web Start的应用程序。我只是在Mac OS X(10.6.x)上启动了JNLP,它运行起来了。查看示例JNPL ,我发现了以下内容:

UPDATE 2: As pointed out in the comments, there is a tutorial on deploying SWT applications with Java Web Start. I simply launched the JNLP on Mac OS X (10.6.x), and it worked. Looking at the example JNPL I found the following:

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+"
    codebase="http://www.eclipse.org/swt/jws/"
    href="controlexample.jnlp">
<information>
      <title>Control Example</title>
      <vendor>eclipse.org</vendor>
      <homepage href="http://www.eclipse.org/swt/jws/" />
      <description>A demonstration of SWT Widgets</description>
      <description>Control Example</description>
</information>

<security>
    <all-permissions />
</security>

<resources>
    <extension href="swt.jnlp"/>
    <jar href="controlexample.jar" />
</resources>

<application-desc main-class="org.eclipse.swt.examples.controlexample.ControlExample" />
</jnlp>

注意< extension href =swt.jnlp/> 指向最后一行,指向特定于平台的SWT JNLP文件(这里省略了一些部分):

Note the <extension href="swt.jnlp"/> line towards the end, pointing to the platform-specific SWT JNLP file (some parts omitted here):

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+"
    codebase="http://www.eclipse.org/swt/jws/"
    href="swt.jnlp">
<information>
      <title>SWT</title>
      <vendor>eclipse.org</vendor>
      <homepage href="http://www.eclipse.org/swt/jws/" />
      <description>SWT</description>
</information>

<security>
    <all-permissions />
</security>

<resources os="Windows" arch="x86">
    <j2se version="1.4+" />
    <jar href="swt-win32-windows-x86.jar" />
</resources>

...

<resources os="Mac\ OS\ X">
    <j2se version="1.5*" java-vm-args="-XstartOnFirstThread"/>
    <jar href="swt-carbon-osx-universal.jar" />
</resources>

<component-desc/>
</jnlp>

它位于文件末尾:特定于Mac OS X -XstartOnFirstThread 参数。

There it is towards the end of the file: the Mac OS X specific -XstartOnFirstThread argument.

这篇关于在Mac上正确运行基于SWT的跨平台jar的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆