gpt4 book ai didi

java - 在 Mac 上正确运行基于 SWT 的跨平台 jar

转载 作者:IT老高 更新时间:2023-10-28 20:34:17 34 4
gpt4 key购买 nike

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

到目前为止,我已经设法解决了由于 SWT 依赖的系统特定库而出现的导出问题(参见相关的 thread)。生成的 jar 在 32/64 位 linux 和 64 位 Windows 上似乎可以正常工作,但是在 Mac 上执行失败,输出如下:

$ 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

我检查了一些相关线程:( Can't get SWT Display on Mac OS XProblems With SWT on Mac )以及 UI Thread entry on the SWT FAQ以及 Bringing your Java App to Mac 等教程和 Deploying SWT applications on Mac OSX .

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

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

提前致谢,

最佳答案

是的,你肯定需要 -XstartOnFirstThread让它在 Mac OS X 上工作。因为它是一个 VM 参数,你只能在启动应用程序时指定它,所以从你的代码中检测操作系统并在它是 Mac OS X 时设置它是不可能的。 solution on the Eclipse site创建一个适当的 Mac OS X My Application.app,它是特定于平台的,同样,在您的情况下不可行。

但是,我只是尝试在 Windows XP 上使用 -XstartOnFirstThread 运行 Eclipse RCP 应用程序。指定的参数,它根本没有提示。这意味着您可以在您的 JNLP 文件中指定此参数,并且推测它会在所有其他平台上被忽略并在 Mac OS X 上被拾取。

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

更新 2: 正如评论中指出的,有一个 tutorial on deploying SWT applications with Java Web Start .我只是在 Mac OS X (10.6.x) 上启动了 JNLP,它就可以工作了。看着example JNPL我发现了以下内容:

<?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"/>朝向末端的线,指向 platform-specific SWT JNLP file (此处省略部分内容):

<?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论据。

关于java - 在 Mac 上正确运行基于 SWT 的跨平台 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3976342/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com