Languages
 
 
 
 
Navigation
 
 
 
 
 
 

Имя процесса 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();
}

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

AttachmentSize
HelloWorld.app.zip36.95 KB

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>

More information about formatting options

 
 
 
 
 
 
  • hooligan
  • cupuyc
  • ESoImk
  • LeKz
  • Anton
 
 
 
© 2006-2008 kobyleha.com