Платформа NetBeans предоставляет очень хорошо интегрированную инфраструктуру установщиков ( NBI ), которая позволяет создавать собственные установщики для различных платформ (в частности, Linux и Windows). Это делает кросс-платформенным образом то, что делают различные другие установщики (NSIS, IzPack и т. Д.), Но с преимуществом знания платформы NetBeans и ее полной настройки.
Не сразу понятно, как связать JVM, поскольку при использовании опции «Пакет как | Установщики» в IDE NetBeans 7.0 по умолчанию будут создаваться установщики, которые зависят от уже установленной JVM в системе. В этом руководстве, с помощью Geertjan и Dmitry, мы стремимся настроить процесс сборки так, чтобы:
- Собственные установщики будут созданы для (как минимум) Windows и Linux.
- Эти собственные установщики будут иметь встроенную JVM, и, следовательно, не требуют, чтобы система, в которой они установлены, имела предварительно установленную JVM.
- Убедитесь, что установленное приложение платформы NetBeans использует частную JRE (фактически ту же, что была в комплекте), которая поэтому не видна другим приложениям в системе.
Получение хорошего цикла инсталлятора с частной JRE под Ubuntu Linux (Windows, очень похожая), для сборки инсталляторов Windows и Linux из Ubuntu.
Создание JRE для связывания
# Создание каталога, в котором я буду хранить JRE для объединения в различные установщики,
mkdir ~ / bundled_jres
cd ~ / bundled_jres
# 1. Установите Linux JRE
cp -r / some / path / to / linux / jre linux_jre ( если используется Windows, используйте xcopy / E или Windows Explorer)
cd linux_jre
# pack200 it
pack200 -J-Xmx1024m lib / rt.jar.pack.gz lib / rt.jar
# zip it
zip -9 -r -y ../linux_jvm ZIP
cd ..
# get unzipsfx для Linux
cp / usr / bin / unzipsfx unzipsfx.bin
# concatenate sfx header с полезной нагрузкой zip, в результате получается самораспаковывающийся исполняемый файл jvm
cat unzipsfx.bin linux_jvm.zip> linux_jvm.bin (при использовании Windows используйте copy / B unzipsfx.bin + linux_jvm.zip linux_jvm.bin)
# 2 Настройка Windows JRE
cp -r / some / path / to / windows / jre windows_jre (если используется Windows, используйте xcopy / E или Windows Explorer)
cd windows_jre
# pack200 it
pack200 -J-Xmx1024m lib / rt.jar.pack. gz lib / rt.jar
# zip it
zip -9 -r -y ../windows_jvm.zip.
cd ..
# get unzipsfx.exe для Windows, можно найти в ftp://ftp.info-zip.org/pub/infozip/win32/unz600xn.exe
cp /path/to/unzipsfx.exe unzipsfx.exe
# concatenate sfx заголовок с полезной нагрузкой zip, в результате получается самораспаковывающийся исполняемый файл jvm (Windows)
cat unzipsfx.exe windows_jvm.zip> windows_jvm.exe (для Windows используйте copy / B, как указано выше).
На данный момент у нас есть набор JVM (не обязательно только Windows и Linux), которые мы можем повторно использовать для вечности, или обновлять, когда становятся доступны новые важные выпуски JRE.
Настройте build.xml для NBI
Теперь откройте <netbeans-install-dir> /harness/nbi/stub/build.xml: найдите цель
«-generate-bundles» и замените вызов <create-bundle> следующим набором условных звонков (сменив / home / ernest на ваш любимый домашний каталог):
<!-- Linux installer -->
<if property="platform" value="linux">
<create-bundle root="${output.dir}/registry-temp" platform="${platform}"
target="${bundles.release.dir}/${bundle.files.prefix}-${platform}.${bundle.extention}">
<component uid="${main.product.uid}" version="1.0.0.0.0"/>
<property name="nbi.bundled.jvm.file" value="/home/ernest/bundled_jres/linux_jvm.bin"/>
</create-bundle>
</if>
<!-- Solaris installer -->
<if property="platform" value="solaris">
<create-bundle root="${output.dir}/registry-temp" platform="${platform}"
target="${bundles.release.dir}/${bundle.files.prefix}-${platform}.${bundle.extention}">
<component uid="${main.product.uid}" version="1.0.0.0.0"/>
<property name="nbi.bundled.jvm.file" value="/home/ernest/bundled_jres/linux_jvm.bin"/>
</create-bundle>
</if>
<!-- Windows installer -->
<if property="platform" value="windows">
<create-bundle root="${output.dir}/registry-temp" platform="${platform}"
target="${bundles.release.dir}/${bundle.files.prefix}-${platform}.${bundle.extention}">
<component uid="${main.product.uid}" version="1.0.0.0.0"/>
<property name="nbi.bundled.jvm.file" value="/home/ernest/bundled_jres/windows_jvm.exe"/>
</create-bundle>
</if>
<!-- Mac installer -->
<if property="platform" value="macosx">
<create-bundle root="${output.dir}/registry-temp" platform="${platform}"
target="${bundles.release.dir}/${bundle.files.prefix}-${platform}.${bundle.extention}">
<component uid="${main.product.uid}" version="1.0.0.0.0"/>
</create-bundle>
</if>
(Выше можно было иметь несколько JVM для нескольких платформ, и просто подключить их правильно, как здесь. Например, в установщике Mac выше мы не связываем никакую JVM.)
После этого сгенерированные установщики должны запустить их в комплекте JVM, но само приложение не будет использовать эту JVM и искать системную JVM. Чтобы скорее позволить ему зависеть от этой частной JRE, продолжайте …
Позволяя приложению зависеть от частной JVM.
Теперь мы редактируем файл ConfigurationLogic.java в <netbeans-install-dir> / harness / nbi / stub / ext / components / products / helloworld / src / org / mycompany / ConfigurationLogic.java для (a) извлечения ранее связанного JRE в подкаталог с именем «jre» при установке и (b) обеспечения его удаления при удалении приложения.
Добавить оператор импорта:
import org.netbeans.installer.utils.system.launchers.LauncherResource;
В конце установки () добавьте:
File javaHome = new File(System.getProperty("java.home"));
File target = new File(installLocation, "jre");
try {
FileUtils.copyFile(javaHome, target, true); //FileUtils is one of the NBI core classes, already imported in ConfigurationLogic.java
} catch (IOException e) {
throw new InstallationException("Cannot copy JRE",e);
}
// set permissions:
File binDir = new File(target, "bin");
for (File file : binDir.listFiles()) {
try {
file.setExecutable(true);
} catch (Exception ex) { ex.printStackTrace(); }
}
// to add uninstaller logic:
SystemUtils.getNativeUtils().addUninstallerJVM(new LauncherResource(false, target));
и в конце удаления (), но непосредственно перед progress.setPercentage (Progress.COMPLETE) ;, добавьте
File jre = new File(installLocation, "jre"); if (jre.exists()) { try { for (File file : FileUtils.listFiles(jre).toList()) { FileUtils.deleteOnExit(file); } FileUtils.deleteOnExit(installLocation); } catch (IOException e) { //ignore } }
Подключите пользовательский файл конфигурации приложения в соответствии с подходом Geertjan
http://blogs.sun.com/geertjan/entry/support_for_custom_configuration_files , но убедитесь, что my.conf содержит строку
jdkhome="jre"
это будет относительный путь к JRE, который был установлен методом install () в ConfigurationLogic.
Наконец, чтобы создать наш набор установщиков для различных платформ и их соответствующих JRE, щелкните правой кнопкой мыши по вашему пакету приложений, выберите «Пакет как», затем выберите «Установщики». Чтобы создать более компактные установщики (сжимая файлы .jar с помощью pack200), вы можете включить это, щелкнув правой кнопкой мыши, выбрав «Свойства», выбрав «Установщик» и отметив «Использовать сжатие pack200» — это приводит к тому, что сборка установщиков занимает совсем немного времени. дольше из-за сжатия pack200, но ваши пользователи будут очень рады иметь значительно меньшие установочные файлы для загрузки.
Огромное спасибо Гертьяну Виленгу и Дмитрию Липину (гуру установщика NetBeans), без которых найти все необходимые компоненты было бы невозможно!