必要なすべてのプラットフォーム間で共通のクラス ファイルを個別の jar に抽出することができます。次に、これらの共通クラスをプラットフォーム固有の jar から削除します。
実行時に、共通の jar とプラットフォーム固有の jar の両方を URLClassLoader に追加します。
私のために働きます。
これは、jar を再パックするために使用した古いシェル スクリプトです。うまくいくことを願っています。
#!/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 プラットフォームの削除を検討するかもしれません。