티스토리 뷰

programming/etc

[osx] jar .pkg 만들기

LEIBNIZ 2018. 3. 27. 18:00

JAVA로 만든 executable jar를 pkg로 만들어보자.


* 준비물

-  appmaker2.app, executable jar, terminal

URL : https://sourceforge.net/projects/jarappmaker/ (appmaker2.app)


1. appmaker2.app로 test.jar를 test.app로 변환

2. 변환한 test.app 파일의 Contents -> MacOS -> launcher 를 텍스트 에디터로 연다.

2.1 여기서 작업할 내용은 

- 자바 설치 유무

- 자바 버전 체크



osx(mac)에서는 JAVA가 설치되어 있지 않은 상태에서 terminal에서 java 명령어를 쓰면 OS 자체에서 JDK를 설치하라고 Oracle 사이트를 링크한다.

JDK를 설치하면 자동으로 $JAVA_HOME이 세팅되며, java 명령어를 사용할 수 있는데 JRE만 설치하면 $JAVA_HOME은 물론이고 java 명령어도 먹질 않는다.


여기서 우리는 강제로 JRE 설치 경로의 java path를 추출하여 "...././java" 라고 명령어를 사용할 것이다.


자바 설치 유무

launcher

#!/bin/sh
# Author: leibniz55

JRE_HOME="/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home"
# Is Java installed?                
# if type -p java; then                # 해당 구문은 무조건 _java 변수에 java 스트링을 넣어 java 명령어를 실행하도록 하는 것이다.
# _java=java                       # 이는 JRE만 설치하는 상황에서는 불필요한 구문이다.

# check jdk
if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]]; then
_java="$JAVA_HOME/bin/java"

# check jre
elif [[ -n "$JRE_HOME" ]] && [[ -x "$JRE_HOME/bin/./java" ]]; then
     _java="$JRE_HOME/bin/./java"

# alert error message
else
osascript \
     -e "set question to display dialog \"$ERROR_NO_VERSION_MSG\" with title \"$ERROR_TITLE\" buttons {\"Cancel\", \"Download\"} default button 2" \
     -e "if button returned of question is equal to \"Download\" then open location \"$DOWNLOAD_URL\""
     echo "$ERROR_TITLE"
     echo "$ERROR_MSG"
     exit 1
fi

# Run the application
exec "$_java" -jar "$DIR/$APP_JAR"

1) 먼저 $JAVA_HOME을 검색한다 (JDK가 설치되어있다면 경로가 자동으로 잡히므로)

2) $JAVA_HOME이 있다면 $JAVA_HOME/bin/java가 실행 가능한지 체크 (JDK가 설치되어 있다면 _java 변수에 java 실행파일 경로를 넣는다.)


3) $JAVA_HOME 이 없다면 $JRE_HOME을 사용하여 1), 2) 을 체크한다 (JRE가 설치되어있다면 _java 변수에 java실행파일 경로를 강제로 넣는다)

4) JRE 또는 JDK가 설치되어 있지 않다면 에러메세지를 띄우고 자바 설치사이트로 이동


자바 버전 체크

자 JRE 또는 JDK가 설치되어 있다면 _java에 java 실행 파일 경로를 넣었다. 이 경로를 사용하여 버전을 체크해보자

# java version check
if [[ "$_java" ]]; then
version=$("$_java" -version 2>&1 | awk -F '"' '/version/ {print $2}')
if [[ "$version" < "$JAVA_MAJOR.$JAVA_MINOR" ]]; then
osascript \
    -e "set question to display dialog \"$ERROR_NO_VERSION_MSG\" with title \"$ERROR_TITLE\" buttons {\"Cancel\", \"Download\"} default button 2" \
    -e "if button returned of question is equal to \"Download\" then open location \"$DOWNLOAD_URL\""
    echo "$ERROR_TITLE"
    echo "$ERROR_MSG"
    exit 1
fi
fi

