Имя процесса java приложения в Mac OS X
Вот столкнулся с проблемой, что некоторые java приложения, запущенные в системе, имеют одно и то же имя процесса. Обычно для запуска java приложений под Mac OS X пользуются утилита JavaApplicationStub. И как результат, в Activity Monitor'e висит несколько процессов с именем JavaApplicationStub.
Чтоб наглядно показать проблему, я сделал HelloWorld приложение, и с удивлением обнаружил, что для него имя процесса отображается корректно.
Структура тестового приложения:
Имя процесса в системе:
Так в тестовом приложении, для того чтоб правильно отобразить имя процесса, оказалось достаточно правильно указать его в файле описания приложения Info.plist (ключ CFBundleName):
<?xml version="1.0" encoding="UTF-8"?>
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>JavaApplicationStub</string>
<key>CFBundleGetInfoString</key>
<string>HelloWorld swing application for Mac OS X</string>
<key>CFBundleIconFile</key>
<string>HelloWorld.icns</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>1.0</string>
<key>CFBundleName</key>
<string>HelloWorld</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>Java</key>
<dict>
<key>ClassPath</key>
<array>
<string>$JAVAROOT/HelloWorld-1.0-SNAPSHOT.jar</string>
</array>
<key>JVMVersion</key>
<string>1.5*</string>
<key>MainClass</key>
<string>com.kobyleha.HelloWorld.App</string>
<key>VMOptions</key>
<array>
<string>-Xms2M</string>
<string>-Xmx64M</string>
</array>
<key>WorkingDirectory</key>
<string>$APP_PACKAGE/Contents/Resources/</string>
</dict>
</dict>
</plist>
Пересмотрев свои приложения, в которых были проблемы, я выяснил следующе два условия, при которых имя процесса отображается неправильно:
- Приложение использует swt библиотеку, а не swing (в данном случае имя процесса будет 'SWT')
- Приложение - скрытая утилита без графической оболочки, не отображающаяся в доке (достигается добавлением в Info.plist дополнительного String ключа 'LSUIElement' равного '1')
Решение проблемы в swt приложении оказалось достаточно простым. Есть специальный метод, позволяющий указать имя процесса непосредственно из кода. Единственное важное замечание здесь, что имя должно быть указано до инициализации дисплея и шелла, иначе ваш вызов будет просто проигнорирован (с чем я и столкнулся в своём приложении):
public static void main(String[] args) {
Display.setAppName("HelloWorld");
display = new Display();
shell = new Shell(display, SWT.NO_TRIM | SWT.ON_TOP);
...
}
В случае же со скрытым приложением, выяснилось, что имя процесса каким-то образом завязано с инициализацией графической составляющей jvm от apple. И поэтому единственным выходом оказалось создание скрытого и не используемого фрейма:
public static void main(String[] args) {
JFrame f = new JFrame();
f.pack();
f.setVisible(false);
// Your hidden application code
f.dispose();
}
Надеюсь данный пост сможет помочь кому-то в будущем.
| Attachment | Size |
|---|---|
| HelloWorld.app.zip | 36.95 KB |
»
- 1301 reads
- English
Post new comment