2017.03.11 14:27


javaservice.exe 란 33kb 짜리 파일 하나로 간단하게 윈도우 서비스에 등록 / 삭제가 가능하다. 

binary 패키지를 받아서 압축을 풀어보면 다양한 예제 파일이 같이 공존하니 충분히 참고가 될것이다. 
URL : http://forge.objectweb.org/projects/javaservice/ 

참고로 본인은 이런식으로 등록했다. 

testinstall.bat

set JAVA_HOME=c:\jdk
set JAVASERVICE=JavaService.exe

%JAVASERVICE% -install ${Service에 등록될 이름} %JAVA_HOME%/jre/bin/server/jvm.dll -Djava.class.path=%CLASSPATH% com.dasida.TestMain -params INSTALL_DIR=c:\test -out c:\out.log -err c:\err.log 
pause


testuninstall.bat

set JAVASERVICE=JavaService.exe
%JAVASERVICE% -uninstall ${Service에 등록된 이름}


Service 의 시작 과 중지도 간단하다. 

시작 > net start test 
중지 > net stop test

 

 

 

1. 우선 아래 파일을 다운로드 받으세요.

 

                instsrv_srvany.zip

 

 

instsrv.exe,srvany.exe 두개의 파일이 들어있습니다.

 

파일에 대한 설명은 techbug님의 블로그에서 발췌했습니다.

 

● instsrv.exe
   - exe 파일을 서비스로 등록시켜주는 프로그램
   - 등록시 : instsrv [서비스명] [등록할exe파일]
   - 삭제시 : instsrv [서비스명] remove
   - 더 자세한 내용은 usage 참조

 

● srvany.exe
   - Windows .NET 서비스 리소스킷

 


2. 압축을 푸시고 등록하고자 하는 프로그램과 같이 아무 디렉토리에나 넣어두세요.
    제 경우에는 C:\TroubleAlarmService 디렉토리에 instsrv.exe, srvany.exe,

    개발한 서버 프로그램을 같이 위치 시켰습니다.

 

 

3. 시작 → 실행 → cmd : 프로그램이 들어있는 디렉토리로 이동하여 아래 명령 실행

    C:\TroubleAlarmService> instsrv.exe TroubleAlarmService C:\TroubleAlarmService\srvany.exe

   
   TroubleAlarmService는 구동될 서비스 명이 됩니다. 각자 원하는 서비스 명을 입력하시면 됩니다.

 

 

4. 시작 → 실행 → regedit : 레지스트리 편집기 실행
   HKEY_LOCAL_MACHENE\SYSTEM\CurrentControlSet\Services 를 보면 등록하신 서비스 명으로

   폴더가 생성되어 있을겁니다.  제 경우에는 TroubleAlarmService가 되겠죠.. 폴더를 선택하고,

   마우스 오른쪽 '새로만들기 -> 키'를 선택합니다. 그러면 밑에 폴더가 하나 생성되는데요.

   폴더명을 Parameters로 해주세요.

 

 

5. Parameters 폴더를 선택하고 레지스트리 편집기 오른쪽 영역에서 마우스 오른쪽 버튼을 눌러서

   '새로 만들기 → 문자열값'을 선택하고 아래 처럼 입력합니다.


      이름 : Application
      값 : java -classpath c:\TroubleAlarmService TroubleAlarmService
  

   저장한 후 편집기를 닫습니다.

 

 

6. 서비스를 구동 시키는 일만 남았습니다. 두가지 방법이 존재합니다.
  

   시작 → 제어판 → 관리도구 → 서비스 : TroubleAlarmService 찾아서 시작
   시작 → 실행 → cmd                                   
   C:\> net start TroubleAlarmService
   C:\> net stop TroubleAlarmService


이렇게 하고 서비스가 동작하는 것을 확인했습니다.

 

 

 

일반적으로 Windows 에서의 Java Application은 Command Console을 사용하여 구동된다.

이 방식은 아래와 같은 단점을 가지고 있다. 

