Launch4j: run Java แบบ exe + พก JRE ไปด้วย

โจทย์ที่ได้มา

หมายเหต: รอบนี้เฉพาะ Windows เท่านั้นนนนน !!!

รอบนี้โจทย์ที่ได้มาคือ “อยากใด้โปรแกรมจาวาเล็กๆไว้ run ได้แบบไม่ต้อง install Java” ก็ search ไปมาไปเจอตัวนึงน่าสนใจคือเจ้า Launch4j

จริงๆหลักๆแล้วเจ้า Launchb4j มันเอาไว้แปลงร่างจาก .jar ไปเป็น .exe ที่เหล่าวินโดเลี่ยนคุ้นเคยและยังมีความสามารถในการแอบแปะ jre ไปกับ exe ได้ด้วย โอเช เรามาลองกัน

เขียน App ง่ายๆขึ้นมาตัวนึง

ขั้นแรกเขียน App ง่ายๆขึ้นมาตัวนึงก่อน เพื่อดูว่ามันจะ run ได้ไหม

package ninja.tumit.launch4jdemo;

import java.io.IOException;

/**
 * Hello Launch4j!
 *
 */
public class App 
{
    public static void main( String[] args ) 
    {
        try {
            System.out.println( "Hello Launch4j!" );
            System.in.read();            
        }catch(IOException e) {
            e.printStackTrace();
        }
    }
}

App นี้ไม่ทำอะไรเลยนอกจากพ่นคำว่า “Hello Launch4j!” แล้วก็รอ enter แล้วจึงจะออกจากโปรแกรม

ใช้ Launch4j Maven Plugin

จากนั้นก็ไป search หาวิธีใช้เจ้า launch4j ก็ไปเจอโพสนึงใน Stackoverflow (แต่หา post นั้นไม่เจอซะละ) บอกวิธีใช้ Launch4j Maven Plugin ดีเลยเราใช้ Windows เราใช้ Maven ว่าแล้วก็ copy โครมมมใน pom.xml แก้นิดหน่อยให้เป็นของเราเองซะก็ได้หน้าตาประมาณนี้ประมาณนี้

<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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>ninja.tumit</groupId>
	<artifactId>launch4jdemo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>launch4jdemo</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.11</version>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-shade-plugin</artifactId>
				<version>1.4</version>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>shade</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<shadedArtifactAttached>true</shadedArtifactAttached> <!-- Make the shaded artifact not the main one -->
					<shadedClassifierName>shaded</shadedClassifierName> <!-- set the suffix to the shaded jar -->
				</configuration>
			</plugin>
			<plugin>
				<groupId>com.akathist.maven.plugins.launch4j</groupId>
				<artifactId>launch4j-maven-plugin</artifactId>
				<executions>
					<!-- Command-line exe -->
					<execution>
						<id>l4j-cli</id>
						<phase>package</phase>
						<goals>
							<goal>launch4j</goal>
						</goals>
						<configuration>
							<headerType>console</headerType>
							<outfile>target/launch4jdemo.exe</outfile>
							<jar>target/${artifactId}-${version}-shaded.jar</jar> <!-- 'shaded' is the value set on shadedClassifierName above -->
							<classPath>
								<mainClass>ninja.tumit.launch4jdemo.App</mainClass>
							</classPath>
							<jre>
								<path>../jre</path>
								<minVersion>1.6.0</minVersion>
								<maxVersion>1.8.0</maxVersion>
							</jre>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

</project>

อธิบาย pom กันซะหน่อย จุดที่น่าสนใจก็มี

  • maven-shade-plugin เป็นตัวช่วย pack พวก libs ที่เราต้องใช้ให้เป็น jar ตัวเดียวเก๋ๆ
  • launch4j-maven-plugin ตัวนี้แหละพระเอกของงานมันจะเอา jar ที่ pack เป็นหนึ่งเดียวแล้วไปทำเป็น exe โดย
    • outfile บอกว่าให้เป็น exe ชื่ออะไร เก็บที่ไหน
    • jar บอกว่าจะเอา jar ที่ไหนมาทำ (ก็เอา jar จาก shade ไง)
    • classPath.mainClass ก็ระบุไปว่าจะ execute main ตัวไหน
    • และ jre บอก path ของ jre โปรเจคนี้เราจะเอา jre ไปด้วยจะได้ไม่ต้องเสียเวลา install

ว่าแล้วก็ลอง pack กันเลย

mvn clean package

ถ้าไม่มีอะไรผิดพลาดเราก็จะเห็น launch4jdemo.exe ตัวเป็นๆที่ targat
launch4j-target

เอาไป run กัน

โดยเรากำหนด folder structure ง่ายๆดังนี้

launch4j-folders

  • bin เอาไว้เก็บ exe ก็ไป copy launch4jdemo.exe มาแปะ
  • jre เอาไว้เก็บ jre (จะอธิบายทำไม == ‘)
    ปล. สังเกตุ plugin config ใน <jre> เราถึงระบุว่าให้เป็น ../jre นั้นเอง แล้วก็ไป copy jre มาแปะซะ (folder bin กับ lib)

เราก็จะได้ exe ไว้ run Java app ของเราได้เลย

launch4jdemo-exe

======== จบ(ก่อนตอนนึง)จ้า ========

อ้างอิง: http://launch4j.sourceforge.net/ , https://github.com/lukaszlenart/launch4j-maven-plugin

Advertisements

One thought on “Launch4j: run Java แบบ exe + พก JRE ไปด้วย

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s