【问题标题】:Build multi-platform executable for a SWT application (Eclipse)为 SWT 应用程序 (Eclipse) 构建多平台可执行文件
【发布时间】:2014-04-13 18:25:58
【问题描述】:

我有一个基于 Eclipse 的 SWT 应用程序,而不是使用 Maven。

我的应用程序面向多个操作系统(CentOS、Windows 和 Mac)。

唯一与操作系统无关的 jar 文件是 SWT 库,它特定于每种操作系统类型,更不用说处理器类型(x86 和/或 x64)了。

我看到了这个other issue,但它针对的是 Maven,我没有使用 Maven。

按照概述的过程并包括整个 SWT 下载的 ZIP 文件,我已将“org.eclipse.swt”添加到我的项目中。这在 Package Explorer 中指定了第二个项目。

早些时候,当我只包含 swt.jar 时,它会更容易一些,因为我只需要删除 jar,包含新的 jar,然后重新构建,但这很痛苦。现在我用的是整个SWT ZIP,过程有点繁琐,不专业。

步骤是什么,以便当我指定“右键单击 > Java > 可运行 JAR 文件”来创建单个可执行 jar 时,我会得到 3 个(或多个)不同的 jar 文件,每个操作系统一个? Visual Studio 做得很好,只是我不知道如何在 Eclipse 中做到这一点。

更新: 为了回答评论,我想添加 JFace 支持,因为我想使用需要 JFace 的 TableViewer 功能。 Eclipse 在第一部分有this 页面概述了如何在SWT 中添加。除了在最后添加源代码之外,这些步骤都有效,但这是题外话。

我按照 64 位 Windows 的步骤进行操作,但我必须支持 CENTOS,而 Mac 目前会是“不错的”。

独立于 swt.jar 和 org.eclipse.swt,我想要一种干净的方式(想想带有 .Net 的 Visual Studio)为我的应用程序构建一个可运行/可执行的 jar 文件,每个支持的操作系统类型一个。我的想法是我指定构建(设置后的任何菜单键序列),并且每个目标操作系统都有一个可执行的 jar 文件。

【问题讨论】:

  • 您能解释一下“现在我使用整个 SWT ZIP” 的意思吗?这包括什么?为什么只有 .jar 还不够?
  • 我将解释新方法,但我的问题与此无关。我厌倦了每次构建时都删除和添加 SWT.jar,并想知道 Eclipse 是否提供了一种更简洁的方式来进行多平台开发。我会定期推出不同的版本,精简的方法会很好。
  • 我知道这不是您想要的,但您是否考虑过创建一个可在所有平台上运行的单个 jar? AFAIK,除非您使用 Eclipse-RCP,否则没有内置方法可以为多个平台导出多个 jar。
  • 我对此持开放态度,但不知道这是可能的。我还在学习 Eclipse 和 Java。那怎么做?我来自 Windows 背景,因此不可能创建针对每个可能的操作系统的单个可执行文件 (appname.exe),所以我假设 Java 也是如此,尤其是 SWT 依赖于操作系统和平台(x64 或 x86)。
  • 有几个关于如何做到这一点的问题(例如herehere)。我自己也在使用这种方法,如果有帮助,我什至可以给你发一些代码。

标签: java eclipse jar swt multiplatform


【解决方案1】:

好吧,尽管我说您可以为所有平台创建一个 .jar 文件,但我无法让它正常工作。

但是,我设法启动并运行了一个示例项目,该项目只需使用 Ant 即可为每个平台创建一个单独的 .jar 文件。

您可以下载整个项目here

构建脚本如下所示:

