Xpoint
   [напомнить пароль]

О распространении законченного Java-приложения

Метки: [без меток]
[арх]
2005-06-28 13:15:52 [обр] Даниэль Алиевский(35/125)[досье]

Есть задача: написать небольшое Java-приложение научного плана. Вероятно, коммерческое (и недешевое).

Есть желание оформить дистрибутив таким образом, чтобы он обладал максимальной переносимостью. Например, чтобы было как можно легче запустить программу на суперкомпьютерах, про архитектуру которых я ровно ничего не знаю, или Unix-кластерах, про которые я знаю крайне мало.

Спрашивается, как это лучше сделать?

Вроде бы задача банальная, но сходу я не нашел ясного и четкого ответа.

  1. Можно оформить jar-файл с указанием Main-Class в манифесте и распространять его как законченный продукт. Но как, в этом случае, настроить параметры виртуальной машины? Например, умолчательный объем памяти JVM выставляет совершенно смешной - 64 MB (java 1.5.0-03, у меня на компьютере 1.25 GB RAM). Возможно, для некоторых процессоров будет оптимизированный native-код, это потребует параметра -D. И т.п.

Кроме того, я почему-то не уверен, что у всякого пользователя, у которого установлена JRE, непременно щелчок по jar-файлу запустит его (а также что пользователь догадается до этого простого действия).

  1. Можно (как это сделано для нашего "большого" продукта) сделать полноценный Windows-дистрибутив, распаковывающийся в Program Files. Тогда для старта JVM можно сделать свою "запускалку", которая может настроить все, что угодно. Но чтобы создать аналогичные дистрибутивы для всех популярных OS, подобно компании Sun и другим суперкорпорациям, не хватит ни ресурсов, ни квалифицации. Да и странно делать столь большую вещь для сравнительно небольшой расчетной утилиты.
  1. Можно сделать нечто промежуточное: добавить к основному jar-файлу парочку очень простых и "прозрачных" batch-файлов запуска для Windows и для *nix, а также readme.txt, где написано, как ими пользоваться и с какими параметрами надо запускать jar "вручную", если у пользователя не Windows и не *nix.

Однако криво.

  1. Можно ровно ничего не делать (и даже не снабжать jar атрибутом Main-Class), а просто добавить к jar из пункта 1 readme.txt, подробно объясняющий, какая командная строка нужна для запуска jar и где скачать JRE. И все это запаковать в zip (рассчитывая, что распаковать zip-файл удастся и на суперкомпьютере). Или еще проще - оставить один только jar-файл, а правила использования описать на сайте.

Какое же решение здесь традиционное? (Помимо Java Web-start и апплетов, где все сравнительно ясно.)
Не подскажете?

Кстати и еще один попутный вопрос: есть ли смысл (как в апплете) ориентироваться на Java 1.1 и не пользоваться Swing? В этой программе главное алгоритмика, "красоты" Swing как бы ни к чему. При желании можно будет запустить и на древнем JView из поставки Windows. С другой стороны, скачать и инсталлировать нормальную Java не проблема.

спустя 7 дней [обр] Даниэль Алиевский(35/125)[досье]
Удивительно, неужели столь сложный вопрос? У меня это первое "чистое" Java-приложение, почему я и в сомнениях. Но должен же был кто-нибудь уже сталкиваться с подобной задачей. Хотя бы при распространении серверных утилит.
спустя 18 часов [обр] Robinzon(12/14)[досье]

Даниэль Алиевский[досье]
Да лениво просто :ъ
Ну чего тут.. пункт 2 самый нормальный, раз мы говорим о коммерческом недешевом продукте.

Но чтобы создать аналогичные дистрибутивы для всех популярных OS, подобно компании Sun и другим суперкорпорациям, не хватит ни ресурсов, ни квалифицации

Да бросьте, ну что тут сложного? Ваше приложение должно включать JDK ("скачать и инсталлировать нормальную Java" - не канает), ставится простым копированием root папки, на диск. Вопрос тут может быть один - кто скопирует? Те же яйца - берете и за пару часов стряпаете GUI'ёвое Java-приложение, которое будет дергать все туже jdk что у Вас где-то сидит.

