麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

使SWT/JFace支持跨平臺(tái)

2019-11-14 23:39:52
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
使SWT/JFace支持跨平臺(tái) 2015-04-07 11:06 by Binhua Liu, ... 閱讀, ... 評(píng)論, 收藏, 編輯

由于SWT的實(shí)現(xiàn)機(jī)制,在不同平臺(tái)下,必須引用不同swt*.jar. 由于這個(gè)瓶頸,我們要為不同的平臺(tái)編譯不同的版本。但是這是可以避免的。這將是本文要討論的內(nèi)容。

我一共google到了3種solution:

1,使用swtjar.jar。

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

其主頁(yè)有詳細(xì)的介紹。但是似乎下載鏈接已經(jīng)無(wú)效了,一個(gè)下載的辦法是從github上找到引用了它的項(xiàng)目,比如https://github.com/mchr3k/org.intrace/tree/3a1debcbb831f802219b341fb5e37467b365d443/org.intrace/lib

swtjar.jar的原理,似乎是通過(guò)替換掉默認(rèn)的ClassLoader來(lái)實(shí)現(xiàn)的。

根據(jù)我的測(cè)試,使用swtjar.jar的方案,如果引用到JFace,就沒(méi)辦法成功load jface classes。原因我之后會(huì)講到。

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

這個(gè)方案我讀過(guò)代碼,但是沒(méi)有試過(guò),看起來(lái)很復(fù)雜,但是似乎功能也很健全,有興趣的可以讀一下。

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

這個(gè)方案最簡(jiǎn)單明了,本文主要介紹該方案

其實(shí)3種方案實(shí)質(zhì)是一樣的,把所有平臺(tái)的swt*.jar都打包進(jìn)程序,然后根據(jù)OS和CPU構(gòu)架信息,來(lái)動(dòng)態(tài)load對(duì)應(yīng)的swt*.jar

第三種Solution

我們所要介紹的第三種solution,它的辦法是,在load class階段,不load swt*.jar。而是延遲到main函數(shù)執(zhí)行階段,再根據(jù)OS和CPU構(gòu)架來(lái)”手動(dòng)地”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();

}

}

其作用是來(lái)根據(jù)OS和CPU構(gòu)架信息,“手動(dòng)地”加載正確的swt*.jar文件。

(以上代碼在調(diào)試環(huán)境下可能沒(méi)辦法正確運(yùn)行,需要在開(kāi)始處添加一句:

URL.setURLStreamHandlerFactory(new RsrcURLStreamHandlerFactory(parentClassLoader));

但是在用ant編譯時(shí),則必須把這句話去掉。因?yàn)閍nt編譯出的代碼,RsrcURLStreamHandlerFactory已經(jīng)被設(shè)置到URL,重復(fù)設(shè)置將出異常。其具體原因我就不深究了)

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

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

需要添加這個(gè)jar的原因是,loadSwtJar方法隱式地使用了位于其中的JarRsrcLoader.class和相關(guān)的類(lèi)。

3)在main函數(shù)最開(kāi)始處添加 loadSwtJar()調(diào)用。

4)修改build.xml文件。

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

<?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,添加所有的平臺(tái)的SWT*.jar到zipfileset節(jié)點(diǎn)。

5) 好了,用ant編譯吧。

Trouble Shooting

以下trouble shooter事實(shí)上才是成敗的關(guān)鍵:

#1

如果代碼中引用了JFace*.jar,那么以上Solution會(huì)報(bào)ClassNotFoundException,說(shuō)JFace下的某個(gè)類(lèi)找不到,這是因?yàn)镴Face加載失敗了,為什么呢。

因?yàn)镴Face*.jar還是默認(rèn)加載的,JFace依賴(lài)于SWT*.jar,SWT*.jar已經(jīng)延遲加載了,自然,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();

}

}

也會(huì)報(bào)ClassNotFoundException,為什么呢?

因?yàn)锳pplicationWindow 和IExceptionHandler都是JFace下的類(lèi),main函數(shù)放在MyApplicationWindow中,要執(zhí)行main函數(shù),首先要加載ApplicationWindow 和IExceptionHandler,而這個(gè)時(shí)候,JFace還沒(méi)被加載呢,記得嗎,它被延遲加載了。

解決辦法很簡(jiǎn)單,把main函數(shù)挪挪地方就好了。

3#

如果在Mac OS X下執(zhí)行出錯(cuò),因?yàn)楸仨毤右粋€(gè)參數(shù):

java -XstartOnFirstThread -jar *.jar

恩,不要問(wèn)我為什么。


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产91在线免费 | 一级看片免费视频 | 国产91在线免费 | gogo全球大胆高清人露出91 | 羞羞羞网站 | 毛片大全在线观看 | 经典三级在线视频 | 久久久久久久久久美女 | hd性videos意大利复古 | 欧美一区二区黄 | 精品国产一区二区三区成人影院 | 鲁丝片一区二区三区免费入口 | 国产在线精品一区二区不卡 | 欧美一级黄色录相 | 日韩视频中文 | 国产激爽大片在线播放 | 综合网天天射 | 91看片片 | 久久精品一区二区三区国产主播 | 爽爽淫人网| chinesehdxxxx无套 久久另类视频 | 欧洲黄色一级视频 | 欧美成人免费电影 | 色综合久久久久久久久久 | 久久激情国产 | 毛片电影网址 | 在线成人免费网站 | 免费观看一级黄色片 | 久草在线观看首页 | 国产精品久久久久久久久久尿 | 欧美在线观看视频网站 | 免费国产视频大全入口 | 亚洲卡通动漫在线观看 | 久久性生活免费视频 | 久久久成人精品 | 成人免费久久网 | 成人一区二区在线观看视频 | 看片一区 | 欧美福利视频一区二区三区 | 久久久久北条麻妃免费看 | 女18一级大黄毛片免费女人 |