Статьи

Включение JRE в установщик платформы NetBeans в Ubuntu Linux

Платформа 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), без которых найти все необходимые компоненты было бы невозможно!