1. 사용자 실수로 인해 Command Console에 Mouse Click이 발생하면 Application이 Hold됨.
2. 사용자가 Logout하면 해당 Application이 종료됨.
3. 특별히 제약이 없는 경우 터미널 서버나 원격 데스크탑 Application을 사용하여 같은 Application을

    각 User별로 계속 구동할 수 있음.

이런 단점을 극복하기 위해 Unix에서는 Background Process로 구동시키면 되지만,

Windows는 그 태생이 End User를 위한 DeskTop이기에 그 개념이 없다.

그와 유사한 개념이 Windows Service이다.
그러나 애석하게도 현재 JDK는 Windows Service를 사용하는 API를 제공하고 있지는 않다.

그로 인해 Apache나 InstallAnywhere등의 Application 벤더들은 그들만의 방법으로 Service등록을

가능하게 해서 사용하고 있는 실정이다.

지금 제시할 방법은 이러한 Java Application을 Windows Service로 등록하는 간단한 방법이다.
프로젝트에 적용중인 모듈에 적용하기 위해 여러 자료를 찾다 발견한 매우 간단한 방법이다.

지금까지 제가 배포한 모듈의 경우 모두 이 방법을 사용해 서비스에 등록했다.
방법은 다음과 같다.

JavaService.exe 에 구동 Argument로 설정값을 넘겨주면 서비스 등록이 완료되게 된다.

실제 사용은 아래의 방법을 따른다.

1. JavaService.exe를 구한다.
2. 서비스 등록용 batch파일을 만든다. 아래는 필자가 사용하는 파일의 예이다.

C:JavaService -install MyApp %JAVA_HOME%jre inserverjvm.dll -Djava.class.path=.;C:MyAppclasses -start MyApp.StartApp -params INSTALL_DIR=C:MyAppr -out C:MyApplogsstdout.log -err C:MyApplogsstderr.log -auto

Java Service가 사용하는 각 옵션 값은 다음과 같습니다.

      -install COM : 윈도우 서비스에 COM 란 이름으로 등록

 

      %JVM_PATH% : Java 서비스 등록을 위해 사용하는 dll. JDK나 JRE가 설치된 곳에 있음.
                               {JDK_HOME}/jre/bin/[server|client]/jvm.dll
                               {JRE_HOME}/bin/[server|client]/jvm.dll
 
       -Djava.class.path : 프로그램 실행을 위한 Java Classpath. 
       -Xms64M -Xmx128M : class path 이후에는 Java VM 옵션
       -start : main() 메소드가 있는 시작 클래스명 
       -out : 서비스 등록 후 출력하는 로그
       -err : 서비스 등록 후 출력하는 에러 로그
       -current : 프로그램의 실행 위치

       -description : 서비스에 등록될때 해당 서비스의 설명 내용



3. 서비스 해지용 batch파일을 만든다. 아래는 필자가 사용하는 파일의 예이다. 
         C:JavaService -uninstall MyApp

더 자새한 내용은 http://forge.ow2.org/projects/javaservice/ 을 참고하기 바란다.

저작자 표시
신고


Posted by injunech
2017.02.27 13:04


내장된 ArrayList의 사용법

생성

ArrayList를 사용하기 위해서는 우선 ArrayList 객체를 만들어야 합니다.

1
ArrayList<Integer> numbers = new ArrayList<Integer>();

ArrayList는 java.util.ArrayList에 포함되어 있기 때문에 import를 해주셔야 합니다.

1
import java.util.ArrayList;

추가

엘리먼트를 추가 할 때는 add 메소드를 사용합니다. add는 배열에 단순히 더해지는 것이기 때문에 빠르게 동작합니다.

1
2
3
4
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40);

특정 위치에 추가하고 싶다면 메소드 add의 첫번째 인자로 인덱스를 지정합니다.

1
numbers.add(1, 50);

