Создание exe с использованием плагина gradle launch4j с включенной jre [дубликат]

Вопрос или проблема

Я знаю, что есть похожие вопросы, но они не подходят для моего случая или их решения не работают для меня.

Я создал exe с помощью плагина launch4j, упаковал jre в ту же директорию, что и exe, и указал путь к jre.

Вот мой файл build.gradle :

plugins {
    id 'application'
    id 'org.openjfx.javafxplugin' version '0.1.0'
    id 'edu.sc.seis.launch4j' version '3.0.6'
    id 'org.beryx.jlink' version '2.25.0'
}

javafx {
    version = "22.0.1"
    modules = ['javafx.controls', 'javafx.fxml']
}

launch4j {
    mainClassName="org.tiba.App"
    icon = "${projectDir}/src/main/resources/icon.ico"
    outputDir = "$buildDir/launch4j"
    bundledJrePath="jre"
}

task packageExecutableDistribution(type: Zip) {
    
    archiveFileName="myApp.zip" // Имя zip-файла
    destinationDirectory = file("$buildDir") // Где сохранить zip-файл
    
    from "$buildDir/launch4j" //включить файлы из этой директории
}

task addJreToDistributable(type: Copy) {
    from "javaruntime"  // Путь к вашей папке JRE
    destinationDir = file("$buildDir/launch4j")
}

packageExecutableDistribution.dependsOn createExe
packageExecutableDistribution.dependsOn addJreToDistributable

jar {
    manifest {
        attributes('Main-Class': 'org.tiba.App')
    }
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation libs.junit
    implementation libs.guava
    implementation group: 'org.xerial', name: 'sqlite-jdbc', version: '3.7.2'
}

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(23)
    }
}

application {
    // Определите основной класс для приложения.
    mainClass="org.tiba.App"
}

Вот моя директория после выполнения следующих команд :
gradle createExe
gradle addJreToDistributable
gradle packageExecutableDistribution

Моя директория после генерации exe и упаковки jre

Я ожидал, что exe файл будет работать нормально, используя упакованный jre, но каждый раз, когда я пытаюсь его запустить, появляется всплывающее окно, сообщающее мне, что мне нужен jre 23.0 :Каждый раз, когда я запускаю exe

Ответ или решение

Для создания исполняемого файла (.exe) с использованием плагина Launch4j и упаковкой JRE в Gradle, важно корректно настроить конфигурации в вашем файле build.gradle. Давайте разберемся, как это сделать шаг за шагом.

Шаг 1: Проверка структуры проекта

Убедитесь, что структура вашего проекта выглядит следующим образом:

myapp/
├── build.gradle
├── javaruntime/            // Здесь находится ваш JRE
│   ├── jre/
│   └── ...
├── src/
│   └── main/
│       └── resources/
│           └── icon.ico
└── ...

Шаг 2: Обновление build.gradle

Корректно настройте свой build.gradle. Вам нужно убедиться, что указанный путь к JRE правильный и соответствует тому, где фактически находится ваш JRE. Проверьте, что bundledJrePath имеет правильный относительный путь к JRE.

Вот пример обновленного файла build.gradle:

plugins {
    id 'application'
    id 'org.openjfx.javafxplugin' version '0.1.0'
    id 'edu.sc.seis.launch4j' version '3.0.6'
    id 'org.beryx.jlink' version '2.25.0'
}

javafx {
    version = "22.0.1"
    modules = ['javafx.controls', 'javafx.fxml']
}

launch4j {
    mainClassName = "org.tiba.App"
    icon = "${projectDir}/src/main/resources/icon.ico"
    outputDir = "$buildDir/launch4j"
    bundledJrePath = "jre" // Убедитесь, что путь к JRE корректный
}

task packageExecutableDistribution(type: Zip) {
    archiveFileName = "myApp.zip" // Имя zip-файла
    destinationDirectory = file("$buildDir") // Место сохранения zip-файла
    from "$buildDir/launch4j" // Включение файлов из этого каталога
}

task addJreToDistributable(type: Copy) {
    from "javaruntime/jre"  // Путь к вашей папке JRE
    into "$buildDir/launch4j"  // Куда копируем JRE
}

packageExecutableDistribution.dependsOn createExe
packageExecutableDistribution.dependsOn addJreToDistributable

jar {
    manifest {
        attributes('Main-Class': 'org.tiba.App')
    }
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation libs.junit
    implementation libs.guava
    implementation group: 'org.xerial', name: 'sqlite-jdbc', version: '3.7.2'
}

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(23) // Убедитесь, что версия Java совпадает
    }
}

application {
    // Определите основной класс для приложения.
    mainClass = "org.tiba.App"
}

Шаг 3: Сборка проекта

Запустите команды для сборки вашего проекта, как указано ниже:

gradle createExe
gradle addJreToDistributable
gradle packageExecutableDistribution

Эти команды создадут исполняемый файл и упакуют его вместе с JRE.

Шаг 4: Тестирование исполняемого файла

После выполнения команд, перейдите в папку build/launch4j и запустите сгенерированный .exe файл. Убедитесь, что папка с JRE находится в одном каталоге с вашим .exe файлом.

Проблемы и их решения

Если при запуске возникает предупреждение о том, что требуется JRE 23, возможно, путь к JRE указан неправильно или в вашей конфигурации отсутствуют нужные файлы. Проверьте, чтобы структура JRE была корректной и соответствовала:

jre/
├── bin/
├── lib/
└── etc/

Если проблема продолжается, попробуйте изменить bundledJrePath на абсолютный путь в launch4j или проконсультируйтесь с документацией Launch4j по рекомендациям по совместимости с JRE.

Заключение

Настройка запуска Java-приложений с помощью Launch4j требует внимательного подхода к путям и структуре проекта. Следуя описанным выше шагам, вы сможете успешно скомпилировать и запустить свое приложение с упакованным JRE.

Оцените материал
Добавить комментарий

Капча загружается...