2014-04-29 464 views
4

這個主題已經有幾個問題了,但他們都沒有正常工作。爲多平臺SWT應用程序構建一個平臺每個平臺

這裏是它們的列表:

我的要求是構建一個ant腳本,該腳本爲每個平臺創建一個罐子,即一個用於Windows x86,一個用於Windows x64,Linux x86/x64等等的一個罐子

有沒有人有任何進一步的見解?

使用上述方法,我無法生成可行的解決方案。它以SWT jar文件不會自動加載或者不包含在類路徑中結束。

如果有人能拿出一個工作的例子(理想情況下包括完整的源代碼),這將是盛大的!

+2

嘿的,很高興顯著縮短ant腳本看到有人試圖彙總所有這些信息集中在一個地方。幹得不錯! – Nobody

回答

4

對,所以我終於想出了一個解決方案,我在三個平臺上成功測試過。

這兩個神奇的組件是jar-in-jar-loader和一個合適的構建腳本。

與評論構建腳本可以在這裏找到:

<project name="RandomApp" basedir="." default="clean-build"> 

    <property name="src.dir" value="src" /> 

    <!-- Define the necessary paths --> 
    <property name="build.dir" value="bin_temp" /> 
    <property name="lib.dir" value="lib" /> 
    <property name="lib.deploy.dir" value="lib_swt" /> 
    <property name="classes.dir" value="${build.dir}/classes" /> 
    <property name="jar.dir" value="${build.dir}/jar" /> 
    <property name="img.dir" value="img" /> 
    <property name="res.dir" value="res" /> 

    <!-- Define the main class --> 
    <property name="main-class" value="org.baz.desktop.randomapp.gui.RandomApp" /> 

    <path id="base-classpath"> 
     <fileset dir="${lib.dir}" includes="**/*.jar" /> 
    </path> 

    <!-- Define the class path --> 
    <path id="classpath"> 
     <fileset dir="${lib.dir}" includes="**/*.jar" /> 
     <fileset dir="${lib.deploy.dir}" includes="**/swt_win32_x64.jar" /> 
    </path> 

    <!-- Clean previously built files --> 
    <target name="clean"> 
     <delete dir="${build.dir}" /> 
    </target> 

    <!-- Compile the project --> 
    <target name="compile"> 
     <mkdir dir="${classes.dir}" /> 
     <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" includeantruntime="false" /> 
    </target> 

    <macrodef name="createclasspath"> 
     <attribute name="name" /> 
     <attribute name="swtlib" /> 
     <sequential> 
      <pathconvert property="@{name}.classpath" pathsep=" "> 
       <path refid="base-classpath" /> 
       <fileset dir="${lib.deploy.dir}" includes="**/[email protected]{swtlib}.jar" /> 
       <mapper> 
        <chainedmapper> 
         <flattenmapper /> 
         <globmapper from="*.jar" to="*.jar" /> 
        </chainedmapper> 
       </mapper> 
      </pathconvert> 
     </sequential> 
    </macrodef> 

    <!-- Define classpath and create the jar folder --> 
    <target name="pre_jar" depends="compile"> 
     <!-- Linux 32bit --> 
     <createclasspath name="win86" swtlib="win32_x86" /> 
     <!-- Linux 64bit --> 
     <createclasspath name="win64" swtlib="win32_x64" /> 
     <!-- Windows 32bit --> 
     <createclasspath name="linux86" swtlib="linux_gtk_x86" /> 
     <!-- Windows 64bit --> 
     <createclasspath name="linux64" swtlib="linux_gtk_x64" /> 
     <!-- MacOS 32bit --> 
     <createclasspath name="macos86" swtlib="macos_x86" /> 
     <!-- MacOS 64bit --> 
     <createclasspath name="macos64" swtlib="macos_x64" /> 

     <mkdir dir="${jar.dir}" /> 
    </target> 

    <macrodef name="createjar"> 
     <attribute name="swtlib" /> 
     <attribute name="swtclasspath" /> 
     <sequential> 
      <jar destfile="${jar.dir}/${ant.project.name}[email protected]{swtlib}.jar" basedir="${classes.dir}"> 
       <manifest> 
        <attribute name="Main-Class" value="org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader" /> 
        <attribute name="Rsrc-Main-Class" value="${main-class}" /> 
        <attribute name="Class-Path" value="." /> 
        <attribute name="Rsrc-Class-Path" value="./ @{swtclasspath}" /> 
       </manifest> 

       <zipgroupfileset dir="${lib.dir}" includes="**/jar-in-jar-loader.jar" /> 
       <zipfileset dir="${lib.deploy.dir}" includes="**/[email protected]{swtlib}.jar" /> 
       <zipfileset dir="${lib.dir}" includes="**/*.jar" excludes="**/jar-in-jar-loader.jar" /> 
      </jar> 
     </sequential> 
    </macrodef> 

    <!-- Create the jar files --> 
    <target name="jar" depends="pre_jar"> 
     <!-- Linux 32bit --> 
     <createjar swtlib="linux_gtk_x86" swtclasspath="${linux86.classpath}" /> 
     <!-- Linux 64bit --> 
     <createjar swtlib="linux_gtk_x64" swtclasspath="${linux64.classpath}" /> 
     <!-- Windows 32bit --> 
     <createjar swtlib="win32_x86" swtclasspath="${win86.classpath}" /> 
     <!-- Windows 64bit --> 
     <createjar swtlib="win32_x64" swtclasspath="${win64.classpath}" /> 
     <!-- MacOS 32bit --> 
     <createjar swtlib="macos_x86" swtclasspath="${macos86.classpath}" /> 
     <!-- MacOS 64bit --> 
     <createjar swtlib="macos_x64" swtclasspath="${macos64.classpath}" /> 
    </target> 

    <target name="clean-build" depends="clean,jar" /> 

</project> 

什麼它基本上是定義一個基類路徑沒有任何 SWT庫。然後它使用基礎類創建特定於平臺的類路徑並添加適當的平臺SWT庫。

jar任務然後使用這些類路徑和jar-in-jar-loader爲每個平臺創建一個單獨的jar。

而就是這樣,它是一種爲每個(支持的)平臺生成罐子的完全自動化的方式。


我創建了一個示例項目,人們可以下載並測試。這對於多平臺應用程序來說是一個簡單的起點。

https://www.dropbox.com/s/ianrbl4bn0fmsdi/SWTApplication.7z


更新

我已經設法通過適當利用macrodef :)

+1

這很快;) – hiergiltdiestfu

+0

你嘗試從SWT創建一個exe文件嗎?和.dmg OSX?沒有使用RCP或第三方付費工具? –

+0

@AppWork不,我使用Install4J來創建這些。雖然你可以從他們那裏獲得開源許可。那個是免費的。 – Baz