バックグラウンド
バージョン4.1.5のSQL Developerでは、スプラッシュ画面にWM_CLASS(STRING) = oracle-ide-osgi-boot-OracleIdeLauncher があります。これを .desktop ファイルのキー StartupWMClass の値として設定すると、最初はスプラッシュ スクリーンが表示されている間は問題なく動作します。
問題は、SQL Developer のメイン ウィンドウが表示されたときに発生します。この 2 番目のウィンドウには汎用WM_CLASS(STRING) = sun-awt-X11-XFramePeerしかないためです。.desktop ファイルの StartupWMClass にこの一般的な値を設定しても、完全には理解できない理由で機能しません。
この問題の実用的な解決策は、カスタム bash スクリプトを使用する .desktop ファイルです。カスタム スクリプトは、Oracle の起動スクリプトを非同期的に起動し、メイン ウィンドウが表示されるのを待って、最後にその WM_CLASS をプログラムによってスプラッシュ スクリーンで使用される値と同じ値に変更します。その WM_CLASS は、.desktop ファイルによっても参照されます。
カスタム bash スクリプト
これを $HOME/bin/launch-sqldeveloper.sh として保存します
#!/bin/bash
JAVA_HOME=/usr/lib/jvm/java-8-oracle
SQLD_HOME=/opt/sqldeveloper
# Launch Oracle's startup script asynchronously
env JAVA_HOME=$JAVA_HOME $SQLD_HOME/sqldeveloper.sh $* &
i="0"
while [ $i -lt 20 ]
do
# Try to get SQL Developer window ID
WIN_ID=$(xwininfo -root -tree \
| grep -i 'oracle sql developer' \
| grep -oP '(0x[a-f0-9]+)')
# If it is non-empty (window already exists)
if [ -n "$WIN_ID" ]
then
echo "WIN_ID=$WIN_ID"
# Set WM_CLASS property of main window to same value
# that is used for the launcher window
xprop -id $WIN_ID \
-f WM_CLASS 8s \
-set WM_CLASS "oracle-ide-osgi-boot-OracleIdeLauncher"
# and exit loop
break
else
# Otherwise sleep for one second and increment loop counter
echo "Sleeping: $i"
sleep 1s
i=$[$i+1]
fi
done
echo "Done"
.desktop ファイル
[Desktop Entry]
Type=Application
Terminal=false
Name=SQL Developer
Exec=sh -c '$HOME/bin/launch-sqldeveloper.sh %F'
Icon=/opt/sqldeveloper/icon.png
StartupWMClass=oracle-ide-osgi-boot-OracleIdeLauncher