목공책 하나 들이셔요~

2014년 4월 21일 월요일

[JavaFX]따라하기#6 - 배포하기

이 글은 Getting Started with JavaFX 시리즈 중에서 마지막 글인 "Deploying Your First JavaFX Application"을 번역하고 내용을 보강한 것입니다. 원문은 다음 링크를 확인하세요.
http://docs.oracle.com/javafx/2/get_started/basic_deployment.htm


JavaFX 어플리케이션을 개발할 때 NetBeans IDE를 사용하면 자동으로 패키지를 만들어 주어 배포하기가 매우 편합니다. 이 글에서는 JavaFX 어플리케이션을 배포하는 방법에 대해 간략하게 알아봅니다.


배포 모드 (Deployment Modes)

JavaFX 어플리케이션은 여러가지 방법으로 실행될 수 있습니다.
  • JAR 파일이나 자체 포함된 어플리케이션 런처를 이용하여 데스크탑 어플리케이션으로 실행될 수 있습니다.
  • Java 런처를 이용하여 커맨드 라인에서 실행될 수 있습니다.
  • 어플리케이션을 다운받는 브라우저의 링크를 통해 실행될 수 있습니다.
  • 웹 페이지 내에서 실행될 수 있습니다.

NetBeans IDE로 어플리케이션을 패키징하기

NetBeans IDE로 어플리케이션을 실행하거나 "Clean and Build" 커맨드를 실행하면, 당신의 어플리케이션은 프로젝트 프러퍼티의 설정에 의해서 JavaFX 모든 배포 방식을 지원하는 형태로 패키징이 됩니다. 디폴트로 패키징되는 파일은 다음과 같습니다.
  • JAR 파일 : 컴파일된 class 파일과 이미지들이 포함되어 있습니다.
  • JNLP 파일 : 웹에서의 실행을 지원하는 배포 설명서(deployment descriptor)입니다. Web Start 방식이거나 웹 페이지에 임베딩될 수 있습니다.
  • HTML 파일 : Web Start 방식과 웹 임베딩 방식을 모두 지원하는 기본적인 HTML 코드입니다.
  • web-files 폴더 : 어플리케이션의 실행을 위해 필요한 부속 파일들이 위치합니다. 주로 JavaFX와 웹 브라우저와 통신을 위한 JavaScript 라이브러리들 입니다. 자세한 내용은 이 글을 참고하세요.


선택적으로 당신의 어플리케이션을 JRE까지 합쳐서 하나의 패키지로 묶을 수도 있습니다. 이를 셀프-컨테인드(self-contained) 배포 방식이라고 합니다. NetBeans의 build.xml에 다음과 같은 ANT Task를 추가하면 셀프-컨테인드 배포 패키지를 만들 수 있습니다.

<project name="ColorfulCircles" default="default" basedir="." xmlns:fx="javafx:com.sun.javafx.tools.ant">
    <target name="-post-jfx-deploy">
        <fx:deploy width="${javafx.run.width}" height="${javafx.run.height}"
                   nativeBundles="all"
                   outdir="${basedir}/${dist.dir}" outfile="${application.title}">
            <fx:application name="${application.title}" mainClass="${javafx.main.class}"/>
            <fx:resources>
                <fx:fileset dir="${basedir}/${dist.dir}" includes="*.jar"/>
            </fx:resources>
            <fx:info title="${application.title}" vendor="${application.vendor}"/>
        </fx:deploy>
    </target>
</project>

셀프-컨테인드 어플리케이션은 일반적인 네이티브 어플리케이션의 동작 방식과 유사합니다. 셀프-컨테인드 어플리케이션 패키지는 당신의 어플리케이션과 JRE, JavaFX 런타임, 플랫폼 종속적인 어플리케이션 런처 등을 모두 포함합니다. 아래 그림이 셀프-컨테인드 방식으로 만들었을 때의 파일 구성입니다. 더 자세한 내용은 이 글을 참고하세요.


어플리케이션 윈도우의 크기 조정하기

