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

  Tagged

Вот столкнулся с проблемой, что некоторые 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();
}

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

Share this
AttachmentSize
HelloWorld.app_.zip36.95 KB

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

CAPTCHA
Бот ты или человек?
 
© 2006-2010 kobyleha.com