반응형

어쩌다보니 Maven에 익숙해졌고, 이번 프로젝트는 Mybatis, JavaFX가 함께 들어가는 프로젝트가 되었다. 이걸 만드는데까지는 괜찮았는데, 배포하려니 또 어렵다. 중요한건 jre와 javafx-sdk가 jar파일 또는 exe파일과 함께 있어야 한다는 것이다.

 

1. jre

각종 버전 문제를 피하기 위해 배포할때엔 런타임환경을 함께 구성해서 배포하는게 낫겠다고 판단했다. 

jre는 새로 다운받는게 아니라, jdk폴더의 bin, lib, conf폴더만 복사해서 가져오면 된다.

   /jre
     ㄴ/bin
     ㄴ/lib
     ㄴ/conf

 

<2025.07.10수정>

위의 방식으로는 자바가 전혀 안깔린 PC에서는 작동하지 않는다. 아래의 jlink 명령어로 jre를 만든다. 이렇게하면 javafx까지 포함된 jre가 만들어진다. 단, 이러고도 실행이 되지 않을 수 있다. 그럴땐 그냥 JDK를 복사해서 jre라고 바꾼 후 진행한다. 

jlink --module-path "%JAVA_HOME%\jmods;C:\javafx-sdk-17.0.15\lib" ^
      --add-modules java.base,java.desktop,java.logging,java.sql,java.xml,javafx.controls,javafx.fxml ^
      --output jre

2. javafx-sdk

인텔리제이에서 pom.xml 설정으로 라이브러리가 받아졌겠지만, 다시한번 적당한 버전을 받는다. 

- 공식사이트: https://gluonhq.com/products/javafx

 

JavaFX - Gluon

Roadmap Release GA Date Latest version Minimum JDK Long Term Support Extended or custom support Details 25 September 2025 early access 22 no 24 March 2025 24.0.1 (April 2025) 22 no upon request details 23 September 2024 23.0.2 (January 2025) 21 no upon req

gluonhq.com

- 직접다운로드: https://download2.gluonhq.com/openjfx/17.0.15/openjfx-17.0.15_windows-x64_bin-sdk.zip

 

3. 폴더 구성

javaFX maven 프로젝트를 빌드하면 Target 폴더에 jar파일이 생성되게 된다. 동일한 폴더에 jre와 javafx-sdk를 복사해 넣으면 작동 환경은 구성된 것이다. 그런데 이렇게 해도 잘 안된다. 그냥 javafx-sdk에 있는 lib, bin을 jre폴더에 추가 복사해넣는게 제일 낫다.

 

4. pom.xml

우선 jar파일이 정상적으로 실행이 되어야한다. 그런데 실행하다보면 MainClass가 빠졌다는 등의 오류가 발생하는 경우가 있다. 이런경우 maven-shade-plugin을 사용해 Fat JAR을 생성한다. 아래 플러그인 부분에서 Fat JAR만들기 부분 참조

<plugins>
          <!-- 컴파일러 -->
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.11.0</version>
              <configuration>
                  <source>17</source>
                  <target>17</target>
              </configuration>
          </plugin>

          <!-- ✅ Fat JAR (실행 가능한 JAR) 만들기 -->
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-shade-plugin</artifactId>
              <version>3.5.0</version>
              <executions>
                  <execution>
                      <phase>package</phase>
                      <goals>
                          <goal>shade</goal>
                      </goals>
                      <configuration>
                          <transformers>
                              <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                  <mainClass>com.example.javafx05.HelloApplication</mainClass>
                              </transformer>
                          </transformers>
                      </configuration>
                  </execution>
              </executions>
          </plugin>
      </plugins>

 

 

실행은 우측의 Maven아이콘 클릭 후, 수명주기 -> package를 더블 클릭하면 패키징이 되면서 jar파일이 생성된다.

 

java --module-path "C:\javafx-sdk-17.0.15\lib" 
     --add-modules javafx.controls,javafx.fxml 
     -jar target/javafx05-1.0-SNAPSHOT-shaded.jar

jar 파일 생성 후에는 해당 폴더에서 위의 형식으로 명령어를 주면 실행되는 모습을 볼 수 있다.

 

