스마트폰앱

오늘:
2,087
어제:
2,822
전체:
2,720,176

고객센타 : 070-7752-2000
팩스 : 070-7752-2001
휴대폰 : 010-9513-0019
email : voipkorea@yahoo.co.kr

국민은행
(주)제이에스솔루션
047101-04-155519

Flag Counter
■ 무료 : 유선 집전화 휴대폰 ( 한국 미국 중국 카나다) ↔ (국내 해외 여행자 상사 주재원 유학생) / 가입무 무제한무료■

http://shinnara.tistory.com/159



Java 로 Desktop 에서 돌아가는 어플리케이션을 개발을 하다보면 자주 접하는 문제 중에 하나가 배포를 어떻게 할까입니다. 특히 Windows 에서 어떻게 하면 사용자가 편리하게 실행시킬 수 있을까를 고민하게 됩니다.
가장 기본적인 것으로는 배치 파일을 만들어서 그 파일 안에 "java MainForm" 과 같은 실행 스크립트를 적는 것이겠지요. 물론 매우 열악한 해결방법이긴 하지만요..
 
좀더 나아간다면 JNI 를 이용해서 Wrapper 를 제작하는 방법입니다. 즉 해당 플랫폼에 맞는 실행화일을 만들어서 이 실행화일이 Java 프로그램을 띄우게 되는 구조입니다. Eclipse 와 같은 프로그램들이 이와 같은 방법을 사용합니다. 이 경우, 별도의 설치 없이 파일을 특정 디렉토리에 설치하는 것만으로 실행할 수 있습니다. 하지만 프로그램이 실행되는데 필요한 조건들이 선결되어야 한다는 가정이 있어야 겠지요. 예를 들어 JRE 가 설치되어 있지 않다면 Wrapper 가 Java VM 을 부르지 못하니까요.

한단계 더 나아간다면 인스톨러를 활용하는 것입니다. 일반적인 어플리케이션의 설치과정처럼 인스톨러가 있어서 환경에 대한 체크도 해주고, 실행 화일도 만들어주는 형태입니다. 사용자에게 가장 친숙하게 다가설 수 있는 방법입니다.

 그외에도 JNLP(java network launching protocol) 를 이용한 Java Web Start 도 대안이 될 수 있을 것입니다. 이는 네트워크를 통하여 어플리케이션을 설치하고 실행시키는 방법입니다.

위의 내용과 관련된 자세한 자료는 다음을 참고하세요. 기본적인 설명과 다양한 툴을 소개하고 있습니다.

http://www.excelsior-usa.com/articles/java-to-exe.html

오늘 소개할 내용은 위의 문서에도 나오는 Launch4j 입니다.


사용자 삽입 이미지
Launch4j 는 Wrapper 를 통하여 exe 를 만드는 방법입니다. 전에는 JSmooth 라는 툴을 잘 써왔는데, 이상하게도 JSmooth 에서는 classpath 를 제대로 찾지 못하는 문제가 종종 발생해서 관련된 클래스를 모두 하나의 jar 에 묶어 embed 하여 exe 를 만들어야 했습니다. 제가 잘 못해서 그런지는 모르겠지만 여하튼 그것때문에 예전에 배포한 한 프로그램은 실행화일의 크기가 4MB 가 넘어갔습니다.  그리고 수정이 있을때마다 패키징을 다시해야하는 문제까지 생겼습니다. 그래서 다른 툴을 알아보게 되었는데, 오늘 테스트해본 툴이 바로 Launch4j 입니다.

Launch4j 의 홈페이지에 보면 2.x와 3.x 의 두가지 버전을 다운로드 할 수 있게 하고 있는데, 3.x 를 추천합니다. stable 버젼은 2.x 이지만 , 받아서 설치해보니 Classpath 와 관련된 내용을 설정할 수 없도록 되어 있더군요. 3.x 에서는 제대로 동작합니다.

