亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

使SWT/JFace支持跨平臺

2019-11-14 23:39:52
字體:
來源:轉載
供稿:網友
使SWT/JFace支持跨平臺 2015-04-07 11:06 by Binhua Liu, ... 閱讀, ... 評論, 收藏, 編輯

由于SWT的實現機制,在不同平臺下,必須引用不同swt*.jar. 由于這個瓶頸,我們要為不同的平臺編譯不同的版本。但是這是可以避免的。這將是本文要討論的內容。

我一共google到了3種solution:

1,使用swtjar.jar。

http://mchr3k.github.io/swtjar/

其主頁有詳細的介紹。但是似乎下載鏈接已經無效了,一個下載的辦法是從github上找到引用了它的項目,比如https://github.com/mchr3k/org.intrace/tree/3a1debcbb831f802219b341fb5e37467b365d443/org.intrace/lib

swtjar.jar的原理,似乎是通過替換掉默認的ClassLoader來實現的。

根據我的測試,使用swtjar.jar的方案,如果引用到JFace,就沒辦法成功load jface classes。原因我之后會講到。

2, http://sourceblogger.googlecode.com/svn/trunk/multiplatform-swt-loader/src/main/java/com/github/jendap/multiplatformswt/loader/MultiPlatformSwtHelper.java

這個方案我讀過代碼,但是沒有試過,看起來很復雜,但是似乎功能也很健全,有興趣的可以讀一下。

3,http://stackoverflow.com/questions/2706222/create-cross-platform-java-swt-application

這個方案最簡單明了,本文主要介紹該方案

其實3種方案實質是一樣的,把所有平臺的swt*.jar都打包進程序,然后根據OS和CPU構架信息,來動態load對應的swt*.jar

第三種Solution

我們所要介紹的第三種solution,它的辦法是,在load class階段,不load swt*.jar。而是延遲到main函數執行階段,再根據OS和CPU構架來”手動地”load正確的swt*.jar

1) 首先添加以下方法

PRivate static void loadSwtJar() {

String swtFileName="";

try {

String osName = System.getProperty("os.name").toLowerCase();

String osArch = System.getProperty("os.arch").toLowerCase();

final ClassLoader parentClassLoader = Thread.currentThread().getContextClassLoader();

Method addUrlMethod = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);

addUrlMethod.setaccessible(true);

String swtFileNameOsPart =

osName.contains("win") ? "win32.win32" :

osName.contains("mac") ? "cocoa.macosx" :

osName.contains("linux") || osName.contains("nix") ? "gtk.linux" :

""; // throw new RuntimeException("Unknown OS name: "+osName)

String swtFileNameArchPart = osArch.contains("64") ? "x86_64" : "x86";

swtFileName = "org.eclipse.swt."+swtFileNameOsPart+"."+swtFileNameArchPart+"-4.4.jar";

URL swtFileUrl = new URL("rsrc:"+swtFileName); // I am using Jar-in-Jar class loader which understands this URL; adjust accordingly if you don't

addUrlMethod.invoke(parentClassLoader, swtFileUrl);

}

catch(Exception e) {

System.out.println("Unable to add the swt jar to the class path: "+swtFileName);

e.printStackTrace();

}

}

其作用是來根據OS和CPU構架信息,“手動地”加載正確的swt*.jar文件。

(以上代碼在調試環境下可能沒辦法正確運行,需要在開始處添加一句:

URL.setURLStreamHandlerFactory(new RsrcURLStreamHandlerFactory(parentClassLoader));

但是在用ant編譯時,則必須把這句話去掉。因為ant編譯出的代碼,RsrcURLStreamHandlerFactory已經被設置到URL,重復設置將出異常。其具體原因我就不深究了)

2) 添加jar-in-jar-loader.jar引用。

在eclipse的plugins目錄下找到org.eclipse.jdt.ui_*version_number*.jar,解壓它,發現jar-in-jar-loader.zip, 重命名為jar-in-jar-loader.jar。放到項目的lib目錄下并引用。

需要添加這個jar的原因是,loadSwtJar方法隱式地使用了位于其中的JarRsrcLoader.class和相關的類。

3)在main函數最開始處添加 loadSwtJar()調用。

4)修改build.xml文件。

是的,你需要一個build.xml文件,如果沒有,用eclipse的導出jar的功能生成一個。 修改build.xml文件的主要目的有2個:1是把SWT*.jar從默認加載列表中去掉,2是把所有平臺的的SWT*.jar都放到打包列表中去。一加一減。給個例子:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<project default="create_run_jar" name="Create Runnable Jar for Project swtguiexample with Jar-in-Jar Loader">

<!--this file was created by Eclipse Runnable JAR Export Wizard-->

<!--ANT 1.7 is required

-->

<target name="create_run_jar">

<jar destfile="/home/binhua/Desktop/ bin /swtguiexample.jar">

<manifest>

