我一直在研究基于SWT的项目,该项目旨在作为Java Web Start部署,因此可以在多个平台上使用。
到目前为止,我已经设法解决了由于SWT依赖于系统特定的库而引起的导出问题。生成的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
据我了解,该问题源于Mac OSX上的线程处理,因此我应该尝试在执行时实现JVM参数-XstartOnFirstThread
。这是正确的吗?
假设我对问题的理解是准确的,我有点困惑,因为该软件旨在跨平台并可以在javaws上运行。我是否需要创建一个info.plist
文件,如果需要,请在包中的何处以及如何创建一个文件,否则我如何在执行时将该条件“有条件地”传递给JVM?
提前致谢,
是的,您绝对需要-XstartOnFirstThread
在Mac OSX上使它正常工作。由于它是VM参数,因此只能在启动应用程序时指定它,因此如果无法使用Mac OS
X,则从代码中检测并设置OS。在Eclipse的现场解决方案创建了一个合适的MacOS X 我Application.app ,这是特定于平台的,并再次,不要在你的情况下是可行的。
但是,我只是尝试使用-XstartOnFirstThread
指定的参数在Windows XP上运行Eclipse
RCP应用程序,而它一点也不抱怨。这意味着您可以在JNLP文件中指定此参数,并且大概在所有其他平台上都将忽略该参数,并在Mac OS X上将其提取。
更新: 如果由于某种原因-XstartOnFirstThread
在任何平台上引起麻烦,或者您只想 做正确的事
,那么还有另一种可能的解决方案。您可以在浏览器中检测到用户的OS(假设该应用程序是从网页启动的),然后为Mac OS X和其他平台提供不同的JNLP。
更新2: 如评论中所指出,有一个有关使用Java Web
Start部署SWT应用程序的教程。我只是在Mac
OS
X(10.6.x)上启动了JNLP,并且可以正常工作。查看示例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"/>
一行,指向特定于平台的SWT
JNLP文件(此处省略了某些部分):
<?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
参数。
我创建了跨平台。带有maven shade插件的jar文件。这个jar在windows上运行得很好,但当我尝试在ubuntu上运行它时,我遇到了一个异常: 我已安装gtk: 。。。和openjfx: 。。。但这没有帮助。 我的pom。xml文件: java--版本: 这是我的问题。jar,或者我需要对ubuntu jdk配置执行smth?我如何解决这个问题?谢谢你的帮助。
问题内容: 我在Swing应用程序中使用JWebBrowser。此类属于DJ项目。它需要swt jar执行。现在,我已将Windows的swt jar包含在应用程序的jar包装中。我想知道如何在同一包装中包含用于Linux / Mac的swt jars?我正在使用ant来构建应用程序jar。我应该建立将不同的swt罐放入不同平台的罐吗? 问题答案: 如果您想要一个可以在不同平台(Win / Mac
我被要求连接到公司大型机上的Db2数据库。我得到了主机名、端口号和数据库。我能够使用Java和IBM JDK版本1.8以及Db2 Universal JDBC驱动程序成功地连接到它。现在我已经连接到它,我如何找出什么是下面躺着的大型机平台。哪里是z/OS、OS/400还是VSE?是否有任何SQL查询可以获得该平台信息?另外,如何找出DB2的版本?
多平台支持 Mpx支持在多个小程序平台中进行增强,目前支持的小程序平台包括微信,支付宝,百度,qq和头条,不过自2.0版本后,Mpx支持了以微信增强语法为base的跨平台输出,实现了一套业务源码在多端输出运行的能力,大大提升了多小程序平台业务的开发效率,详情可以查看template增强特性 不同平台上的模板增强指令按照平台的指令风格进行设计,文档和代码示例为了方便统一采用微信小程序下的书写方式。
问题内容: Mono跨平台正在采取什么措施?如何为Windows编译(在Linux中),如何在Linux中运行代码(因为没有.NET JIT编译器)? 那么使用Mono开发的特殊之处是什么?与使用Visual Studio进行开发相比,有什么优势(跨平台的东西除外)? 问题答案: 在Mono中进行开发绝对是跨平台的,有一个 警告请求者 : 努力避免使用Windows特定的API 与本机Window
在各方有志之士的努力下,Ruby已经被移植到多种平台。下面,就从OS或开发环境等方面对Ruby的运行环境做一个简要介绍。 关于安装和编译问题,请参考Ruby 安装指南。 Unix Windows(Win32) Win32 native版 mswin32 MinGW (mingw, mingw32) bccwin32 Cygwin (cygwin) Mac Mac OS X BeOS MS-DOS