410013796724260
• Webmoney
R335386147728
Z369087728698
Создание 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 проекта. |
