Search

Java ํ”„๋กœ๊ทธ๋žจ ๋ฐฐํฌํ•˜๊ธฐ

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
๋ณต์‚ฌ
์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์„œ lib ๋ชจ๋“ˆ์„ ํฌํ•จํ•˜์—ฌ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ด์•ผ JavaFX ํ”„๋กœ๊ทธ๋žจ์„ ์ •์ƒ ์ž‘๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
์ด ๋ช…๋ น์–ด๋ฅผ ์‰ฝ๊ฒŒ ์‹คํ–‰์‹œํ‚ค์ง€ ์œ„ํ•ด์„œ ๋ฐฐ์น˜ ํ”„๋กœ๊ทธ๋žจ 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
๋ณต์‚ฌ
MyApp.exe ์‹คํ–‰ํ•˜์ผ ๊ธฐ์ค€ module-path ๋ฅผ ์ง€์ •ํ•ด์ฃผ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
--module-path app/lib/javafx-sdk-23.0.2/lib
Bash
๋ณต์‚ฌ
์„ค์น˜๋œ ํŒŒ์ผ๋“ค์€ app ํด๋” ์•„๋ž˜ ํฌํ•จ๋˜๊ธฐ ๋•Œ๋ฌธ์— MyApp.exe ๊ธฐ์ค€์—์„œ app ํด๋” ์•„๋ž˜์˜ lib ๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
Installer ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฐ์น˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด ๋ณด์ž.
โ€ข
install.bat
@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
๋ณต์‚ฌ