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 проекта. |