Что касается

запустить программу на суперкомпьютерах, про архитектуру которых я ровно ничего не знаю

то тут уж зависит от этого самого лего-го и того кто им управляет. Если Java поддерживается вообще то должно работать. В конце концов если вам попадется что-то ублюдочное (по хорошему, заранее надо требования узнать) - сделаете хак, специально для этого случая.

спустя 5 часов [обр] Даниэль Алиевский(35/125)[досье]

Robinzon[досье]
Что-то не совсем я понял. Что такое GUT-евое Java-приложение? Кто его инсталлирует и запустит? Вообще как-то несерьезно - не самописный же инсталлятор делать, это куча работы и кривизна. По крайней мере, под Windows используются стандартные инсталляторы.

Вообще, я не очень представляю, как выглядят инсталляторы под *nix. Для Windows все просто: одним из стандартных инструментов делается соответствующий EXE-файл, который согласно сценарию распаковывается и копирует все куда надо (создает иконки, группы и все прочее). А для других платформ?

И сколько предлагается включить вариантов JRE? На http://java.com/en/download/manual.jsp представлены Windows, Solaris и Linux. А что делать с Mac, FreeBSD и кучей других платформ? Для Java, допустим, уже существуют порты для всех платформ, но даже Sun не берется писать для них инсталляторы. Да и вообще, не очень хорошая мысль фиксировать JRE. На более новых версиях алгоритмика может ускориться, а внешний вид улучшиться.

Если кому-то и будет важно запускать приложение на не-Windows-платформах, то, скорее всего, это будут большие компьютеры-числодробилки. Чистый JAR-файл запустится и там.

спустя 17 часов [обр] Robinzon(12/14)[досье]
Что такое GUT-евое Java-приложение?

не GUT-евое - GUI'вое ;) т.е GUI приложение, на Swing например

не самописный же инсталлятор делать, это куча работы и кривизна

за часы пишется - если Вы не предполагаете чего-то особого то это просто апликуха которая скопирует файлы с дистрибутива на диск и проставит пару configuration properties. Но никто не мешает Вам воспользоваться каким-нибудь win инсталятором, хотя тогда кросс платформенность инсталяшки отпадает.

И сколько предлагается включить вариантов JRE?

по количеству OS to support

А что делать с Mac, FreeBSD и кучей других платформ?

да не пишет никто приложение которое работает ВЕЗДЕ. Ну если уж Вам позарез надо поддержать ВСЕ - то можно заставлять юзера лезть самому и качать JDK.

для старта JVM можно сделать свою "запускалку"
добавить к jar из пункта 1 readme.txt, подробно объясняющий, какая командная строка нужна для запуска jar

Чем плох вариант с переменной окружения JAVA_HOME? Все что надо укажите как параметры командной строке.

спустя 23 часа [обр] Даниэль Алиевский(35/125)[досье]

А я-то пытался найти в google GUT Java, все натыкался на немецкие сайты :)

т.е GUI приложение, на Swing например

Тогда вообще ничего не понятно. Мое научное приложение само по себе тоже является Swing-овским. Если инсталлятор - тоже обычное Swing-овское приложение, то кто и как, в свою очередь, инсталлирует его? Или предлагается сам инсталлятор оформить по варианту 1 - простой автозапускаемый JAR-файл? (Понятно, что здесь требований меньше - не нужна ни документация, не специальные параметры JVM.)

это просто апликуха которая скопирует файлы с дистрибутива на диск и проставит пару configuration properties.

Но это же не единственный (и не главный) вопрос, который решает инсталлятор. Просто "скопировать файлы" - задача тривиальная, для этого достаточно предложить ZIP-файл. Распаковать его сможет практически любой пользователь. А если вместо ZIP использовать JAR, то отпадет и потребность в распаковке.