제가 설치한 버젼은 3.0.0-pre2 입니다. 제일 궁금한 것이 classpath 에 있는 라이브러리를 제대로 참조하여 실행 시킬수 있는가 하는 것입니다. 그래야 Wrapper 를 한번 만들면 그 다음부터는 관련된 클래스화일만 변경해도 프로그램이 변경될 수 있으니까요.

그래서 간단한 프로그램을 작성해보았습니다. JFrame 안에 두개의 JTextField 를 위 아래에 놓고, 위에는 현재 시간을, 아래에는 이 내용을 Base64 로 인코딩한 정보를 보여주는 간단한 어플리케이션입니다. Base64 를 쓰는 이유는 별도의 라이브러리인  commons-codec을 제대로 참조하는지 테스트하기 위함입니다.

소스 파일은 두개로 나누어보았습니다.

[Main.java]

package com.naratalk.test;
import javax.swing.*;
import java.awt.*;
import javax.swing.border.*;
import java.util.*;


public class Main extends JFrame{

    JTextField tfDate,tfEncoded;
    UserLib ul;
    public Main()
    {
        super("Main Application");
        ul = new UserLib();
        initUI();
        addUpdateTask();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
   
    private void initUI()
    {
        this.setLayout(new BorderLayout());
        tfDate = new JTextField();       
        tfDate.setBorder(new TitledBorder("Current Date & Time"));       
       
        this.add(tfDate, BorderLayout.NORTH);       
       
        tfEncoded = new JTextField();       
        tfEncoded.setBorder(new TitledBorder("Encoded"));       
       
        this.add(tfEncoded, BorderLayout.SOUTH);
    }
   
    private void addUpdateTask()
    {
        java.util.Timer timer = new java.util.Timer();
        timer.schedule( new TimerTask() {
            public void run()
            {
                tfDate.setText(ul.getSimpleDate());
                tfEncoded.setText(ul.encodeBase64(tfDate.getText()));
                addUpdateTask();
            }
        }, 1000);
    }
   
   
    public static void main(String[] args)
    {
        Main mf = new Main();
        mf.setSize(500, 500);
        mf.setVisible(true);
    }
}


[UserLib.java]

package com.naratalk.test;

import java.text.*;
import java.util.*;
import org.apache.commons.codec.binary.*;
public class UserLib {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
   
    public String getSimpleDate()
    {
        return sdf.format(new Date());
    }
   
    public String encodeBase64(String str)
    {
        Base64 base64 = new Base64();
        return new String(base64.encode(str.getBytes()));       
    }
}


그리고 Ant 의 build 파일은 전에 설명한 것처럼 dist 디렉토리에 jar 로 만들어놓습니다.

[build.xml]

<project name="InstallerTest" default="main" basedir=".">
    <target name="init">
        <property name="build" value="bin" />
        <property name="home" value="." />
        <property name="src" value="src" />
        <property name="dist" value="dist" />
        <property name="jarname" value="installertest.jar" />
        <property name="mainclass" value="com.naratalk.test.Main" />
    </target>

    <target name="compile" depends="init">
        <mkdir dir="${build}" />
        <javac srcdir="${src}"  destdir="${build}" >
            <classpath>
                    <fileset dir="lib">
                        <include name="**/*.jar" />
                    </fileset>
                </classpath>
       </javac>
    </target>

    <target name="makejar" depends="compile">
        <mkdir dir="${dist}" />
        <jar destfile="${dist}/${jarname}"
             basedir="${build}" >
             <manifest>
                <attribute name="Main-Class" value="${mainclass}" />
             </manifest>
        </jar>
    </target>

