减少SWT跨平台罐尺寸

时间:2012-07-30 18:09:54

标签: java file size swt

我使用我在上面找到的清晰解释制作了一个跨平台的SWT jar:Create cross platform Java SWT Application

但是,这需要我打包每个平台的罐子,以使其独立于系统,使罐子的总大小约为40MB。对于进行一些解析的项目来说,这有点疯狂。

我尝试使用ProGuard来减小文件大小,但这并不是很有用。我可以从中得出结论,原则上不可能使用SWT创建小型跨平台应用程序吗?

2 个答案:

答案 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平台。