한국어

스마트폰앱

온누리070 플레이스토어 다운로드
    acrobits softphone
     온누리 070 카카오 프러스 친구추가온누리 070 카카오 프러스 친구추가친추
     카카오톡 채팅 상담 카톡 채팅 상담
    
     라인상담
     라인으로 공유

     페북공유
    
     PAYPAL
     
     PRICE
     

pixel.gif

    before pay call 0088 from app
■ 해외 로잉 무료 스마트폰 휴대폰 070 인터넷폰 인터넷전화 국내 해외 가입 상사 주재원 교민 유학생 여행 등 ■

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 를 이용해서 작업을 진행할 수도 있습니다. 이와 관련해서는 다음번에 다시 한번 글을 올리도록하겠습니다.





조회 수 :
12117
등록일 :
2013.02.21
19:34:09 (*.160.42.88)
엮인글 :
http://webs.co.kr/index.php?document_srl=18045&act=trackback&key=288
게시글 주소 :
http://webs.co.kr/index.php?document_srl=18045
List of Articles
번호 제목 글쓴이 날짜 조회 수
65 Package org.linphone.core Description admin 2017-10-22 1303
64 Sqlite detail easy tutorial. admin 2017-09-09 1482
63 Change package name Linphone Android admin 2017-08-25 1666
62 Liblinphone - import Linphone library in Android Studio 2017 admin 2017-08-25 1705
61 I am able to build the limphone on mac by follow the steps describe here admin 2017-08-25 1629
60 To build liblinphone for Android, you must COMPILATION INSTRUCTIONS admin 2017-08-25 1686
59 sipdroid source code admin 2017-08-08 1733
58 안드로이드 주소록 전체가져오기 이름만가져오기 사진가져오기 코드 admin 2015-04-13 8358
57 the sipdroid Research Miscellaneous admin 2015-03-26 4209
56 HSS070 English Korean 무료 국제전화 미국 중국 카나다 무료 통화 제공 admin 2014-12-28 6437
55 Softphones admin 2014-09-20 5878
54 /xxxxx/gen already exists but is not a source folder. Convert to a source folder or rename it. admin 2014-09-03 6344
53 CSIPSimple building Rebuilding Detail on Eclips Good All is heare perfect admin 2014-08-15 6303
52 Improving QoE of SIP-based Automated Voice Interaction in Mobile Networks file admin 2014-03-20 7084
51 speex support in android admin 2014-03-19 7267
50 voxmobile Source and how to build admin 2014-02-18 7728
49 PJSIP hung the phone constantly corrected the problem admin 2014-02-09 8223
48 Csipsimple code rebuilding source sip 통신 Call Mechanism admin 2014-02-09 28029
47 Csipsimple code rebuilding source sip 통신 technical interviewer admin 2014-02-09 8021
46 Csipsimple code rebuilding source 주요인터페이스분석 admin 2014-02-09 55680
45 Csipsimple code rebuilding source 다운로드 구성 csipsimple 소스 프로젝트 admin 2014-02-09 9140
44 Android DialogFragment Tutorial admin 2014-02-09 8798
43 Creating a fullscreen DialogFragment with a custom background admin 2014-02-09 11351
42 [Android API] 네트워크 상태 체크하기 admin 2013-12-19 10058
41 [안드로이드] 네트워크 연결 상태 체크 함수. admin 2013-12-19 9005
40 안드로이드 인터넷연결체크 ( 3g/lte/wifi ) 메서드 admin 2013-12-19 15779
39 Android Get Phone Contacts details with Contact Image admin 2013-12-15 8403
38 안드로이드 커스텀 타이틀바 How to add custom title bar to android application admin 2013-10-02 11001
37 How to create a custom title bar admin 2013-07-15 11238
36 Rotary Dialer clip art admin 2013-04-20 18869
» Java 프로그램 실행화일 만들기 : Launch4j admin 2013-02-21 12117
34 java network programming source code, learning socket programming admin 2012-12-04 11785
33 2X Client Configuration | Android Remote Desktop 안드로이드 PC 리모트 데스크탑 admin 2012-12-02 13597
32 WIFI 3G 인터넷 연결 실시간 체크 소스코드 Broadcast Receiver 사용 (Adnroid) admin 2012-10-31 18312
31 통신사별 와이파이 비밀번호 admin 2012-10-31 16621
30 팁, wifi 패스워드 모음집 password admin 2012-10-21 12157
29 Android User Session Management using Shared Preferences admin 2012-10-16 34782
28 Unicode Tables v4 admin 2012-10-16 24642
27 HTML Codes admin 2012-10-16 11076
26 IBM Scan Codes EBCDIC Codes admin 2012-10-16 13306
25 ASCII Table and Description admin 2012-10-16 12568
24 How to Show Alert Dialog in Android (간단하고 쉬운설명) admin 2012-10-15 24335
23 How to read contacts on Android 2.0 admin 2012-10-14 14868
22 WIFI 3G 인터넷 연결 체크 소스코드 직접 사용한 코드 android admin 2012-10-14 16752
21 Android Detect Internet Connection Status admin 2012-10-12 22580
20 JAVA + SSL (server and client examples) admin 2012-10-07 23632
19 Querying The Android Contact Database admin 2012-09-30 11911
18 Manage Contacts android admin 2012-09-30 13990
17 Android Contacts API 2 example admin 2012-09-30 15051
16 Android 2.0 주소록 동기화 기능 admin 2012-09-30 40897
15 안드로이드용 앱 개발 마켓등록 까지 해본거 샘플 무료국제전화 앱 FreeDialer admin 2012-09-27 16024
14 아이폰 IPhone 앱 개발 기본 admin 2012-09-27 12635
13 [안드로이드/개발] Intent admin 2012-09-23 19813
12 안드로이드 타이머 절적한 설명과 간단한소스코드 등 안드로이드 프로그램 설명 깔끔 admin 2012-09-23 30526
11 google voice source code admin 2012-09-22 11995
10 [안드로이드] 서버/클라이언트 소켓(Socket) 통신하기 admin 2012-09-20 22930
9 FreeDial 무료국제전화는 프리미엄 국제전화 다이렉트 회선사용 admin 2012-09-20 13164
8 Android SQlite 사용 admin 2012-09-04 14014
7 안드로이드마켓에 앱 등록하는 순서 admin 2012-08-19 45246
6 전화관련 안드로이드함수 admin 2012-08-18 16770
5 자바 ,이클립스,Android SDK, ADT 설치하여 무료국제전화 다이얼러를 만들어봅시다. admin 2012-08-06 17143
4 아이폰용 무료국제전화용 무료 다이얼러 Speedydialer 설치및 사용방법 file admin 2012-07-14 12583
3 접속번호 + 상대방번호 # 를 주소록에 전화번호로 저장하여 사용하면 편리하다 admin 2012-06-17 14463
2 App Store - ILD Dialer admin 2012-06-17 11020
1 한국휴대폰에서 미국 중국 카나다 무료 국제전화 서비스 admin 2012-04-27 11370
■ 해외 로잉 무료 스마트폰 휴대폰 070 인터넷폰 인터넷전화 국내 해외 가입 상사 주재원 교민 유학생 여행 등 ■