Афоризм
Я в браке третий раз. Опять попался брак.
Наталья Резник
Последние статьи

 • javax.crypto.Cypher
Cимметричное шифрование и дешифрирование
октябрь 2019
 • Random, Math.random
Генерация случайных чисел
октябрь 2019
 • Компонент JDatePicker
Описание и пример компонента JDatePicker
сентябрь 2019
 • Компонент Tree
Описание и пример дерева Tree библиотеки base-gui
сентябрь 2019
 • Grid с навигатором
Описание и пример Gridp с навигатором
сентябрь 2019
 • Компонент Grid
Описание и пример Grid библиотеки base-gui
август 2019
 • Библиотека base-gui
Описание компонентов библиотеки base-gui
август 2019
 • Оператор SELECT
Использование SQL-оператора SELECT
август 2019
 • Сокеты в Android
Использование сокетов в Android
июль 2019

Создание exe-файла из jar

Пользователям Windows привычнее использовать исполняемое приложение в виде exe-файла, нежели архивного jar-файла. Разработчики настольных java-приложений могут плагином launch4j не только обернуть исполняемый архивный jar-файл в оболочку exe-файла, но и включить в него иконку, автора, версию. Также данный плагин позволяет определить минимальную версию используемой JRE. В данной статье рассмотрим использование maven-плагина launch4j для получения exe-файла.

Описание java-примера

В качестве java-примера используем pluggable решение, включающее несколько jar-файлов. На следующем скриншоте представлена структура нашего экспериментального примера. Три файла, выделенные красным прямоугольником и относящиеся к задаче создания исполняемого exe-файла, рассмотриваются ниже.

Несколько слов о структуре примера. Описание с исходными кодами данного java-примера представлено на странице Pluggable решение. Желающие могут поближе познакомиться с технологией динамической загрузки jar-файлов (классов), открыв страницу с подробным описанием исходников. На «выходе» данного примера получаем главный исполняемый модуль plugin-loader.jar, который использует common/plugin-api.jar для загрузки при необходимости (вызове) плагинов plugins/hello1.jar и plugins/hello2.jar.

Графический интерфейс примера, представленный на следующем скриншоте, включает 2 кнопки с надписями 'Plugin1' и 'Plugin2'. При нажатии на одну из кнопок приложение подгружает необходимый плагин, который меняет надпись на кнопке.

Сообщения в консоли

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


Hello world. I am a plugin 1
I am a plugin 2
 

Изменения в исходных кодах

Необходимо отметить, что в модули PluginLoader.java и Boostrap.java были внесены изменения. Так в PluginLoader.java добавлена метка JLabel с отображением в интерфейсе версии Java :

    . . .
    JLabel label = new JLabel("Java version : " + System.getProperty("java.version"));
    label.setSize(200, 24);
    frame.getContentPane().add(label);
    . . .

В класс Boostrap.java внесены изменения, связанные с чтением классов (*.class) из jar'ника, а не из директории bin, как это представлено в исходных кодах. Если этого не сделать, то придётся с собой ещё «таскать» и директорию bin с class'ами.

Листинг класса Boostrap.java

В главный класс Boostrap внесены изменения определения url : ниже исходной закомментированной строки размещается код определения url в jar-файле.

import java.io.File;
import java.lang.reflect.Method;

import java.net.URL;
import java.net.URLClassLoader;

public class Boostrap {

    public static void main(String[] args) throws Exception
    {
        File commonsDir = new File("commons");

        File[] entries = commonsDir.listFiles();
        URL[] urls = new URL[entries.length];

        for (int i = 0; i < entries.length; i++)
            urls[i] = entries[i].toURI().toURL();

        URLClassLoader loader;
        loader = new URLClassLoader(urls, null);

//      URL url = new File("bin").toURI().toURL();

        File file = new File(".");
        String path = "jar:file:/" + file.getCanonicalPath();
        URL url = new URL(path+"/plugin-loader.jar!/");

        URLClassLoader appLoader;
        appLoader = new URLClassLoader(new URL[]{url},loader);

        Class<?> appClass = loader.loadClass("PluginLoader");
        Object appInstance = appClass.newInstance();
        Method m = appClass.getMethod("start");
        m.invoke(appInstance);
    }
}