<attribute name="Main-Class" value="org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader"/>

<attribute name="Rsrc-Main-Class" value=" swtguiexample.Main"/>

<attribute name="Class-Path" value="."/>

<attribute name="Rsrc-Class-Path" value="./ jar-in-jar-loader.jar org.eclipse.equinox.common-3.6.100.v20120522-1841.jar org.eclipse.core.commands-3.6.1.v20120521-2329.jar org.eclipse.osgi-3.8.0.v20120529-1548.jar"/>

</manifest>

<zipfileset src="lib/jar-in-jar-loader.jar"/>

<fileset dir="/home/binhua/Desktop/code/swtexample/src/swtguiexample/target/classes"/>

<zipfileset dir="/home/binhua/.m2/repository/org/eclipse/swt/org.eclipse.swt.gtk.linux.x86_64/4.4" includes="org.eclipse.swt.gtk.linux.x86_64-4.4.jar"/>

<zipfileset dir="/home/binhua/.m2/repository/org/eclipse/swt/org.eclipse.swt.gtk.linux.x86/4.4" includes="org.eclipse.swt.gtk.linux.x86-4.4.jar"/>

<zipfileset dir="/home/binhua/.m2/repository/org/eclipse/swt/org.eclipse.swt.cocoa.macosx.x86_64/4.4" includes="org.eclipse.swt.cocoa.macosx.x86_64-4.4.jar"/>

<zipfileset dir="/home/binhua/.m2/repository/org/eclipse/swt/org.eclipse.swt.win32.win32.x86_64/4.4" includes="org.eclipse.swt.win32.win32.x86_64-4.4.jar"/>

<zipfileset dir="/home/binhua/.m2/repository/org/eclipse/swt/org.eclipse.swt.win32.win32.x86/4.4" includes="org.eclipse.swt.win32.win32.x86-4.4.jar"/>

<zipfileset dir="/home/binhua/.m2/repository/org/eclipse/equinox/org.eclipse.equinox.common/3.6.100.v20120522-1841" includes="org.eclipse.equinox.common-3.6.100.v20120522-1841.jar"/>

<zipfileset dir="/home/binhua/.m2/repository/org/eclipse/core/org.eclipse.core.commands/3.6.1.v20120521-2329" includes="org.eclipse.core.commands-3.6.1.v20120521-2329.jar"/>

<zipfileset dir="/home/binhua/.m2/repository/org/eclipse/osgi/org.eclipse.osgi/3.8.0.v20120529-1548" includes="org.eclipse.osgi-3.8.0.v20120529-1548.jar"/>

</jar>

</target>

</project>

以上: 1,在Rsrc<attribute name="Rsrc-Class-Path" 中,刪除掉SWT*.jar,2,添加所有的平臺的SWT*.jar到zipfileset節點。

5) 好了,用ant編譯吧。

Trouble Shooting

以下trouble shooter事實上才是成敗的關鍵:

#1

如果代碼中引用了JFace*.jar,那么以上Solution會報ClassNotFoundException,說JFace下的某個類找不到,這是因為JFace加載失敗了,為什么呢。

因為JFace*.jar還是默認加載的,JFace依賴于SWT*.jar,SWT*.jar已經延遲加載了,自然,JFace*.jar不可能加載成功。

解決辦法是讓JFace也延遲加載:

1,在Build.xml的Rsrc<attribute name="Rsrc-Class-Path" 中,把JFace*.jar也去掉

2,在loadSwtJar()最后一行添加

private static void loadSwtJar() {

  …

  addUrlMethod.invoke(parentClassLoader, new URL("rsrc:org.eclipse.jface-3.8.0.v20120521-2329.jar"));

}

2#

如果你有以下代碼

public class MyApplicationWindow extends ApplicationWindow implements IExceptionHandler{

public static void main( String[] args )

{

loadSwtJar();

}

}

也會報ClassNotFoundException,為什么呢?

因為ApplicationWindow 和IExceptionHandler都是JFace下的類,main函數放在MyApplicationWindow中,要執行main函數,首先要加載ApplicationWindow 和IExceptionHandler,而這個時候,JFace還沒被加載呢,記得嗎,它被延遲加載了。

解決辦法很簡單,把main函數挪挪地方就好了。

3#

如果在Mac OS X下執行出錯,因為必須加一個參數:

java -XstartOnFirstThread -jar *.jar

