当前位置: 首页 > 面试题库 >

每个平台为一个多平台SWT应用程序构建一个jar

鲜于渊
2023-03-14
问题内容

该主题已经有几个问题,但是似乎都无法正常工作。

我的要求是构建一个可在 每个平台 上创建 一个jar 的ant脚本,即一个用于Windows x86的 jar
,一个用于Windows x64,Linux x86 / x64的 jar

有人有进一步的见解吗?

使用上述方法,我无法产生可行的解决方案。它以未自动加载SWT jar文件结尾或未包含在类路径中而结束。

如果有人能提出一个可行的示例(最好包括完整的源代码),那就太好了!


问题答案:

是的,所以我最终提出了一个在三个平台上成功测试过的解决方案

两个魔术组件是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="**/swt_@{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}_@{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="**/swt_@{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。

就是这样,这是一种为每个(受支持的)平台生成jar的全自动方法。

我创建了一个示例项目,人们可以下载并进行测试。对于多平台应用程序来说,这是一个简单的起点。

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

更新

我已经通过适当使用macrodef:) 大大缩短了ant脚本。



 类似资料:
  • 问题内容: 我在Linux机器上使用jlink创建了运行时映像。而且我看到该文件夹下的文件夹。这是否意味着我只能在Linux平台上使用此运行时映像?如果是,是否有任何方法可以在一个平台上为另一个平台创建运行时映像(例如,在Linux for Windows上,反之亦然) 问题答案: 该目录用于标头文件,例如,在编译使用JNI和其他本机接口的C / C ++代码时需要这些标头文件。这与无关。 该工具

  • 我在Linux机器上使用jlink创建了运行时映像。我在include文件夹下看到了linux文件夹。这是否意味着我只能在Linux平台上使用此运行时映像?如果是,是否有任何方法可以在一个平台上为另一个平台创建运行时映像(例如,在Linux for Windows上,反之亦然)

  • 执行任务:[clean] 按需配置是一个正在孵化的特性。NDK缺少一个“平台”目录。如果使用的是NDK,请验证NDK.dir是否设置为有效的NDK目录。它目前被设置为/users/ishandutta2007/library/android/sdk/ndk-bundle。如果您没有使用NDK,请从ANDROID_NDK_HOME或local.properties中取消NDK变量的设置,以删除此警告

  • 在线演示地址:http://m.close.cc/index.php 还很不完善,功能也没有完成。

  • 我是一名PHP、HTML5、CSS3、Javascript、Jquery、Angular的全栈开发人员,热衷于学习任何新技术 现在,我有了一个混合移动应用程序项目(更简单,只需少量的curd操作和web服务),而且它还将是web应用程序,我需要尽快交付。所以我的问题是为正确的工作选择正确的工具 混合应用程序可以使用 平台:Phonegap或cordova,根据我的理解,cordova是Phoneg

  • 问题内容: 我试图在我的Java应用程序中嵌入WebKit浏览器。我坚持使用WebKit,因为我不想用例如Eclipse SWT库中的Browser小部件支持的每个浏览器测试HTML5 / CSS / Javascript。 有没有办法在Mac,Windows和Linux上执行此操作,从而确保我的网页在Java应用程序中统一呈现? 问题答案: 从SWT 3.7 M5开始,如果使用标记创建,则小部件