5

Dell デスクトップで Ubuntu 13.10 をセットアップしています。sqldeveloper をインストールし、Desktop/ ディレクトリに sqldeveoper.desktop ファイルを作成してプログラムを起動しました。以下のコードを参照してください。私の問題は次のとおりです。私のデスクトップ画面では、.desktop ファイルが sqldeveloper アイコン (緑色の矢印が付いた丸い db アイコン) として表示されます。アイコンをダブルクリックすると、プログラムが起動します。Unity バーにアイコンが表示された後、画像が「?」に変わります。疑問符記号。

なぜこれが起こるのですか?icon.png (画像) は、デスクトップ ファイルが指している場所にあります。ファイルが Unity バーからパスを正しく認識していない可能性がありますか?

sqldeveloper.desktop コード:

[Desktop Entry]
Type=Application
Version=1.0
Name=SQL Developer
GenericName=Oracle Development Environment
Comment=Proprietary environment for managing Oracle databases
Exec=sqldeveloper %F
Icon=/opt/sqldeveloper/icon.png
Terminal=false
Categories=Development;IDE;
StartupNotify=true

これについての方向性に感謝します。ジョンC

4

2 に答える 2

3

バックグラウンド

バージョン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
于 2017-03-05T21:26:42.460 に答える