Главное - кроссплатформенным образом запустить Java-машину с определенными параметрами, вроде размера памяти или пути к native-библиотекам. Как это сделать?

А что Вы имеете в виду под configuration properties?

да не пишет никто приложение которое работает ВЕЗДЕ. Ну если уж Вам позарез надо поддержать ВСЕ - то можно заставлять юзера лезть самому и качать JDK.

Что, правда не пишут? Это же декларируется как одно из основных достоинств Java :) В случае приложения на Perl, например, с этим проблем нет - никто особо не задумывается, где оно будет исполняться. (Кроме, конечно, неполной переносимости внутри самого Perl.)

Не то чтобы позарез нужно поддерживать все. Скорее, хочется сделать "работоспособность везде" маркетинговым преимуществом, не тратя слишком много усилий (раз уж Java это обеспечивает). Хочется вообще не думать о существовании разных платформ - по идее, Java уже "подумала" за меня. Простой самозапускаемый JAR-файл, со встроенными в него help-ом, readme, license и прочими прибамбасами, был бы идеальным вариантом, если бы не дурацкая проблема с объемом памяти (которую Sun почему-то решила ограничить 64 мегабайтами).

Можно, конечно, попытаться запустить из Java вторую Java-машину (с нужными параметрами), поискав ее на диске. Но это, пожалуй, еще кривее, чем учить пользователя правильному запуску JAR-файла с надлежашими параметрами.

спустя 1 день 4 часа [обр] Robinzon(12/14)[досье]

Даниэль Алиевский[досье]
кажется я начинаю понимать, что Вас смущает - именно стартовый запуск чего бы то ни было. Должен Вас огорчить - я такого способы не знаю. Кроссплатформенность Java приложения подразумевает "работаю везде", а не соглашение, по которому все ОС запускают это дело одинаково. Что там не так с командной строкой, которая передает св-ва JVM? Есть сильные отличия от ОС к ОС? - давайте обсуждать конкретно их.

У вас всегда есть такой вариант - сделать 3-4 стартовых скрипта, которые просто запустят приложение или инсталятор (именно по этой причине - писать надо будет только простенький однострочный скрипт запуска - я и предложил кроссплатформенный инсталятор), а на все остальное - читайте, уважаемый пользователь, readme про то как запускать Java приложение на вашей дурацкой ОС ;)
That's the way - такие приложения, я например, встречал не раз.

Но это же не единственный (и не главный) вопрос, который решает инсталлятор.

Скажите тогда, какие еще задачи Вы на него возлагаете?
Я скажу сразу - сторонник того что приложения должны инсталироваться только копированием (ну и распаковкой если были сжаты), ненавижу и считаю security-дырой "windows registry".

спустя 4 минуты [обр] Robinzon(12/14)[досье]
Или предлагается сам инсталлятор оформить по варианту 1 - простой автозапускаемый JAR-файл? (Понятно, что здесь требований меньше - не нужна ни документация, не специальные параметры JVM.)
да, именно так - будет платфомозависимый скрипт, в котором всего-то и будет что одна строка для запуска вашей инсталяшки, а памяти тут хватит и на 32M )
спустя 26 дней [обр] Марат Радченко[досье]
спустя 6 месяцев [обр] Денис Имаев(219/273)[досье]

Java WebStart Вам не подходит? Эта технология специально разработана для подобного рода вещей.

Необязательно распространять один JAR и пытаться впихнуть в него все, что можно.
Можно снабдить дистрибутив набором скриптов для разных платформ.

спустя 1 месяц 18 дней [обр] Алексий[досье]

Не знаю как вы, но когда мне надо было сделать standalone application - я просто добавлял
 к дистибу пару библиотек из IntelliJ Idea. (работаю под виндой)
    и потом, через .bat файл делал все настройки.

  хотя, под все платформы это не прокатит

спустя 3 дня [обр] Даниэль Алиевский(35/125)[досье]
Большое спасибо всем за советы.
Наверно, тему можно закрывать.
Powered by POEM™ Engine Copyright © 2002-2005