    <target name="main" depends="compile" />
   
</project>

그리고 dist 디렉토리에 이번에 쓰인 라이브러리인 commons-codec-1.3.jar 를 옮겨 놓습니다. 빌드를 수행하고나면 dist 디렉토리에 installertest.jar 와 commons-codec-1.3.jar 가 있게 됩니다.

이제 Launch4j 를 사용할 차례입니다.

뭐 특별한 내용은 없습니다. 워낙 심플한 것이라서요. 이번 글에서 테스트하고 싶은게 결국 classpath 를 제대로 인식하느냐의 문제이므로 이부분에 대해 적어보겠습니다.

사용자 삽입 이미지

Classpath 탭에서 Custom classpath 를 체크하고,  MainClass 에는 폴더버튼을 눌러 main class 가 있는 jar 를 선택하고, Edit Item 에 commons-codec-1.3.jar 라고 입력하고 Accept 버튼을 누르면 Classpath 에 추가가 됩니다.


사용자 삽입 이미지

그리고 JRE 탭에서는 Minimun JRE 버젼은 1.x.x 형태로 입력하시면 됩니다. 저의 경우는 Don't user private JREs 를 선택했습니다.

사용자 삽입 이미지
이렇게 하고 톱니모양의 버튼을 누르면 exe 파일이 생성되는데, 제 경우는 24KB 정도되는 크기입니다. 이 exe 파일은 Main-Class 를 불러주는 역할만을 하므로 Main-Class 의 이름이 바뀌지 않는다면 프로그램이 변경되더라도 exe 자체를 변경할 필요가 없습니다. 물론 classpath 에 추가할 내용이 있다면 다시 해야겠지만요. 오른쪽의 이미지는 이 프로그램을 실행한 화면입니다.



Launch4j 는 Ant 를 이용해서 작업을 진행할 수도 있습니다. 이와 관련해서는 다음번에 다시 한번 글을 올리도록하겠습니다.





조회 수 :
10205
등록일 :
2013.02.21
19:34:09 (*.160.42.88)
엮인글 :
http://webs.co.kr/index.php?document_srl=18045&act=trackback&key=ca6
게시글 주소 :
http://webs.co.kr/index.php?document_srl=18045
List of Articles
번호 제목 글쓴이 날짜 조회 수
64 Sqlite detail easy tutorial. admin 2017-09-09 190
63 Change package name Linphone Android admin 2017-08-25 301
62 Liblinphone - import Linphone library in Android Studio 2017 admin 2017-08-25 304
61 I am able to build the limphone on mac by follow the steps describe here admin 2017-08-25 297
60 To build liblinphone for Android, you must COMPILATION INSTRUCTIONS admin 2017-08-25 287
59 sipdroid source code admin 2017-08-08 363
58 안드로이드 주소록 전체가져오기 이름만가져오기 사진가져오기 코드 admin 2015-04-13 5649
57 the sipdroid Research Miscellaneous admin 2015-03-26 2763
56 HSS070 English Korean 무료 국제전화 미국 중국 카나다 무료 통화 제공 admin 2014-12-28 4030
55 Softphones admin 2014-09-20 4468
54 /xxxxx/gen already exists but is not a source folder. Convert to a source folder or rename it. admin 2014-09-03 4879
53 CSIPSimple building Rebuilding Detail on Eclips Good All is heare perfect admin 2014-08-15 4828
52 Improving QoE of SIP-based Automated Voice Interaction in Mobile Networks file admin 2014-03-20 5637
51 speex support in android admin 2014-03-19 5864
50 voxmobile Source and how to build admin 2014-02-18 6236
49 PJSIP hung the phone constantly corrected the problem admin 2014-02-09 6672
48 Csipsimple code rebuilding source sip 통신 Call Mechanism admin 2014-02-09 18380
47 Csipsimple code rebuilding source sip 통신 technical interviewer admin 2014-02-09 6629
46 Csipsimple code rebuilding source 주요인터페이스분석 admin 2014-02-09 32732
45 Csipsimple code rebuilding source 다운로드 구성 csipsimple 소스 프로젝트 admin 2014-02-09 7696
44 Android DialogFragment Tutorial admin 2014-02-09 6923
43 Creating a fullscreen DialogFragment with a custom background admin 2014-02-09 9366
42 [Android API] 네트워크 상태 체크하기 admin 2013-12-19 8284
41 [안드로이드] 네트워크 연결 상태 체크 함수. admin 2013-12-19 7613
40 안드로이드 인터넷연결체크 ( 3g/lte/wifi ) 메서드 admin 2013-12-19 13965
39 Android Get Phone Contacts details with Contact Image admin 2013-12-15 6944
38 안드로이드 커스텀 타이틀바 How to add custom title bar to android application admin 2013-10-02 9306
37 How to create a custom title bar admin 2013-07-15 9551
36 Rotary Dialer clip art admin 2013-04-20 17195
» Java 프로그램 실행화일 만들기 : Launch4j admin 2013-02-21 10205
34 java network programming source code, learning socket programming admin 2012-12-04 10331
33 2X Client Configuration | Android Remote Desktop 안드로이드 PC 리모트 데스크탑 admin 2012-12-02 12105
32 WIFI 3G 인터넷 연결 실시간 체크 소스코드 Broadcast Receiver 사용 (Adnroid) admin 2012-10-31 16432
31 통신사별 와이파이 비밀번호 admin 2012-10-31 14407
30 팁, wifi 패스워드 모음집 password admin 2012-10-21 10688
29 Android User Session Management using Shared Preferences admin 2012-10-16 32031
28 Unicode Tables v4 admin 2012-10-16 22976
27 HTML Codes admin 2012-10-16 9649
26 IBM Scan Codes EBCDIC Codes admin 2012-10-16 11823
25 ASCII Table and Description admin 2012-10-16 11131
24 How to Show Alert Dialog in Android (간단하고 쉬운설명) admin 2012-10-15 22131
23 How to read contacts on Android 2.0 admin 2012-10-14 13171
22 WIFI 3G 인터넷 연결 체크 소스코드 직접 사용한 코드 android admin 2012-10-14 15089
21 Android Detect Internet Connection Status admin 2012-10-12 20645
20 JAVA + SSL (server and client examples) admin 2012-10-07 22184
19 Querying The Android Contact Database admin 2012-09-30 10537
18 Manage Contacts android admin 2012-09-30 12497
17 Android Contacts API 2 example admin 2012-09-30 13596
16 Android 2.0 주소록 동기화 기능 admin 2012-09-30 38736
15 안드로이드용 앱 개발 마켓등록 까지 해본거 샘플 무료국제전화 앱 FreeDialer admin 2012-09-27 14574
14 아이폰 IPhone 앱 개발 기본 admin 2012-09-27 11228
13 [안드로이드/개발] Intent admin 2012-09-23 17572
12 안드로이드 타이머 절적한 설명과 간단한소스코드 등 안드로이드 프로그램 설명 깔끔 admin 2012-09-23 28220
11 google voice source code admin 2012-09-22 10525
10 [안드로이드] 서버/클라이언트 소켓(Socket) 통신하기 admin 2012-09-20 20390
9 FreeDial 무료국제전화는 프리미엄 국제전화 다이렉트 회선사용 admin 2012-09-20 11612
8 Android SQlite 사용 admin 2012-09-04 11138
7 안드로이드마켓에 앱 등록하는 순서 admin 2012-08-19 41835
6 전화관련 안드로이드함수 admin 2012-08-18 15148
5 자바 ,이클립스,Android SDK, ADT 설치하여 무료국제전화 다이얼러를 만들어봅시다. admin 2012-08-06 15698
4 아이폰용 무료국제전화용 무료 다이얼러 Speedydialer 설치및 사용방법 file admin 2012-07-14 11055
3 접속번호 + 상대방번호 # 를 주소록에 전화번호로 저장하여 사용하면 편리하다 admin 2012-06-17 13016
2 App Store - ILD Dialer admin 2012-06-17 9599
1 한국휴대폰에서 미국 중국 카나다 무료 국제전화 서비스 admin 2012-04-27 9955