Имя процесса 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 |
Оставьте новый коментарий