자바의 배열은 크기가 고정되어 있습니다. 데이터를 추가하는 과정에서 내부적으로 사용하는 배열이 꽉차면 기존의 배열 대비 크기가 2배 큰 새로운 배열을 만들고 기존의 데이터를 새로운 배열로 복제합니다. 덕분에 프로그래머는 ArrayList의 크기에 신경쓰지 않고 편리하게 프로그램을 만들 수 있습니다. 하지만 배열의 크기를 키우는 과정에서 많은 부하가 발생합니다. 이런 기능은 List 데이터 스트럭쳐의 본질적인 기능이라고 할 수는 없습니다. 따라서 우리 수업에서는 다루지 않습니다. 궁금하신 분은 Dynamic Array를 참고해주세요.

삭제

특정 인덱스에 위치하는 엘리먼트를 삭제할 때는 remove를 사용합니다.

1
numbers.remove(2);

가져오기

엘리먼트를 가져올 때는 get을 사용합니다. 이때 내부적으로 배열을 이용하기 때문에 매우 빠르게 엘리먼트를 가져올 수 있습니다.

1
numbers.get(2);

반복

자바에서는 ArrayList를 탐색하기 위한 방법으로 iterator을 제공합니다. 이것은 주로 객체지향 프로그래밍에서 사용하는 반복기법입니다. 우선 Iterator 객체를 만들어야 합니다.

1
Iterator it<Integer> = numbers.iterator();

Iterator 객체는 numbers 객체 내부에 저장된 값을 하나씩 순회하면서 탐색할 수 있도록 돕는 객체입니다.

1
2
3
while(it.hasNext()){
System.out.println(it.next());
}

it.next() 메소드를 호출할 때마다 엘리먼트를 순서대로 리턴합니다. 만약 더 이상 순회할 엘리먼트가 없다면 it.hasNext()의 값은 false가 되면서 while문이 종료 됩니다.

단순 출력을 위해서 순회를 하지는 않겠지요? 순회 과정에서 필요에 따라서는 엘리먼트를 삭제/추가하는 작업을 해야 할 것입니다. 그런 경우 아래와 같이 처리할 수 있습니다.

1
2
3
4
5
6
while(it.hasNext()){
int value = it.next();
if(value == 30){
it.remove();
}
}

it.remove()는 it.next()를 통해서 반환된 numbers의 엘리먼트를 삭제하는 명령입니다.

조금 더 편리한 방법도 있습니다.

1
2
3
for(int value : numbers){
System.out.println(value);
}


전체코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package list.arraylist.api;
import java.util.ArrayList;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<Integer>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40);
System.out.println("add(값)");
System.out.println(numbers);
numbers.add(1, 50);
System.out.println("\nadd(인덱스, 값)");
System.out.println(numbers);
numbers.remove(2);
System.out.println("\nremove(인덱스)");
System.out.println(numbers);
System.out.println("\nget(인덱스)");
System.out.println(numbers.get(2));
System.out.println("\nsize()");
System.out.println(numbers.size());
System.out.println("\nindexOf()");
System.out.println(numbers.indexOf(30));
Iterator it = numbers.iterator();
System.out.println("\niterator");
while (it.hasNext()) {
int value = (int) it.next();
if (value == 30) {
it.remove();
}
System.out.println(value);
}
System.out.println(numbers);
System.out.println("\nfor each");
for (int value : numbers) {
System.out.println(value);
}
System.out.println("\nfor");
for (int i = 0; i < numbers.size(); i++) {
System.out.println(numbers.get(i));
}
}
}



출처 : https://opentutorials.org/module/1335/8711



저작자 표시
신고


Posted by injunech
2015.03.14 20:15


JNA는 기존 JNI(Java Native Interface)의 복잡한 구현 방식을 단축하고자 나온 OpenSource Library이다.

https://github.com/twall/jna

JNA를 이용하면 JNI의 native library와의 연결을 위한 javah header파일 생성, native source 파일 생성, 컴파일 등의 과정이 불필요하며, 이미 만들어진 native library의 재사용이 가능하게 된다. 말 그대로 native access임..ㅎ

예 1) JNI 개발 과정

1) Native Method 선언된 Java Class 코딩
2) Java Class 컴파일
3) javah를 통한 C Header파일 생성
4) C 소스 코딩
5) C 소스 컴파일
6) Execute Java Class


예 2) JNA 개발 과정

