gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 02:45:22 26 4
gpt4 key购买 nike

这个主题已经有几个问题,但似乎没有一个能正常工作。

这是他们的列表:

我的要求是构建一个 ant 脚本,该脚本每个平台一个 jar,即一个用于 Windows x86、一个用于 Windows x64、Linux x86/x64 等等。

有没有人有进一步的见解?

使用上述方法,我无法生成可行的解决方案。它要么以 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 脚本 :)

关于java - 为多平台 SWT 应用程序为每个平台构建一个 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23359351/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com