Оборачивание исполняемого jar в exe-файл

Обычно плагин maven.plugins.launch4j включают в проектный pom.xml файл, в котором формируется и исполняемый jar-файл. Поскольку основная цель данной статьи наглядно продемонстрировать возможность оборачивания jar в exe, то уберем из проектного pom.xml все лишнее, что связано с формированием jar-файла. Правильнее сказать создадим такой pom.xml, который и будет решать основную задачу оборачивания jar в exe.

Cледующий листинг проектного файла pom.xml решает данную задачу. Сам pom.xml существенно упростился и стал более наглядным. В разделе <properties> определяются наименование компании (product.company) и наименование исполняемого файла (exeFileName), а также минимальная версия jdkVersion. Основные настройки плагина определяются в разделе <executions>. В секции <configuration> указываются jar-файл, exe-файл (outfile) и иконка испольняемого файла (icon). Плагин будет ругаться, если не укажете наименование иконки. Следует отметить, что в секции <classPath> необходимо указать главный стартуемый java-класс (mainClas).

<project xmlns="http://maven.apache.org/POM/4.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.demo</groupId>
  <artifactId>plugin-loader</artifactId>
  <packaging>jar</packaging>
  <version>1.0.0</version>
  <name>plugin-loader</name>

  <properties>
      <jdkVersion>1.8</jdkVersion>
      <maven.compiler.source>1.8</maven.compiler.source>
      <maven.compiler.target>1.8</maven.compiler.target>

      <project.build.sourceEncoding>
          UTF-8
      </project.build.sourceEncoding>
      <product.company>MultiModule</product.company>
      <product.title>PluginLoader</product.title>
      <exeFileName>PluginLoader</exeFileName>
  </properties>
  
  <build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
    <plugin>
        <groupId>
            com.akathist.maven.plugins.launch4j
        </groupId>
        <artifactId>launch4j-maven-plugin</artifactId>
        <executions>
            <execution>
                <id>plugin-loader</id>
                <phase>package</phase>
                <goals>
                    <goal>launch4j</goal>
                </goals>
                <configuration>
                    <headerType>gui</headerType>
                    <outfile>${exeFileName}.exe</outfile>
                    <jar>${project.artifactId}.jar</jar>
                    <errTitle>${product.title}</errTitle>
                    <icon>favicon.ico</icon>
                    <classPath>
                        <mainClass>Boostrap</mainClass>
                        <addDependencies>
                            true
                        </addDependencies>
                        <preCp>anything</preCp>
                    </classPath>
                    <jre>
                        <minVersion>
                           ${jdkVersion}
                        </minVersion>
                    </jre>
                    <versionInfo>
                        <fileVersion>
                            ${project.version}
                        </fileVersion>
                        <txtFileVersion>
                            ${project.version}
                        </txtFileVersion>
                        <fileDescription>
                            Swing application
                        </fileDescription>
                        <copyright>
                          Copyright © 2011 ${product.company}
                        </copyright>
                        <productVersion>
                            ${project.version}
                        </productVersion>
                        <txtProductVersion>
                            ${project.version}
                        </txtProductVersion>
                        <companyName>
                            ${product.company}
                        </companyName>
                        <productName>
                            ${product.title}
                        </productName>
                        <internalName>
                            ${exeFileName}
                        </internalName>
                        <originalFilename>
                            ${exeFileName}.exe
                        </originalFilename>
                    </versionInfo>
                </configuration>
            </execution>
        </executions>
    </plugin>
    </plugins>
  </build>
</project>

На следующих скриншотах представлены вкладки свойств созданного PluginLoader.exe.

Скачать исходники

Вы можете скачать исходники рассмотренного примера (40.1 Кб), включающего как jar-файлы, так и exe-файл с проектными pom.xml.

Процесс автоматизации сборки данного примера рассмотрен на странице описания Многомодульного maven проекта.

  Рейтинг@Mail.ru