1) Native Method 선언된 Java Class 코딩
2) Java Class 컴파일
3) Execute Java Class


참고로 최근에 많은 OpenSource들이 JNA를 이용하여 성능을 향상시키는 방식를 적용하고 있으며, 무엇보다도 지저분한 h,c 파일들이 프로젝트 내에서 사라지게 되어 매우 깔끔해지고 관리도 수월하다. ;)

다음은 JNA를 통해 test.so의 foo라는 함수를 호출하는 간단한 예제를 만들어 보았다.


1. TestLibrary Interface

import com.sun.jna.Library;
import com.sun.jna.Native;

/**
 * Test Library Interface
 *
 * @Author Xenomity™ a.k.a P-slinc' (이승한)
 */
public interface TestLibrary extends Library {
    TestLibrary LIBRARY = (TestLibrary) Native.loadLibrary(("test.so"), TestLibrary.class);

    /**
     * foo method
     */
    void foo();  // native method
}


2. Test Result

TestLibrary.LIBRARY.foo();

...

[RESULT] foo function executed~~!.


신고

'Programming > JAVA' 카테고리의 다른 글

Java 문자열 숫자 자료형 변환  (0) 2016.11.14
[Java] Bluetooth Examples for javax.bluetooth.DiscoveryAgent  (0) 2015.05.18
JNA (Java Native Access)  (0) 2015.03.14
[JAVA] 자바 실행파일 만들기  (0) 2015.03.01
JGoodies JAVA Swing API  (0) 2015.02.07
클래스 java.io.File  (0) 2013.05.29


Posted by injunech
2015.03.01 15:27


JAVA 로 생성한 코드를 실행프로그램으로 생성하는 방법입니다.


1. Java 코드를 Jar 파일로 추출하기

JAVA 코드 작성한 개발 툴에서 export ( 내보내기 ) 클릭하여 Java > Runnable JAR file 선택합니다.

만들고자 하는 프로젝트를 선택 후 저장될 경로를 입력하여 Jar 파일을 추출합니다.








2. 위에서 추출한 Jar 파일을 실행파일로 만들어줄 JSmooth 다운받고 설치

http://sourceforge.net/projects/jsmooth/files/



3. JSmooth 파일을 실행시키고 다음과 같이 하나씩 설정하여 실행파일을 생성한다.


 1) Skeleton 에서 원하는 속성을 선택한다.

만들고자 하는 실행파일이 콘솔출력이면 Console Wrapper 를 선택하고

스윙, AWT를 이용한 출력이면 Windowed 를 선택하고 기타 원하는 목적에 맞게 선택.

 - Single instance 선택시에 중복실행 안되고 한번의 실행만 되도록 설정한다.








 2) Executable Binary 엔 파일이 저장 될 경로와 파일 이름을 적어주고 Executable Icon엔 파일의 아이콘이 될 사진파일을 추가한다.

Executable Binary 에 파일명을 적을경우 .exe 확장명을 꼭 붙여준다. (생성이후에 .exe 확장명을 붙여도 상관없긴합니다.)








 3) Embedded jar 에서 실행파일을 만들고자 하는 Jar 파일을 불러온뒤 Main Class 에서 Main 으로 실행될 클래스를 선택한다.

Application Arguments 는 Main 실행시 선택될 매게 변수










 4) Java 의 Minimum 버전을 입력해준다.







4. 위 3번 과정을 모두 마친 후에 Project > Compile 을 선택하여 실행파일을 생성한다.

3.2 에서 선택한 경로로 실행파일이 생성된다.
















신고

'Programming > JAVA' 카테고리의 다른 글

[Java] Bluetooth Examples for javax.bluetooth.DiscoveryAgent  (0) 2015.05.18
JNA (Java Native Access)  (0) 2015.03.14
[JAVA] 자바 실행파일 만들기  (0) 2015.03.01
JGoodies JAVA Swing API  (0) 2015.02.07
클래스 java.io.File  (0) 2013.05.29
평년/윤년 구하기  (0) 2013.03.02


Posted by injunech

티스토리 툴바