Навигация
 
 
 
 
Languages
 
 

Имя процесса java приложения в Mac OS X

Вот столкнулся с проблемой, что некоторые java приложения, запущенные в системе, имеют одно и то же имя процесса. Обычно для запуска java приложений под Mac OS X пользуются утилита JavaApplicationStub. И как результат, в Activity Monitor'e висит несколько процессов с именем JavaApplicationStub.

Чтоб наглядно показать проблему, я сделал HelloWorld приложение, и с удивлением обнаружил, что для него имя процесса отображается корректно.

Структура тестового приложения:
Hello World Mac OS application

Имя процесса в системе:
Hello World Mac OS application

Так в тестовом приложении, для того чтоб правильно отобразить имя процесса, оказалось достаточно правильно указать его в файле описания приложения 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();
}

Надеюсь данный пост сможет помочь кому-то в будущем.

Прикрепленный файлРазмер
HelloWorld.app.zip36.95 кб

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Syntax highlight code surrounded by the {syntaxhighlighter OPTIONS}...{/syntaxhighlighter} tags.

Подробнее о форматировании

CAPTCHA
Защита от спам сообщений
 
 
 
 
 
 
  • emmie
  • hooligan
  • cupuyc
  • ESoImk
  • LeKz
 
 
 
© 2006-2009 kobyleha.com