在Mac

2010-10-20 54 views
21

我一直在努力,其目的是部署爲Java Web Start的,因此在多個平臺上使用基於SWT項目的正常運行基於SWT,跨平臺的罐子。在Mac

到目前爲止,我已經成功地處理那些產生是由於系統特定的庫SWT依賴於出口的問題(參見相關thread)。得到的罐子似乎工作開始64分之32位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 MacDeploying SWT applications on Mac OSX

我的理解是問題來自Mac OSX上的線程處理,我應該嘗試在執行時實現JVM參數-XstartOnFirstThread。這是正確的嗎?

假設我對這個問題的理解是正確的,我有點困惑,因爲這個軟件旨在跨平臺和運行javaws的。我是否需要創建一個info.plist文件,如果是的話,其中的包怎麼樣,否則我怎麼能「有條件」通過這樣的說法在執行時JVM的?

由於提前,

+0

對於它的價值,我改進了錯誤信息:https://bugs.eclipse.org/bugs/show_bug.cgi?id = 470174 ***警告:由於Cocoa,必須在主線程上創建顯示限制。使用vmarg -XstartOnFirstThread – 2017-07-04 21:14:30

回答

34

是的,你一定會需要-XstartOnFirstThread讓Mac OS X上這個工作因爲它是一個VM參數,你只能指定它當啓動你的應用程序,所以檢測你的操作系統代碼,並設置它,如果它是Mac OS X是不可能的。該solution on the Eclipse site創建了一個合適的Mac OS X 我Application.app,這是特定於平臺,並再次,不要在你的情況下是可行的。

不過,我只是試圖運行與指定的-XstartOnFirstThread參數在Windows XP的Eclipse RCP應用程序,並沒有抱怨的。這意味着,你可以在你的JNLP文件中指定這一觀點,並假定它將其他所有平臺上被忽略,拿起Mac OS X上

UPDATE:如果由於某種原因導致-XstartOnFirstThread任何平臺上的麻煩,或你只想做正確的事情,還有另一種可能的解決方案。你可以檢測到用戶的操作系統中瀏覽器 - 假設應用程序從網頁推出 - ,並提供適用於Mac OS X和其他平臺不同的JNLP。

UPDATE 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參數。

+0

你的建議(在JNLP文件中指定)聽起來很酷,任何人都可以否認或確認嗎? – posdef 2010-10-20 10:40:53

+0

在這裏回答我自己的問題; '-XstartOnFirstThread'參數顯然是linux64(sun-jdk-1.6.0)上一個無法識別的選項,導致執行失敗: > java -jar -XstartOnFirstThread dist/test.jar 無法識別的選項:-XstartOnFirstThread 無法創建Java虛擬機。 [2] + Killed java -jar dist/test.jar – posdef 2010-10-20 11:33:32

+0

@posdef:有趣的是,顯然Windows 32位虛擬機比Linux 64位版本更挑剔。無論如何,這意味着你必須有兩個不同的JNLP,如上所述。 – 2010-10-20 12:32:21

-3

SWT(像任何其他UI框架)具有 「UI線程」。這通常是主線程(即執行main(String[] args)一個所有調用UI的方法,在這個線程必須發生

如果您需要調用從非UI線程的UI方法,你必須把它包裝:。

Display.getDefault().asyncExec(new Runnable() { 
    public void run() { 
     //ui call here 
    } 
}); 

如果需要等待結果,你可以使用syncExec()

+0

那麼這個理論是有道理的,但我很困惑,爲什麼它成爲Mac環境特有的問題。此外,因爲我不是編碼GUI的人員,所以我不知道軟件中的哪個位置可能存在「從非UI線程調用UI方法」,這使問題變得更加複雜。 – posdef 2010-10-20 09:45:14

+1

您的評論在這種情況下沒有意義,因爲調用Display.getDefault()時會發生異常。 – 2011-11-11 11:05:45