恩,不要問我為什么。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美精品一区| 国产精品久久久久久一区二区| 久久九九亚洲综合| 欧美在线欧美在线| 久久网福利资源网站| 亚洲爱爱爱爱爱| 91麻豆桃色免费看| 日本精品久久电影| 成人做爰www免费看视频网站| 91麻豆桃色免费看| 久久精品免费播放| 成人激情视频小说免费下载| 国产视频久久久久久久| 国产精品久久久久77777| 亚洲天堂影视av| 亚洲乱码一区二区| 国产精品三级久久久久久电影| 亚洲xxxx妇黄裸体| 久久99久久亚洲国产| 国产亚洲视频在线| 一区二区欧美亚洲| 国产色婷婷国产综合在线理论片a| 成人有码视频在线播放| 欧美精品在线观看91| 亚洲成人国产精品| 国产99久久精品一区二区 夜夜躁日日躁| 91精品国产网站| 日韩av免费看| 亚洲影院污污.| 亚洲成人黄色在线观看| 亚洲精品99999| 日韩av大片在线| 久久久久国产视频| 丝袜美腿亚洲一区二区| 亚洲成人精品久久久| 日韩精品在线免费| 国产精品精品久久久| 欧美午夜精品伦理| 欧美精品一二区| 国产亚洲精品久久久久久牛牛| 欧美亚洲国产日韩2020| 日本a级片电影一区二区| 精品在线观看国产| 欧美激情日韩图片| 日韩在线观看精品| 日韩精品视频免费在线观看| 免费不卡欧美自拍视频| 国产精品久久久久999| 精品视频—区二区三区免费| 91亚洲国产成人久久精品网站| 国外成人性视频| 亚洲成人激情在线观看| 久久精品国产欧美激情| 日韩精品亚洲视频| 精品福利在线观看| 成人xvideos免费视频| 欧美日韩国产成人高清视频| 欧美亚洲成人网| 午夜精品久久久久久久久久久久| 久久亚洲国产精品成人av秋霞| 欲色天天网综合久久| 97在线观看免费高清| 亚洲午夜久久久久久久| 亚洲国产成人91精品| 亚洲第一福利视频| 久久人体大胆视频| 78色国产精品| 欧洲亚洲女同hd| 欧美午夜美女看片| 亚洲成人在线视频播放| 午夜精品福利在线观看| 国产91精品久久久| 国产精品亚洲精品| 69久久夜色精品国产69乱青草| 国产精品成人免费电影| 亚洲美女av在线播放| 九九视频直播综合网| 国产视频亚洲视频| www.久久久久| 欧美性猛交xxxx乱大交蜜桃| 91精品国产综合久久香蕉| 日韩黄在线观看| 九九久久精品一区| 亚洲综合第一页| 成人a视频在线观看| 国产日韩精品在线| 欧美日韩精品在线播放| 欧美激情视频网址| 亚洲丝袜一区在线| 国产一区二区香蕉| 成人做爽爽免费视频| 国产精品露脸av在线| 亚洲a级在线观看| 在线观看日韩视频| 亚洲美女动态图120秒| 亚洲最大的免费| 亚洲а∨天堂久久精品喷水| 亚洲国产美女久久久久| 在线播放精品一区二区三区| 91a在线视频| 久久在线观看视频| 欧美电影免费观看高清| 亚洲欧美另类人妖| 日韩激情av在线播放| 91精品一区二区| 久久久久久国产精品久久| 92福利视频午夜1000合集在线观看| 5252色成人免费视频| 亚洲一区二区福利| 亚洲国产精彩中文乱码av| 欧美最顶级丰满的aⅴ艳星| 久久久av免费| 国产精品99久久久久久久久| 国产aⅴ夜夜欢一区二区三区| 国产91在线播放精品91| 黑人巨大精品欧美一区免费视频| 亚洲一区二区三区久久| 91沈先生在线观看| 91精品国产色综合| 美乳少妇欧美精品| 中文国产成人精品久久一| 欧美成人在线网站| 国产亚洲欧洲高清一区| 久久免费观看视频| 国产精品亚洲片夜色在线| 在线观看欧美视频| 久久成年人视频| 久久精品成人欧美大片| 亚洲精品www久久久| 久久中文精品视频| 69av成年福利视频| 91精品国产自产在线老师啪| 日本欧美在线视频| 国产精品中文字幕在线| 亚洲激情在线视频| 久久香蕉国产线看观看网| 精品久久久久久中文字幕大豆网| 日韩在线欧美在线国产在线| 日韩视频精品在线| 亚洲电影中文字幕| 欧美老女人性生活| 亚洲 日韩 国产第一| 国产精品第100页| 91精品国产91久久久久久最新| 欧美性生活大片免费观看网址| 色悠久久久久综合先锋影音下载| 欧美乱大交做爰xxxⅹ性3| 97精品一区二区视频在线观看| 久久精彩免费视频| 粉嫩av一区二区三区免费野| 欧美电影免费在线观看| 日韩欧美中文第一页| 久久久av网站| 欧美一级高清免费播放| 日韩中文在线观看| 久久精品这里热有精品| 亚洲精品www| 91久久国产精品91久久性色| 8090成年在线看片午夜| 国产精品九九九| 日韩精品免费一线在线观看| 伊人伊成久久人综合网站| 成人黄色av免费在线观看| 俺去啦;欧美日韩|