<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" />

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

    <!-- Define the class path -->
    <path id="classpath">
        <fileset dir="${lib.dir}" includes="**/*.jar" />
        <fileset dir="${lib.deploy.dir}" includes="**/swt_linux_gtk_x86.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>

    <!-- Define classpath and create the jar folder -->
    <target name="pre_jar" depends="compile">
        <pathconvert property="manifest.classpath" pathsep=" ">
            <path refid="classpath" />
            <mapper>
                <chainedmapper>
                    <flattenmapper />
                    <globmapper from="*.jar" to="*.jar" />
                </chainedmapper>
            </mapper>
        </pathconvert>

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

    <!-- Create the jar files -->
    <target name="jar" depends="pre_jar">
        <!-- Linux 32bit -->
        <jar destfile="${jar.dir}/${ant.project.name}_linux_gtk_x86.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="./ ${manifest.classpath}" />
            </manifest>

            <zipgroupfileset dir="${lib.dir}" includes="**/jar-in-jar-loader.jar" />
            <zipfileset dir="${lib.deploy.dir}" includes="**/swt_linux_gtk_x86.jar" />
            <zipfileset dir="${lib.dir}" includes="**/*.jar" excludes="**/jar-in-jar-loader.jar" />
        </jar>
        <!-- Linux 64bit -->
        <jar destfile="${jar.dir}/${ant.project.name}_linux_gtk_x64.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="./ ${manifest.classpath}" />
            </manifest>

            <zipgroupfileset dir="${lib.dir}" includes="**/jar-in-jar-loader.jar" />
            <zipfileset dir="${lib.deploy.dir}" includes="**/swt_linux_gtk_x64.jar" />
            <zipfileset dir="${lib.dir}" includes="**/*.jar" excludes="**/jar-in-jar-loader.jar" />
        </jar>
        <!-- Windows 32bit -->
        <jar destfile="${jar.dir}/${ant.project.name}_win32_x86.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="./ ${manifest.classpath}" />
            </manifest>

            <zipgroupfileset dir="${lib.dir}" includes="**/jar-in-jar-loader.jar" />
            <zipfileset dir="${lib.deploy.dir}" includes="**/swt_win32_x86.jar" />
            <zipfileset dir="${lib.dir}" includes="**/*.jar" excludes="**/jar-in-jar-loader.jar" />
        </jar>
        <!-- Windows 64bit -->
        <jar destfile="${jar.dir}/${ant.project.name}_win32_x64.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="./ ${manifest.classpath}" />
            </manifest>

            <zipgroupfileset dir="${lib.dir}" includes="**/jar-in-jar-loader.jar" />
            <zipfileset dir="${lib.deploy.dir}" includes="**/swt_win32_x64.jar" />
            <zipfileset dir="${lib.dir}" includes="**/*.jar" excludes="**/jar-in-jar-loader.jar" />
        </jar>
        <!-- MacOS 32bit -->
        <jar destfile="${jar.dir}/${ant.project.name}_macos_x86.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="./ ${manifest.classpath}" />
            </manifest>

            <zipgroupfileset dir="${lib.dir}" includes="**/jar-in-jar-loader.jar" />
            <zipfileset dir="${lib.deploy.dir}" includes="**/swt_macosx_x86.jar" />
            <zipfileset dir="${lib.dir}" includes="**/*.jar" excludes="**/jar-in-jar-loader.jar" />
        </jar>
        <!-- MacOS 64bit -->
        <jar destfile="${jar.dir}/${ant.project.name}_macos_x64.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="./ ${manifest.classpath}" />
            </manifest>

            <zipgroupfileset dir="${lib.dir}" includes="**/jar-in-jar-loader.jar" />
            <zipfileset dir="${lib.deploy.dir}" includes="**/swt_macosx_x64.jar" />
            <zipfileset dir="${lib.dir}" includes="**/*.jar" excludes="**/jar-in-jar-loader.jar" />
        </jar>
    </target>

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

</project>

该项目本身并不花哨,只是一个 JFace Dialog 以表明 JFace 也可以工作。


注意

要在 Windows 机器上编译,您必须更改一行:

<fileset dir="${lib.deploy.dir}" includes="**/swt_linux_gtk_x86.jar" />

改成:

<fileset dir="${lib.deploy.dir}" includes="**/swt_win32_x64.jar" />

<fileset dir="${lib.deploy.dir}" includes="**/swt_win32_x86.jar" />

基本上,这一行必须代表您的系统,即您正在编译的系统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 2011-02-11
    • 2022-11-29
    • 2023-03-05
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    相关资源
    最近更新 更多