2014-04-29 247 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