我使用我找到的清晰解释制作了一个跨平台 SWT jar:创建跨平台 Java SWT 应用程序
不过,这需要我打包每个平台的 jar 以使其独立于系统,使 jar 的总大小约为 40MB。对于进行一些解析的项目来说,这有点疯狂。
我曾尝试使用 ProGuard 来减小文件大小,但这并不是很有用。我可以由此得出结论,原则上不可能使用 SWT 创建小型跨平台应用程序吗?
我使用我找到的清晰解释制作了一个跨平台 SWT jar:创建跨平台 Java SWT 应用程序
不过,这需要我打包每个平台的 jar 以使其独立于系统,使 jar 的总大小约为 40MB。对于进行一些解析的项目来说,这有点疯狂。
我曾尝试使用 ProGuard 来减小文件大小,但这并不是很有用。我可以由此得出结论,原则上不可能使用 SWT 创建小型跨平台应用程序吗?
好吧,您可以让您的程序不包含 SWT jar,并在安装或首次运行时下载正确的 jar。可能不是一个好主意,但可能。否则,我只会在这种情况下使用 Swing。
可以将所有所需平台之间通用的类文件提取到单独的 jar 中。然后从平台特定的 jar 中删除这些公共类。
在运行时,您将公共 jar 和特定于平台的 jar 添加到 URLClassLoader。
为我工作。
这是我用来重新打包 jar 的旧 shell 脚本,我希望它可以工作:
#!/bin/bash
ref=""
for jar in *.jar ; do
base="${jar%%.jar}"
mkdir "$base"
( cd "$base" ; unzip -o ../${jar} ;)
ref="$base"
done
mkdir common
echo "Base is ${ref}"
( cd "$ref" ; find . -type f ) | while read f ; do
fd5=`cat "${ref}/${f}" | md5sum`
echo "Processing ${f}..."
same="yes"
for jar in *.jar ; do
if [[ "x${same}" == "xyes" ]] ; then
base="${jar%%.jar}"
if [[ -f "${base}/${f}" ]] ; then
fd5b=`cat "${base}/${f}" | md5sum `
if [[ "x${fd5}" == "x${fd5b}" ]] ; then
echo " - same ${fd5} == ${fd5b} in ${base}"
else
echo " - different ${fd5} != ${fd5b} in ${base}"
same="no"
fi
else
echo " - missing in ${base}"
same="no"
fi
fi
done
if [[ "x${same}" == "xyes" ]] ; then
echo " - IDENTICAL"
d=`dirname "${f}"`
mkdir -p "common/${d}"
cp "${ref}/${f}" "common/${f}"
for jar in *.jar ; do
base="${jar%%.jar}"
rm "${base}/${f}"
done
else
echo " - DIFFERENT"
fi
done
mkdir jars
( cd "common" ; jar -cvf "../jars/common.jar" * ; )
for jar in *.jar ; do
base="${jar%%.jar}"
( cd "$base" ; jar -cvfm "../jars/${jar}" META-INF/MANIFEST.MF * ; )
done
SWT 4.3 版生成的 jar 大小为:
swt_common.jar 521865
swt_linux_x64.jar 1373413
swt_linux_x86.jar 1222447
swt_macosx_x64.jar 1416943
swt_macosx_x86.jar 1514651
swt_win32_x64.jar 1434927
swt_win32_x86.jar 1421738
还要记住,为 MacOS 做一个 click-jar-to-run 风格的 SWT 应用程序是很棘手的(-XstartOnFirstThread 选项问题)。所以你可能会考虑移除 MacOS 平台。