독립 실행(standalone) 모드나 Web Start 모드인 경우 실행되는 윈도우의 크기는 코드 내에 지정한 Scene의 크기에 의해 결정됩니다. 만일 Scene의 크기를 지정하지 않았다면 그것이 포함한 내용을 모두 표현할 수 있는 최소의 크기로 결정됩니다.

웹페이지에 임베딩되는 어플리케이션의 경우 NetBeans의 프로젝트 프러퍼티 창에서 너비와 높이를 지정해 주어야 합니다. 이건 Java 코드에서 너비와 높이를 지정했다 하더라도 반드시 해야 하는 설정입니다. 심지어 코드에서 지정한 너비와 높이와 다르게 프로젝트 프러퍼티에서 설정할 수 있습니다. 그래서 코드 컴파일 없이 설정 변경으로 브라우저에 최적화된 크기를 시험해 볼 수 있습니다.

NetBeans 프로젝트 프러퍼티에서 너비와 높이를 지정하는 방법은 아래와 같습니다.
  1. Projects 창에서 당신의 NetBeans 프로젝트에 오른쪽 버튼을 클릭하고 Properties를 선택합니다.
  2. Run 카테고리를 선택합니다.
  3. Web Start와 Browser Application을 지정하는 부분에서 폭(width)과 높이(height)를 입력합니다.
  4. 만일 NetBeans에서 실행할 때 브라우저 내에서 돌아가는 것을 테스트하고 싶다면 Run: 필드에서 In Browser를 선택합니다.
  5. Properties 대화창에서 OK를 클릭합니다.
  6. 프로젝트에 오른쪽 버튼을 클릭하고 Clean and Build를 선택합니다.
  7. 프로젝트에 오른쪽 버튼을 클릭하고 Run을 선택하면 어플리케이션이 실행됩니다. 만일 브라우저에서 실행하도록 설정했다 하더라도 브라우저에서 실행됩니다. 만일 NetBeans IDE의 도움없이 브라우저에서 실행하는 걸 테스트하고 싶다면 다음 내용을 보시기 바랍니다.


어플리케이션을 NetBeans IDE 밖에서 돌리기

NetBeans IDE의 도움없이 브라우저에서 어플리케이션을 돌리고 싶다면 프로젝트의 dist 서브 디렉토리로 이동해 보세요. 그리고 다음과 같이 해보세요.
  • 어플리케이션을 독립모드(stand-alone mode)로 실행하고 싶다면 그냥 JAR 파일을 더블클릭하세요.
  • Web Start 방식으로 실행하려면 dist 폴더에 있는 html을 브라우저로 연 상태에서 Webstart 링크를 클릭하세요. 혹은 그 디렉토리에 있는 JNLP 파일을 더블클릭해도 됩니다. html의 링크를 사용하는 것이 더 좋은데, 생성되는 웹 페이지에는 JavaFX 어플리케이션을 실행하는데 필요한 런타임이나 필요한 환경들의 버전을 체크하는 로직이 들어있기 때문입니다.
  • 웹페이지에 임베딩되는 것을 실행하려면 그냥 html 파일을 브라우저로 열면 됩니다.
  • 셀프 컨테인드 방식의 어플리케이션 패키지를 실행하려면 어플리케이션이 있는 폴더로 이동하여 해당 OS에 맞는 실행파일 형태로 되어 있는 런쳐를 실행하면 됩니다.


만일 Google Chrome을 쓰고 있다면 아래 그림처럼 Java 플러그인을 이번에만 실행할지, 계속해서 시행할지를 묻는 창이 뜰 것입니다. 원하는 옵션을 선택한 후 리로딩하면 제대로 동작될 것입니다.


패키징된 파일을 배포하기

Java 7 이나 그 이후의 런타임들을 이용하면 배포 파일들의 위치를 어떤 설정의 수정도 없이 옮길 수 있습니다. 각 배포 방식에 따른 필요한 파일들은 다음과 같습니다.
  • 독립 실행 모드 : JAR와 의존성이 있는 부속 lib 폴더내의 jar파일들이 있으면 됩니다.
  • 브라우저에서 실행 모드 : JAR, JNLP, HTML이 있으면 됩니다.
  • Web Start 모드 : JAR, JNLP, HTML이 있으면 됩니다.
  • 셀프 컨테인드 모드 : 어플리케이션과 지원 파일들이 포함된 폴더 전체가 있어야 합니다.