5. Launch4j로 exe파일 만들기

launch4j는 지금 실행한 환경을 하나의 파일로 packaging하는 것 뿐이다.

 

우선, 아웃풋 파일명과 Jar파일의 위치를 인식시키고..

 

 

그 다음으로는 미리 준비해둔 jre의 위치, 최소 jre버전정보, 그리고 JVM option을 넣어준 뒤 빌드하면 된다. 마지막 배포시에도 jre와 java-fx폴더는 exe파일과 동일한 폴더에 계속 함께 존재해야 실행된다.

 

<2025.07.10 수정>

bundled jre path는 exe파일과 같은 폴더에 넣을 예정이므로, 그냥 "jre"다.

 

- 끝 -

반응형
반응형

 

인텔리제이에 JavaFX 프로젝트 만들기 힘드네요.

그래서 오늘 구글 검색해가며 수행한 내용을 좀 기록해 놓으려고 합니다. 한글 검색으로는 대부분 JavaFX설치 매뉴얼이 이클립스 기준이라.... 인텔리제이 정보 찾느라고 조금 힘들었습니다. 사실 금방 나오지만...영어라...

 

1. 우선 Intellij, JavaSDK는 기본적으로 깔려 있어야 합니다. (예제에서는 JavaSDK 13, JavaFX SDK11을 사용하였습니다.)

 

2. JavaFX SDK를 다운받아서 설치해야합니다. 다운받는 경로는 요기를 참조하세요. 설치..가 아니라 적당한 곳에 압축을 풀어놓으면 됩니다. 참고로 Program Files와 같이 빈칸이 들어간 곳에 하면 나중에 Module 추가부분에서 에러가 발생하니, 주의하시기 바랍니다. "C:\javafx-sdk-11.0.2" 의 형식이 되겠죠?

 

3. JavaFX 프로젝트를 생성합니다.

 

 

 

4. 적당한 이름으로 생성을 합니다. 그러나 JavaFX메뉴로 생성을 한 프로젝트 임에도 아직 JavaFX클래스들을 인식하지 못합니다.

 

 

 

5. 프로젝트 SDK 설정

"File -> Project Structure -> Project" 메뉴를 찾아가서 프로젝트 SDK를 찾아주고, Language Level도 아래와 같이 설정합니다. 무슨 의미인지는 모르겠으나 No new Language features라고 되어있으면 정상이라고 합니다.

 

 

 

6. 라이브러리 설정

"File -> Project Structure -> Libraries"메뉴로 가서 JavaFX 11라이브러리를 추가해 줍니다. 아래 화면에서와 같이 +버튼을 누르고 Java를 선택합니다.

 

 

설치한 라이브러리의 경로를 찾아주고..

 

 

적용할 모듈(생성한 프로젝트)을 선택합니다.

 

 

정상 적용되면 아래와 같이 나옵니다.

 

 

라이브러리가 적용되면 JavaFX 클래스를 인식한다는데, 아직 인식 못할 수도 있습니다..ㅠㅠ

 

7. 모듈 추가

컴파일은 되는데 아래와 같은 에러가 뜬다면 모듈 추가가 필요합니다. (저는 당연히 해야하는 걸로 알겠습니다.)

Error: JavaFX runtime components are missing, and are required to run this application

"Run -> Edit Configurations" 메뉴를 클릭하고

 

 

Run/Debug Configurations 다이얼로그가 나오면 VM options에 아래 내용을 입력합니다.

--module-path %PATH_TO_FX% --add-modules=javafx.controls,javafx.fxml

 

 

%PATH_TO_FX%는 가가의 JavaFX 라이브러리의 경로입니다. 제 경우는

"--module-path C:\javafx-sdk-11.0.2\lib --add-modules=javafx.controls,javafx.fxml"

라고 입력했습니다. 인텔리제이로 아까 생성한 프로젝트는 FXML을 사용하므로, javafx.fxml과 javafx.controls가 필요합니다. 다른 것도 필요하면 여기에 추가해줘야 합니다.

 

 

여기까지 하고 Run을 실행하니 정말 거짓말처럼 작동이 되네요. 이게 되다니 신기하네요.

 

반응형

+ Recent posts