배포하는 executable jar의 최소 자바버전을 세팅하자 해당 버전보다 낮다면 메세지를 띄워 자바를 업데이트 하게 한다.


여기까지 작성하고 test.app를 실행시켜보면 상황에 따라 잘 작동할 것이다.



3. osx(mac)에서 제공하는 pkgbuild 명령어를 사용하여 test.pkg를 만든다.

아래는 release 폴더에 .pkg 파일을 만들기 위한 준비물들이다.

release 

-- test.app

-- Scripts

-- -- PREINSTALL

-- -- POSTINSTALL


* test.app : launcher를 수정한 appmaker2 로만든 executable jar 파일

* Scripts/PREINSTALL : 설치 전에 해야할 작업을 작성할 파일

* Scripts/POSTINSTALL : 설치 후에 해야할 작업을 작성할 파일


3.1 pkgbuild를 사용하기 전에, 설치 전 단계에서 해야할 작업을 작성해보자

PREINSTALL

#!/usr/bin/env bash
# Author: leibniz55

# if not exist jdk, then checking jre was installed
JRE_HOME="/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home"

# 테스트 앱이 존재한다면 프로세스 검색하여 작동을 중지시킨다.
if [ -d "/Applications/test.app" ]; then
      process_id=`/bin/ps -fu $USER| grep "test" | grep -v "grep" | awk '{print $2}' | xargs kill`

     # for sync, somtime don't opend new version app
      sleep 1
fi

# Is Java installed?
# if type -p java; then
# _java=java
# check jdk
if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]]; then
_java="$JAVA_HOME/bin/java"

# check jre
elif [[ -n "$JRE_HOME" ]] && [[ -x "$JRE_HOME/bin/./java" ]]; then
     _java="$JRE_HOME/bin/./java"

# alert error message
else
osascript \
     -e "set question to display dialog \"$ERROR_NO_VERSION_MSG\" with title \"$ERROR_TITLE\" buttons {\"Cancel\", \"Download\"} default button 2" \
     -e "if button returned of question is equal to \"Download\" then open location \"$DOWNLOAD_URL\""
     echo "$ERROR_TITLE"
     echo "$ERROR_MSG"
     exit 1
fi

# java version check
if [[ "$_java" ]]; then
version=$("$_java" -version 2>&1 | awk -F '"' '/version/ {print $2}')
if [[ "$version" < "$JAVA_MAJOR.$JAVA_MINOR" ]]; then
osascript \
     -e "set question to display dialog \"$ERROR_NO_VERSION_MSG\" with title \"$ERROR_TITLE\" buttons {\"Cancel\", \"Download\"} default button 2" \
     -e "if button returned of question is equal to \"Download\" then open location \"$DOWNLOAD_URL\""
    echo "$ERROR_TITLE"
    echo "$ERROR_MSG"
    exit 1
fi
fi
exit 0


launcher 파일과 동일하게 설치전 JRE or JDK 설치 유무 및 버전 체크를 한다.

다만, 다른점은 설치 전 test.app 이전버전이 존재한다면, PID를 검색해 구동중인 test 프로세스를 끄는 작업이 추가되었다.


3.2 설치가 끝나고 난 뒤, 작업할 내용을 작성하자

POSTINSTALL

#!/usr/bin/env bash
# Author: leibniz55

osascript -e 'tell application "System Events" to make login item at end with properties {path:"./Applications/test.app", hidden:false}' ;

open /Applications/test.app

exit 0


/Application 경로에 test.app을 설치(설치보단 복사) 하고 난 뒤의 행동에 대한 작성할 내용인데,

osascript 를 사용하여서 login item에 test.app을 넣어 재부팅을 하면 자동으로 test.app이 실행되도록 한다.

마지막으로 설치된 test.app를 open을 사용하여 실행시켜준다.


이렇게 설치 세팅이 완료되면 terminal pkgbuild 명령어를 통해 생성하자

pkgbuild --root test.app --identifier com.test --scripts Scripts --install-location /Applications/test.app test.pkg

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함