背景
在 SQL Developer 版本 4.1.5 中,初始屏幕具有WM_CLASS(STRING) = oracle-ide-osgi-boot-OracleIdeLauncher。将其设置为 .desktop 文件中的键 StartupWMClass 的值一开始可以正常工作,而初始屏幕可见。
当 SQL Developer 的主窗口出现时,问题就出现了,因为第二个窗口只有通用的WM_CLASS(STRING) = sun-awt-X11-XFramePeer。由于我不完全理解的原因,在您的 .desktop 文件中为 StartupWMClass 设置此通用值不起作用。
此问题的一个可行解决方案是使用自定义 bash 脚本的 .desktop 文件。自定义脚本异步启动 Oracle 的启动脚本,然后等待主窗口出现,最后以编程方式将其 WM_CLASS 更改为启动屏幕使用的相同值。.desktop 文件也引用了 WM_CLASS。
自定义 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