JavaFX 어플리케이션을 패키징하는 다른 방법들

NetBeans IDE가 제공하는 패키징 방식 대신에 JavaFX의 Packager 툴이나 직접 만든 Ant 스크립트를 이용하여 패키징할 수도 있습니다. 이 모든 툴들은 어플리케이션을 시행하기 위한 설정들을 기본적으로 생성된 HTML파일에 수작업으로 복사해 넣어야 합니다. 이 외에도 어플리케이션의 시작과 실행을 조절할 수 있는 여러가지 커스터마이징 방법들이 있습니다. 이에 대한 더 자세한 내용은 Deploying JavaFX Application 시리즈를 통해 얻을 수 있습니다.

보안 설정 문제로 JavaFX 어플리케이션이 실행되지 않을 때

아마도 JavaFX 어플리케이션을 만들어서 실행하고자 하면 독립실행 모드를 제외하고는 다음과 같은 메시지가 나오면서 실행이 되지 않을 것입니다. NetBeans IDE는 기본적으로 자체 서명된 (self-signed) 인증서를 사용하기 때문에 이런 오류가 발생합니다.


ActiveX나 Java Applet, Java FX와 같이 인터넷에서 다운받아서 사용자의 컴퓨터에서 실행되는 프로그램의 경우 프로그램의 개발사가 어디인지를 공인 인증기관을 통해 확신할 수 있어야 합니다. Microsoft사나 Oracle과 같은 회사에서 만든 프로그램은 신뢰할 수 있지만 알 수 없는 회사에서 만든 프로그램은 사용자의 판단에 의해 거부되거나 허용되어야 합니다.

어떤 프로그램이 어떤 회사에서 만들어진 것인지를 공인하기 위해서 코드 사이닝(Code Signing)이라는 작업을 합니다. 공인 인증기관(Verisign, Thawte 등)으로부터 발급된 인증서를 통해 그 코드가 그 회사에서 만들어진 것이라는 것을 신뢰할 수 있는 것이지요.

Java 런타임의 기본 설정은 이렇게 공인 인증기관으로부터 발급된 인증서로 사인된 것만 실행하게 되어 있습니다. 그러므로 자체 서명된 인증서가 입혀진 어플리케이션은 위와 같이 오류가 발생합니다. 물론 프로그램을 만들어 배포할 때는 공인 인증기관을 통한 코드 사이닝을 해야 겠지만 개발 단계에서 그러기에는 번거롭습니다. 이럴 때는 자신의 컴퓨터에 한해서 보안 레벨을 약간 낮추어 실행시킬 수 있습니다.

Java를 설치하면 아마도 프로그램 메뉴에서 "Java 제어판" 혹은 "Java Plug-in Control Panel"이라는 프로그램을 찾을 수 있을 것입니다. 이 프로그램을 실행하여 보안탭을 통해서 보안 레벨을 설정할 수 있습니다. 기본적인 설정은 "높음"으로 되어 있습니다. 이것을 "중간"으로 변경하고 적용하면 보안 레벨을 낮출 수 있습니다.


이제 JavaFX 어플리케이션을 실행하면 아래와 같은 대화상자가 뜹니다. 위험을 감수한다는 주의사항에 체크한 뒤에 "실행"을 누르면 프로그램을 실행할 수 있습니다. 하지만 이것은 개발자의 PC에서 모든 것이 컨트롤되는 상황에서 가능한 것이지 일반 사용자에게 배포하면서 이렇게 하라고 하는 것은 크게 잘못된 것입니다. 정식으로 코드 사이닝을 하여 배포하도록 해야 합니다.


JavaFX의 코드 사이닝에 대해서는 다음에 기회가 되면 다시 설명 드리도록 하겠습니다.

댓글 없음:

댓글 쓰기