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
볡사