Java νλ‘κ·Έλ¨ λ°°ν¬νκΈ°
3.
λΉλ μ€μ - pom.xml
4.
JAR νμΌ μμ± - mvn clean package
a.
μ±μ΄λ¦-0.0.1-jar-with-dependencies.jar
5.
App.jar λ‘ μ΄λ¦ λ³κ²½
6.
JAR μ€ν ν
μ€νΈ (run.bat)
7.
Installerμ ν¬ν¨ν νμΌ μ€λΉ
a.
App.jar
b.
lib
c.
icon.ico
8.
Installer νμΌ μμ± (install.bat)
jpackage
μλ° λ°°ν¬μ© ν¨ν€μ§ μμ± νλ‘κ·Έλ¨
β’
Java λ°νμ(JRE)μ ν¬ν¨νμ¬ λ
립 μ€νν μ ν리μΌμ΄μ
μμ± κ°λ₯
β’
.msi λλ .exe μ€μΉ νμΌ λ±μΌλ‘ λ°°ν¬ κ°λ₯
β’
μμ΄μ½, μ΄λ¦, λ²μ , λΌμ΄μ μ€ λ±λ μ§μ κ°λ₯
β’
JavaFX μ± λ°°ν¬ μ νΉν μ μ©
κΈ°λ³Έ μμ
jpackage ^
--type exe ^
--name MyApp ^
--input . ^
--main-jar App.jar ^
--main-class com.aloha.Main ^
--icon icon.ico ^
--win-dir-chooser ^
--win-menu ^
--win-shortcut
Bash
볡μ¬
μ£Όμ μ΅μ
μ΅μ
| μ€λͺ
|
--type <νμ> | ν¨ν€μ§ νμμ μ§μ . μ: app-image (μ± μ΄λ―Έμ§), exe (μλμ° μ€ν νμΌ) |
--name <name> | μ€ννμΌ λλ μ± μ΄λ―Έμ§μ μ΄λ¦μ μ§μ |
--input <jar νμΌ κ²½λ‘> | jar νμΌμ μμΉλ₯Ό μ§μ . μλ κ²½λ‘ λλ μ λ κ²½λ‘ κ°λ₯ |
--main-jar <jar νμΌλͺ
> | Main ν΄λμ€λ₯Ό κ°μ§κ³ μλ jar νμΌ λͺ
μ μ§μ |
--dest <κ²½λ‘λͺ
> | μ€μΉνμΌ λλ μ± μ΄λ―Έμ§κ° μ μ₯λ μμΉλ₯Ό μ§μ (λλ -dλ‘ κ°λ¨ν μ¬μ© κ°λ₯) |
--java-options <μ΅μ
> | JVM μ΅μ
μ μ§μ . μ: -Dfile.encoding=UTF-8 (νκΈ κΉ¨μ§ λ°©μ§) |
--icon <μμ΄μ½ μ΄λ¦> | μμ΄μ½ νμΌμ μ΄λ¦μ μλμ λλ μ λμ μμΉλ‘ μ§μ |
--description <μ± μ€λͺ
> | μ±μ λν μ€λͺ
μ μ
λ ₯. μ: "Application to verify truth of personal custom ID" |
--win-console | λͺ
λ Ή ν둬ννΈ μ°½μ 보μ¬μ£Όλ©° μ€ν (λλ²κΉ
μ©, λ°°ν¬ μ λΆνμ) |
--app-version <λ²μ > | μ± λ²μ μ μ§μ . λμΌν λ²μ μ΄ μμ±λλ©΄ μλ¬ λ°μ |
--install-dir <ν΄λλͺ
> | μ€ννμΌμ΄ λ§λ€μ΄μ§ μμΉλ₯Ό μ§μ . μ: Program Files λλ AppData ν΄λμ νμ ν΄λ |
--win-shortcut | λ°ννλ©΄μ λ°λ‘κ°κΈ°λ₯Ό μμ± |
jpackage λͺ
λ Ήμ΄μ μ£Όμ μ΅μ
λ€μ μ 리ν κ²μΌλ‘, ν¨ν€μ§ μμ
μ ν λ μ μ©νκ² μ¬μ©ν μ μμ΅λλ€.
Maven
Java κΈ°λ°μ νλ‘μ νΈ λΉλ, μμ‘΄μ± κ΄λ¦¬, λ°°ν¬, ν
μ€νΈ λ±μ λμμ£Όλ νλ‘μ νΈ κ΄λ¦¬ λꡬ
β’
μμ‘΄μ± κ΄λ¦¬ (μμ‘΄ λΌμ΄λΈλ¬λ¦¬ κ΄λ¦¬)
β’
λΉλ μλν
β¦
μ»΄νμΌ
β¦
ν
μ€νΈ
β¦
ν¨ν€μ§
λ€μ΄λ‘λ
(Windows) apache-maven-3.9.9-bin.zip
μμ€ν νκ²½ λ³μ μΆκ°
1.
μμ€ν
νκ²½ λ³μ νΈμ§
2.
PATH
3.
C:\~\SETUP\apache-maven-3.9.9\bin
WiX Toolset
Windowsμ© μ€μΉ νλ‘κ·Έλ¨(.msi νμΌ λ±)μ λ§λ€ μ μκ² ν΄μ£Όλ μ€ν μμ€ λꡬ λͺ¨μμ
λλ€.
λ€μ΄λ‘λ
wix314-binaries.zip νμΌμ λ€μ΄λ‘λ λ°μ μμΆν΄μ ν©λλ€.
μμ€ν νκ²½λ³μ
1.
μμ€ν
νκ²½λ³μ
2.
PATH
3.
C:\~\wix314-binaries
μμΆ ν΄μ ν ν΄λλ₯Ό μμ€ν
νκ²½ λ³μ ν¨μ€μ μΆκ°ν΄μ£ΌμΈμ
λΉλ μ€μ - pom.xml
pom.xml (JavaFX νλ‘κ·Έλ¨)
<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.aloha</groupId> <!-- μ‘°μ§ID -->
<artifactId>test</artifactId> <!-- νλ‘μ νΈID -->
<version>0.0.1</version> <!-- νλ‘μ νΈ λ²μ -->
<!-- μμ± -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>23</maven.compiler.source>
<maven.compiler.target>23</maven.compiler.target>
<jdk.version>23</jdk.version> <!-- JDK λ²μ -->
<javafx.version>23</javafx.version> <!-- JavaFX λ²μ -->
</properties>
<!-- μμ‘΄μ± λΌμ΄λΈλ¬λ¦¬ -->
<dependencies>
<!-- javaFX -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>${javafx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>${javafx.version}</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<scope>provided</scope>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.32</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Java μ»΄νμΌλ¬ -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>${jdk.version}</release>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<!-- JavaFX μ€ν -->
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.6</version>
<executions>
<execution>
<id>default-cli</id>
<configuration>
<mainClass>com.aloha.Main</mainClass>
</configuration>
</execution>
</executions>
</plugin>
<!-- JAR μμ± -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifestEntries>
<Main-Class>com.aloha.Main</Main-Class>
</manifestEntries>
</archive>
</configuration>
</plugin>
<!-- λΌμ΄λΈλ¬λ¦¬ ν¬ν¨ fat JAR μμ± -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.aloha.Main</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
XML
볡μ¬
JAR νμΌ μμ± - mvn clean package
β’
μ±μ΄λ¦-0.0.1-jar-with-dependencies.jar
mvn clean package λͺ
λ Ήμ΄λ‘ JAR νμΌμ μμ±ν©λλ€.
mvn clean package
Bash
볡μ¬
mvn μ£Όμ λͺ λ Ήμ΄
λͺ
λ Ήμ΄ | μ€λͺ
|
mvn clean | μ΄μ λΉλ κ²°κ³Ό(target λλ ν 리)λ₯Ό μμ |
mvn package | μ»΄νμΌ + ν
μ€νΈ ν JAR/WAR νμΌλ‘ ν¨ν€μ§ |
mvn compile | src/main/java μ½λ μ»΄νμΌ |
mvn test | src/test/javaμ μλ ν
μ€νΈ μ½λ μ€ν |
mvn install | ν¨ν€μ§ν νμΌμ λ‘컬 Maven μ μ₯μμ μ€μΉ (~/.m2/repository) |
mvn deploy | μ격 Maven μ μ₯μλ‘ μ
λ‘λ (CI/CDμ©) |
mvn validate | pom.xml νμΌ κ΅¬μ‘°μ μ€μ νμΈ |
mvn verify | ν
μ€νΈ λ° ν΅ν© κ²μ¬κΉμ§ νμΈ |
mvn site | νλ‘μ νΈ μ 보λ₯Ό HTML ννμ 리ν¬νΈλ‘ μμ± |
mvn dependency:tree | μμ‘΄μ± νΈλ¦¬λ₯Ό κ³μΈ΅ κ΅¬μ‘°λ‘ μΆλ ₯ |
mvn dependency:list | νλ‘μ νΈμ ν¬ν¨λ λͺ¨λ μμ‘΄μ± λμ΄ |
mvn archetype:generate | Maven ν
νλ¦Ώ(archetype) κΈ°λ°μΌλ‘ μ νλ‘μ νΈ μμ± |
mvn help:effective-pom | μ€μ λ‘ μ μ©λλ POM μ€μ μΆλ ₯ (μμ/νλ‘νμΌ ν¬ν¨) |
mvn versions:display-dependency-updates | μ
λ°μ΄νΈ κ°λ₯ν λΌμ΄λΈλ¬λ¦¬ λ²μ νμΈ (μΆκ° νλ¬κ·ΈμΈ νμ) |
App.jar λ‘ μ΄λ¦ λ³κ²½
JAR μ€ν ν μ€νΈ (run.bat)
java -jar App.jar
Bash
볡μ¬
JavaFX μ κ²½μ° λΌμ΄λΈλ¬λ¦¬ λ° λͺ¨λκ³Ό ν¨κ» μ€νλμ΄μΌνλ κ²½μ°κ° μλ€.
JavaFX λΌμ΄λΈλ¬λ¦¬
β’
javaFX SDK
β’
javaFX jmods
javaw --module-path "lib\javafx-sdk-23.0.2\lib" --add-modules javafx.controls,javafx.fxml -jar App.jar
Bash
볡μ¬
μ΄ λͺ
λ Ήμ΄λ₯Ό μ½κ² μ€νμν€μ§ μν΄μ λ°°μΉ νλ‘κ·Έλ¨ run.bat μ λ§λ€μ΄λ³΄μ.
@echo off
REM JavaFX λΌμ΄λΈλ¬λ¦¬ κ²½λ‘ μ€μ
set FX_LIB=lib\javafx-sdk-23.0.2\lib
REM JavaFX μ ν리μΌμ΄μ
μ€ν
start javaw --module-path "%FX_LIB%" ^
--add-modules javafx.controls,javafx.fxml ^
-jar App.jar
exit
Bash
볡μ¬
Installer μ ν¬ν¨ν νμΌ μ€λΉ
π¦ install
βββ π App.jar
βββ π icon.ico
βββ π lib
Bash
볡μ¬
graph TD install["π¦ install"] install --> App["π App.jar"] install --> Icon["π icon.ico"] install --> lib["π lib"]
Mermaid
볡μ¬
Installerλ‘ μ€μΉ λμ΄μΌ ν νμΌμ μ€λΉν΄μ£ΌμΈμ!
Installer λ₯Ό ν΅ν΄ νλ‘κ·Έλ¨μ΄ μ€μΉ λλ©΄ μλμ κ°μ κ²½λ‘μ νλ‘κ·Έλ¨μ΄ μμ±λ©λλ€.
C:\Program Files\MyApp\
βββ app\
β βββ App.jar
β βββ icon.ico
β βββ lib\
β βββ javafx-base-21.0.2.jar
β βββ javafx-controls-21.0.2.jar
βββ MyApp.exe
βββ runtime\
β βββ (μ¬μ©λ JDK λͺ¨λ)
Markdown
볡μ¬
μ΄ λ, MyApp.exe νλ‘κ·Έλ¨μ μ€ννλ©΄ app ν΄λ μλ App.jar λ₯Ό μ€ννμ¬ μλ° νλ‘κ·Έλ¨μ μ€νμμΌ μ€λλ€.
λλ ν 리/νμΌ | μ€λͺ
|
app/ | μ¬μ©μκ° μ§μ ν JAR νμΌ, 리μμ€, λΌμ΄λΈλ¬λ¦¬ νμΌλ€μ΄ μ μ₯λλ λλ ν 리 |
MyApp.exe | Windows μ€ν νμΌ (λ°ννλ©΄/μμλ©λ΄ λ°λ‘κ°κΈ°μ λμ) |
runtime/ | λͺ¨λνλ JDK λ°νμ νκ²½ (jlinkλ‘ μμ±λ μ΅μ JRE) |
Installer νμΌ μμ± (install.bat)
jpackage ^
--type exe ^
--input . ^
--name App ^
--main-jar App.jar ^
--main-class com.aloha.Main ^
--java-options "--module-path app/lib/javafx-sdk-23.0.2/lib --add-modules javafx.controls,javafx.fxml -Xmx512m -Djava.awt.headless=false" ^
--icon icon.ico ^
--win-dir-chooser ^
--win-menu ^
--win-shortcut
Bash
볡μ¬
--module-path app/lib/javafx-sdk-23.0.2/lib
Bash
볡μ¬
μ€μΉλ νμΌλ€μ app ν΄λ μλ ν¬ν¨λκΈ° λλ¬Έμ MyApp.exe κΈ°μ€μμ app ν΄λ μλμ lib λ₯Ό μ°Έμ‘°νλλ‘ μ§μ ν©λλ€.
Installer λ₯Ό μμ±νλ λ°°μΉ νλ‘κ·Έλ¨μ λ§λ€μ΄ 보μ.
β’
@echo off
setlocal
echo [INFO] Creating installer for App...
jpackage ^
--type exe ^
--input . ^
--name MyApp ^
--main-jar App.jar ^
--main-class com.aloha.Main ^
--java-options "--module-path app/lib/javafx-sdk-23.0.2/lib --add-modules javafx.controls,javafx.fxml -Xmx512m -Djava.awt.headless=false" ^
--icon icon.ico ^
--win-dir-chooser ^
--win-menu ^
--win-shortcut
echo [INFO] Installer build complete.
pause
Bash
볡μ¬