我使用我在上面找到的清晰解释制作了一个跨平台的SWT jar:Create cross platform Java SWT Application
但是,这需要我打包每个平台的罐子,以使其独立于系统,使罐子的总大小约为40MB。对于进行一些解析的项目来说,这有点疯狂。
我尝试使用ProGuard来减小文件大小,但这并不是很有用。我可以从中得出结论,原则上不可能使用SWT创建小型跨平台应用程序吗?
答案 0 :(得分:0)
好吧,您可以让您的程序不包含SWT jar并在安装或首次运行期间下载正确的程序。可能不是一个好主意,但可能。否则,我只是在这种情况下使用Swing。
答案 1 :(得分:0)
可以将所有所需平台之间通用的类文件提取到单独的jar中。然后从平台特定的jar中删除这些公共类。
在运行时,您可以将常用jar和特定于平台的jar添加到URLClassLoader。
适合我。
这是我用来重新包装罐子的旧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平台。