2019.06.13 09:52


 Java로 작성할 프로그램을 exe 실행파일로 만들기입니다.

 

실행파일로 만들어주는 프로그램들중 제가 알고있는건 JSmooth, exe4j, Launch4j 3가지 인데요.

 

이 중에서 Launch4j가 작성한 프로그램을 완벽하게 wrapping 해주기 때문에 디코딩될 걱정을 덜어준다는 메리트가 있어서

 해당 프로그램을 사용해볼까 합니다.

 

 

 

1. 다운로드


 

(Lauch4J 공식 홈페이지 : http://launch4j.sourceforge.net/)

 

위의 링크를 통하여 Launch4J의 공식홈페이지로 가서 Download를 클릭합니다.

 

 

 

상단의 화면에서 자신의 OS에 맞게 다운로드를 합니다. (저는 상단의 Download launch4j-3.11-win32.exe 를 선택했습니다.)

 

 

 

2. 설치


 

다운로드가 완료됐습니다. 실행시킵니다.

 

다음!

 

동의함!

 

설치! 를 누르시면 설치가 진행되며 끝납니다.

 

 

 

3. 실행 (exe 만들기)


이전 포스팅에서 만들었던 jar 파일을 쓸 때가 왔습니다.

(참고 포스팅> CMD창에서 실행가능한 jar파일 생성하기 http://jinunthing.tistory.com/6)

 

Launch4j 를 실행시키면 나타나는 화면입니다.

 

 

Basic탭에서

Output file에는 exe파일이 나오게 될 경로를 적어주시면 되고

Jar에는 exe파일로 생성할 jar파일을 선택하시면 됩니다.

 

 

 

다음은 Classpath탭입니다.

 

Custom classpath 체크박스를 활성화 시키시면 작성이 가능합니다.

(저는 이미 전 포스팅때 설정을 해놓았기에 따로 적지 않았습니다.)

 

 

 

Header 탭입니다.

 

작성하신 프로그램이 GUI타입이라면 GUI를 콘솔타입이시라면 Console에 체크를 하셔야

프로그램이 정상적으로 실행됩니다.

 

 

 

JRE 탭입니다.

 

하단의 Min JRE version에 1.6.0 버전을 적었습니다.

해당 칸을 비울 시 exe파일로 변환이 되지 않습니다.

 

 

 

Version Info 탭입니다.

 

Add version information 체크박스를 활성화 시키면 기입이 가능하게 되며

굳이 적지 않으셔도 됩니다.

 

설정을 마치셨다면 왼쪽 위 톱니바퀴 버튼을 클릭합니다.

 

 

 

톱니바퀴 버튼을 누르고 나면 나오는 저장 화면 입니다.

 

지금까지 새롭게 입력한 값을 저장하는 화면입니다.

파일 이름을 적으시고 아무데나 저장하셔도 됩니다.

 

 

 

저장 버튼을 누르고 난 후 Launch4j 화면 하단의 Log창입니다.

 

Successfully created C:\Java\Server.exe 를 보실 수 있습니다.

 

 

 

※만약 실행하는 컴퓨터에 JRE가 설치되어있지 않다면 경고메시지가 뜨며 Java 홈페이지를 띄웁니다!

 

드디어 jar파일로 exe 파일 만들기를 마쳤습니다.

감사합니다^^

 

 

출처 : https://jinunthing.tistory.com/



Posted by injunech
2019.06.09 13:07


File 클래스 정리

java.io 패키지는 기존의 파일이나 폴더에 대한 제어를 하는 데 사용하는 File 클래스를 제공한다. 이 클래스를 이용해서 파일과 폴더에 대한 다양한 기능을 제공한다.

 

파일을 나타내는 객체를 생성하려면 다음과 같은 File 클래스의 생성자 함수를 이용한다.

 

* File 클래스의 생성자

File 클래스의 생성자 

 설명

File(File parent, String Child) 

 parent 객체 폴더의 child 라는 파일에 대한 File 객체를 생성한다.

File(String pathname) 

 pathname에 해당되는 파일의 File 객체를 생성한다. 

File(String parent, String, child) 

 parent 폴더 경로의 child라는 파일에 대한 File 객체를 생성한다.

File(URI uri)

 file uri 경로에 대한 파일의 File 객체를 생성한다. 

 

* File 클래스의 메소드

File 클래스의 메소드 

설명 

 File getAbsoluteFile()

 파일의 절대 경로를 넘겨준다. 

 String getAbsolutePath() 

 파일의 절대 경로를 문자열로 넘겨준다. 

 File getCanonicalFile() 

 파일의 Canonical 경로를 넘겨준다. 

 String getCanonicalPath()

 파일의 Canonical 경로를 문자열로 넘겨준다. 

 String getName()

 파일이나 폴더의 이름을 넘겨준다. 

 String getParent() 

 부모 경로에 대한 경로명을 문자열로 넘겨준다. 

 File getParentFile()

 부모 폴더를 File의 형태로 리턴한다. 

 String getPath() 

 파일의 경로를 문자열의 형태로 리턴한다. 

 long getTotalSpace() 

 하드디스크의 총 용량을 리턴한다.

 long getUsableSpace()

 하드디스크의 사용 가능한 용량을 리턴한다.

 long getFreeSpace()   하드디스크의 남은 공간을 리턴한다.

 int hashCode()

 hash code를 반환한다. 

 long lastModified() 

 해당 경로 파일의 최종 수정 일자를 반환한다. 

 long length()

 해당 경로 파일의 길이를 반환한다. 

 Path toPath()

 java.nio.file.Path 객체로 반환한다. 

 URI toURI() 

 URI 형태로 파일 경로를 반환한다. 

 File[] listRoots()

 하드디스크의 루트 경로를 반환한다. 

 String[] list() 

 경로의 파일들과 폴더를 문자열 배열로 반환한다. 

 String[] list(FilenameFilter filter) 

 filter에 만족되는 파일들과 폴더 이름을 문자열 배열로 반환한다. 

 File[] listFiles() 

 해당 경로의 파일들과 폴더의 파일을 배열로 반환한다. 

 File[] listFiles(FileFilter filter) 

 filter에 만족되는 파일들과 폴더를 File 배열로 반환한다. 

 File[] listFiles(FilenameFilter filter)

 filter에 만족되는 파일들과 폴더를 File 배열로 반환한다. 

 

* File 생성/수정/삭제 메소드

File 생성 수정 삭제 메소드 

 설명

 boolean createNewFile()

 주어진 이름의 파일이 없으면 새로 생성한다.

 static File createTempFile(String prefix, String suffix) 

 default temporary-file 디렉토리에 파일 이름에 prefix와 suffix를 붙여  임시파일을 생성한다.

 static File createTempFile(String prefix, String suffix, File directory) 

 새로운 임시파일을 파일 이름에 prefix와 suffix를 붙여 directory 폴더에 생성한다.

 boolean delete()

 파일이나 폴더를 삭제한다. 단, 폴더가 비어있지 않으면 삭제할 수 없다. 

 void deleteOnExit() 

 자바가상머신이 끝날 때 파일을 삭제한다. 

 boolean mkdir()

 해당 경로에 폴더를 만든다. 

 boolean mkdirs() 

 존재하지 않는 부모 폴더까지 포함하여 해당 경로에 폴더를 만든다.

 boolean renameTo(File dest) 

 dest 로 File 이름을 변경한다. 

 

* File 체크 메소드

 File 체크 메소드 

 설명 

  boolean exists()

 파일의 존재 여부를 리턴한다. 

  boolean isAbsolute() 

 해당 경로가 절대경로인지 여부를 리턴한다.

  boolean isDirectory() 

 해당 경로가 폴더인지 여부를 리턴한다. 

  boolean isFile() 

 해당 경로가 일반 file 인지 여부를 리턴한다.

  boolean isHidden()

 해당 경로가 숨김 file 인지 여부를 리턴한다.

 

* File 권한 메소드

File 클래스 권한 관련 메소드 

설명 

 boolean canExecute()

 파일을 실행할 수 있는지 여부를 리턴한다.

 boolean canRead() 

 파일을 읽을 수 있는지 여부를 리턴한다. 

 boolean canWrite()

 파일을 쓸 수 있는지 여부를 리턴한다. 

 boolean setExecutable(boolean executable)

 파일 소유자의 실행 권한을 설정한다.

 boolean setExecutable(boolean executable, boolean ownerOnly) 

 파일의 실행 권한을 소유자 또는 모두에 대해 설정한다. 

 boolean setReadable(boolean readable) 

 파일의 소유자의 읽기 권한을 설정한다. 

 boolean setReadable(boolean readable, boolean ownerOnly)

 파일의 읽기 권한을 소유자 또는 모두에 대해 설정한다. 

 boolean setReadOnly()

 파일을 읽기 전용으로 변경한다. 

 boolean setWritable(boolean writable)

 파일의 소유자의 쓰기 권한을 설정한다. 

 boolean setWritable(boolean writable boolean ownerOnly) 

 파일의 쓰기 권한을 소유자 또는 모두에 대해 설정한다. 

 

# 예제1 - 파일정보 가져오

import java.io.File;
import java.io.IOException;


public class FileTest {

    public static void main(String[] args) {
        
        // FileTest project 폴더에서 filefolder	est.txt  파일을 객체로 생성한다.
        // 는 이스케이프 문자로 인식되므로 \\ -> \ 로 사용한다.
        File file = new File("filefolder\\test.txt");

        // 경로에 파일이 존재하면
        if(file.exists()){
            
            try{
                
                System.out.println("getName: " + file.getName());  // 파일 이름 출력
                System.out.println("getPath: " + file.getPath());    // 파일 경로 출력 
                // 파일 절대 경로 출력              
                System.out.println("getAbsolutePath : "+ file.getAbsolutePath());  
                // 파일 정규 경로 출력
                System.out.println("getCanonicalPath : "+ file.getCanonicalPath()); 
                // 상위 폴더 출력
                System.out.println("getParent : " + file.getParent());   
                
           // 파일의 쓰기/읽기 권한 체크
          if(file.canWrite()) System.out.println(file.getName() + "은 쓸 수 있습니다.");
          if(file.canRead()) System.out.println(file.getName()+ "은 읽을 수 있습니다.");
                
                // 객체의 파일, 폴더 여부 체크
                if(file.isFile()){
                    System.out.println(file.getName() + "은 파일입니다.");
                }else if(file.isDirectory()){
                    System.out.println(file.getName() + "은 폴더입니다.");
                }else{
                    System.out.println(file.getName() + "은 파일도 폴더도 아닙니다.");
                }
                
          // 파일 내용 길이 출력
          System.out.println(file.getName() + "의 길이는 "+ file.length() + " 입니다.");
            
            }catch(IOException e){
                System.err.println(e);
            }
        
        }else{
            System.out.println("파일을 찾을 수 없습니다. ");
        }
    }
}

 

 

# 예제2 - 파일 목록 출력 예제

import java.io.File;


public class FileTest2 {

    public static void main(String[] args) {
        
        // 프로젝트 현재 폴더를 객체로 생성한다.
        File file = new File(".");
        
        // file이 존재하고 폴더일 경우
        if(file.exists() && file.isDirectory()){
            
            // 폴더의 파일/폴더 목록을 문자열 배열로 반환
            String[] fList = file.list();
            
            // 출력
            for(int i=0; i<fList.length; i++)
                System.out.println(fList[i]);
        
        }else{
            System.out.println("해당 경로는 폴더가 아닙니다.");
        }
    }
}

 

#예제3 - 하드디스크 정보 출력

import java.io.File;


public class FileTest3 {
    
    public static void main(String arg[]){
        
        String drive;
        double totalSpace, usedSpace, freeSpace, usableSpace;
        
        // 하드디스크의 루트 드라이버들을 배열로 반환한다.
        File[] roots = File.listRoots();
        
        for(File root : roots){
            
            // 루트 드라이버의 절대 경로
            drive = root.getAbsolutePath();
            
            // 하드디스크 전체 용량
            totalSpace = root.getTotalSpace() / Math.pow(1024, 3);
            // 사용가능한 디스크 용량
            usableSpace = root.getUsableSpace() / Math.pow(1024,3);
            // 여유 디스크 용량
            freeSpace = root.getFreeSpace() / Math.pow(1024,3);
            // 사용한 디스크 용량
            usedSpace = totalSpace - usableSpace;
            
            System.out.println("하드 디스크 드라이버 : " + drive);
            System.out.println("총 디스크 용량 : " + totalSpace + "GB");
            System.out.println("사용 가능한 디스크 용량 : " + usableSpace + "GB");
            System.out.println("여유 디스크 용량 : " + freeSpace + "GB");
            System.out.println("사용한 디스크 용량 : " + usedSpace+"GB");
            System.out.println();
            
        }
    }   
}

File[] roots = File.listRoots(); 는 하드디스크의 루트 드라이버를 배열로 반환한다.

- getUsableSpace()와 getFreeSpace() 는 결과가 같다.

- 사용한 디스크 용량은 총 용량에서 사용가능한 용량을 뺀 값이다.

- Math.pow(1024,3) 은 1024를 3승한 값이다.


출처: https://hyeonstorage.tistory.com/233 [개발이 하고 싶어요]

 



Posted by injunech
2019.06.06 23:13


 

[JAVA] getProperty()으로 시스템속성 구하기 (OS종류, 사용자ID 등)

자바로, 현재 운영체제 종류 등의 각종 시스템 속성을 구하는 방법입니다. getProperty() 메소드(함수)에, 구하고자 하는 속성의 이름을 문자열로서 지정하면 됩니다.

# 간단한 사용 예제

public class Foo {
  public static void main(String[] args) {

    System.out.println("운영체제 종류: " + System.getProperty("os.name") );

    System.out.println("자바 가상머신 버전: " + System.getProperty("java.vm.version") );

    System.out.println("클래스 버전: " + System.getProperty("java.class.version") );

    System.out.println("사용자 로그인ID: " + System.getProperty("user.name") );

  }
}

# 결과화면

운영체제 종류: Windows 2000
자바 가상머신 버전: 1.5.0_08-b03
클래스 버전: 49.0
사용자 로그인ID: Administrator

 

관련 API 함수 목록

 



Posted by injunech
2019.05.22 19:43


Java에서 관리자 권한으로 프로그램을 실행하거나, cmd 명령어를 실행하고 싶을 때가 종종 있다.

shell32.dll의 ShellExecuteEx 함수를 이용하면 Java에서 할 수 있다.

ShellExecuteEx

지정된 파일에 대해 작업을 수행해주는 함수.

그런데 이 녀석, DLL 함수이다. Java에서 DLL을 참조하기 위해서 JNA 라이브러리를 사용해야 한다.

JNA (Java Native Access)

Java에서 Native 영역으로 Access 시켜준다.

Maven으로 아래의 디펜던시를 추가하거나,

<dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>4.2.1</version> </dependency>

혹은, 링크로 바로 다운받아서 프로젝트의 Build Path에 추가할 수도 있다.

JNA를 추가했다면, 이제 shell32.dll을 사용하기 위해서 인터페이스를 만들어야 한다. 정석대로라면 StdCallLibrary 인터페이스를 상속받아서 인터페이스를 만들어야 하지만, JNA에서는 Shell32 인터페이스를 지원하기때문에 Shell32 인터페이스를 사용 할 거다.

그런데 이 Shell32 인터페이스에는 쓰고싶은 ShellExecuteEx 함수가 정의되어 있지 않기 때문에 새로운 클래스 Shell32X를 만들어서 Shell32 인터페이스를 상속받은 다음 ShellExecuteEx 메소드를 정의해야 한다.

만약, JNA에서 지원하는 여러가지 인터페이스에 쓰고싶은 함수가 이미 정의되어 있다면, 굳이 새로운 인터페이스를 만들어서 상속받을 필요는 없다.

Shell32X.java

package org.silentsoft.core.util.elevator.extend; import java.util.Arrays; import java.util.List; import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.Structure; import com.sun.jna.WString; import com.sun.jna.platform.win32.Shell32; import com.sun.jna.platform.win32.WinDef.HINSTANCE; import com.sun.jna.platform.win32.WinDef.HWND; import com.sun.jna.platform.win32.WinNT.HANDLE; import com.sun.jna.platform.win32.WinReg.HKEY; import com.sun.jna.win32.W32APIOptions; public interface Shell32X extends Shell32 { Shell32X INSTANCE = (Shell32X) Native.loadLibrary("shell32", Shell32X.class, W32APIOptions.UNICODE_OPTIONS); int SW_HIDE = 0; int SW_MAXIMIZE = 3; int SW_MINIMIZE = 6; int SW_RESTORE = 9; int SW_SHOW = 5; int SW_SHOWDEFAULT = 10; int SW_SHOWMAXIMIZED = 3; int SW_SHOWMINIMIZED = 2; int SW_SHOWMINNOACTIVE = 7; int SW_SHOWNA = 8; int SW_SHOWNOACTIVATE = 4; int SW_SHOWNORMAL = 1; /** File not found. */ int SE_ERR_FNF = 2; /** Path not found. */ int SE_ERR_PNF = 3; /** Access denied. */ int SE_ERR_ACCESSDENIED = 5; /** Out of memory. */ int SE_ERR_OOM = 8; /** DLL not found. */ int SE_ERR_DLLNOTFOUND = 32; /** Cannot share an open file. */ int SE_ERR_SHARE = 26; int SEE_MASK_NOCLOSEPROCESS = 0x00000040; int ShellExecute(int i, String lpVerb, String lpFile, String lpParameters, String lpDirectory, int nShow); boolean ShellExecuteEx(SHELLEXECUTEINFO lpExecInfo); public static class SHELLEXECUTEINFO extends Structure { /* * DWORD cbSize; ULONG fMask; HWND hwnd; LPCTSTR lpVerb; LPCTSTR lpFile; * LPCTSTR lpParameters; LPCTSTR lpDirectory; int nShow; HINSTANCE * hInstApp; LPVOID lpIDList; LPCTSTR lpClass; HKEY hkeyClass; DWORD * dwHotKey; union { HANDLE hIcon; HANDLE hMonitor; } DUMMYUNIONNAME; * HANDLE hProcess; */ public int cbSize = size(); public int fMask; public HWND hwnd; public WString lpVerb; public WString lpFile; public WString lpParameters; public WString lpDirectory; public int nShow; public HINSTANCE hInstApp; public Pointer lpIDList; public WString lpClass; public HKEY hKeyClass; public int dwHotKey; /* * Actually: union { HANDLE hIcon; HANDLE hMonitor; } DUMMYUNIONNAME; */ public HANDLE hMonitor; public HANDLE hProcess; protected List getFieldOrder() { return Arrays.asList(new String[] { "cbSize", "fMask", "hwnd", "lpVerb", "lpFile", "lpParameters", "lpDirectory", "nShow", "hInstApp", "lpIDList", "lpClass", "hKeyClass", "dwHotKey", "hMonitor", "hProcess", }); } } }

그리고 이 Shell32X 인터페이스를 호출해주는 Elevator 클래스를 만들자.

Elevator.java

package org.silentsoft.core.util.elevator.core; import org.silentsoft.core.util.elevator.extend.Shell32X; import org.silentsoft.core.util.elevator.extend.Shell32X.SHELLEXECUTEINFO; import com.sun.jna.WString; import com.sun.jna.platform.win32.Kernel32; import com.sun.jna.platform.win32.Kernel32Util; public class Elevator { public static void executeAsAdmin(String command, String args) { SHELLEXECUTEINFO execInfo = new SHELLEXECUTEINFO(); execInfo.lpFile = new WString(command); if (args != null) { execInfo.lpParameters = new WString(args); } execInfo.nShow = Shell32X.SW_SHOWDEFAULT; execInfo.fMask = Shell32X.SEE_MASK_NOCLOSEPROCESS; execInfo.lpVerb = new WString("runas"); boolean result = Shell32X.INSTANCE.ShellExecuteEx(execInfo); if (!result) { int lastError = Kernel32.INSTANCE.GetLastError(); String errorMessage = Kernel32Util.formatMessageFromLastErrorCode(lastError); throw new RuntimeException("Error performing elevation: " + lastError + ": " + errorMessage + " (apperror=" + execInfo.hInstApp + ")"); } } }

이제 Elevator 클래스를 이용하여 cmd 명령을 수행하거나, 프로그램을 실행할 수 있다.

cmd 명령을 수행하는 메소드이다.

public static void runCommand(String command) throws IOException { Runtime.getRuntime().exec("cmd /C " + command); } public static void runCommandAsAdmin(String command) { Elevator.executeAsAdmin("c:\\windows\\system32\\cmd.exe", "/C " + command); }

프로그램을 실행하는 메소드이다.

public static void runProgram(String target, String args) throws IOException { args = (args == null) ? "" : args; Runtime.getRuntime().exec("cmd /C start " + target + " " + args); } public static void runProgramAsAdmin(String target, String args) { args = (args == null) ? "" : args; Elevator.executeAsAdmin("c:\\windows\\system32\\cmd.exe", "/C start " + target + " " + args); }



Posted by injunech
2019.03.02 21:07


[JAVA] Base64 인코딩, 디코딩 (Java8+, java.util.Base64)


Base64는 64문자의 영숫자를 이용하여 멀티 바이트 문자열이나 이진 데이터를 다루기 위한 인코딩 방식.

인코딩에는 java.util.Base64.Encoded#encode() 메소드, 디코딩에는 java.util.Base64.Decode#decode() 메소드를 사용.


API Documentation


Base64 https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html




import java.io.UnsupportedEncodingException; import java.util.Base64; import java.util.Base64.Decoder; import java.util.Base64.Encoder; public class Base64EncodeDecodeSample { public static void main(String[] args) throws UnsupportedEncodingException { String target = "암호화할내용을적어주세요"; byte[] targetBytes = target.getBytes("UTF-8"); // Base64 인코딩 /////////////////////////////////////////////////// Encoder encoder = Base64.getEncoder(); // Encoder#encode(byte[] src) :: 바이트배열로 반환 byte[] encodedBytes = encoder.encode(targetBytes); System.out.println(new String(encodedBytes)); // Encoder#encodeToString(byte[] src) :: 문자열로 반환 String encodedString = encoder.encodeToString(targetBytes); System.out.println(encodedString); // Base64 디코딩 /////////////////////////////////////////////////// Decoder decoder = Base64.getDecoder(); // Decoder#decode(bytes[] src) byte[] decodedBytes1 = decoder.decode(encodedBytes); // Decoder#decode(String src) byte[] decodedBytes2 = decoder.decode(encodedString); // 디코딩한 문자열을 표시 String decodedString = new String(decodedBytes1, "UTF-8"); System.out.println(decodedString); System.out.println(new String(decodedBytes2, "UTF-8")); } }




Posted by injunech
2018.04.16 01:27




Java Error List


ERROR

Exception in thread "main" java.lang.NoClassDefFoundErroe:파일명

발생되는 경우

클래스 파일을 찾을 수 없는 경우

조 치

실행하려는 클래스 파일 이름이 제대로 되어 있는지 확인한다.

또한, CLASSPATH 설정이 제대로 되어 있는지 확인하며(DOS Mode에서 set 명령어)

만약, 설정이 되어 있지 않다면 설정한다.(CLASSPATH = jdk버전번호/jre/lib/rt.jar;)

ERROR

cannot resolve symbol

symbol : class in(에러가 난 부분)

location : class StackTest(찾으려는 위치)

발생되는 경우

이해할 수 없는 클래스나 메소드, 변수명이 올 경우

조 치

보통 이 에러는 철자가 틀렸을 경우에 많이 발생한다. 클래스, 메소드, 변수의 철자

를 세심하게 확인해 본다.

특히, 철자를 확인할 때 대/소문자 구분을 확실하게 체크한다.(자바는 대/소문자를

구별한다.)

그리고 클래스에서 발생할 경우 import를 선언해 주었는지 확인해 본다.

ERROR

non-static variable 변수이름(or method 메소드 이름) cannot br referenced from

a static context

발생되는 경우

static 메소드 안에서 static으로 선언되지 않은 메소드나 변수를 참조(사용)했을 경

우 특히, 메소드의 경우는 인스턴스를 사용하지 않고 static 메소드 내에서 바로 선

언할 경우

조 치

static 선언자의 사용 여부를 살펴보고 static 메소드 안에 static으로 선언되어지지

않은 메소드나 변수가 있는지 확인해 본다.

만약 그런것이 있으면 메소드를 새로 만들어 그쪽에서 선언한다. 단, 인스턴스를 생

성해서 불러줘야 한다는 것을 잊지 말아야 한다.

ERROR

valiable 변수명 might not have been initialized

발생되는 경우

지역변수인 변수명의 변수가 초기화가 되어 있지 않았을 경우

조 치

지역변수(메소드 내에서 선언한 변수)를 초기화 하지 않은 채 선언했을 경우 발생한다.

멤버 필드가 아닌 경우는 반드시 변수 선언시 초기화를 해주어야 한다.

(멤버 필드는 자바 프로그램 자체에서 자동으로 Default 값으로 초기화 해준다.)

ERROR

class 클래스명 is public, should be declared in a file named 클래스명.java

발생되는 경우

클래스명이 public으로 선언되었는데 파일명과 다를 경우

조 치

public으로 선언된 클래스가 있다면 반드시 그 클래스명과 파일명이 같아야 한다.

클래스명과 파일명의 대/소문자 및 철자가 같은지 확인해 본다.

또한, public으로 선언된 클래스가 하나 이상 있는지 찾아본다.(반드시 하나만 있어

야 한다.)

ERROR

push(java.lang.objrct)[메소드(인자로 받을 수 있는 형)] in java.util.Stack(메소드의

클래스) cannot be applied to (int)[잘못 들어간 형]

발생되는 경우

메소드에서 인자를 받을 때 받을 수 있는 형이 아닌 자료형 또는 클래스형을 사용할 경우

조 치

사용하는 메소드의 API를 참고하여 어떤 형을 인자로 받을 수 있는지 찾아본다.

API를 보지 못할 경우는 각 자료형으로 인자를 직접 바꾸어 본다.

ERROR

java.lang.NoSuchMethodError: main

Exception in thread :main"

발생되는 경우

클래스 파일 안에서 main() 메소드를 찾을 수 없는 경우

조 치

자바 애플릿이 아닌 이상 자바 애플리케이션은 반드시 main() 메소드를 사용해야 한

다. main() 메소드를 빼먹지 않았는지 확인해 본다. 또한, public static void

main(String[] args) 형식으로 쓰여졌는지 확인해 본다.

(main 클래스는 반드시 위와 같은 형식으로 만들어져야 한다.)

ERROR

unreported exception java.io.IOException(Exception명); must be caught or

declared to be thrown

발생되는 경우

예외가 발생하는데 예외 처리를 해주지 않았을 경우

조 치

예외를 발생하는 메소드 같은 경우는 반드시 예외 처리를 해주어야 한다. 예외를 발

생하거나 예외 처리를 해야하는 메소드는 API를 확인해 보면 알 수 있다. 그렇지 않

다면 컴파일 후 지금처럼 에러가 난 예외를 예외 처리해주면 된다.

또한, 예외를 처리할 때는 메소드 차원에서 throws 예외명을 이용하여 처리할 수 있

고 try{} catch{} 구문을 이용하여 직접 처리해 주어도 된다.

특히, 예외도 클래스이므로 반드시 예외가 들어간 패키지를 import 해주어야 한다.

ERROR

Note : Calculator.java(파일명) uses or overrides a deprecated API.

Note : Recompile with -deprecation for details.

발생되는 경우

JDK 버전이 높아졌거나 보안 등의 이유로 사용이 deprecated된 메소드를 사용한 경우

조 치

예외라기 보다는 경고 메시지로 JDK 가 버전이 높아지거나 보안 등의 이유에 따라

예전에 만들어졌지만 필요가 없어지거나 대체된 메소드가 생겨났다.

이런 메소드를 deprecated 되었다고 하는데, 이는 API 상에 나와 있다. 또한, 컴파

일할 때 -deprecation 옵션을 주면 어떤 메소드가 deprecate 됐는지 알 수 있다.

사용이 중지 됐다고 보기 보다는 사용을 가능하면 하지 않게끔 하는 것으로 대치되

었거나 버전 업된 메소드를 사용하면 된다.

ERROR

MouseEvent(클래스명) should be declared abstract; it does not define

mouseDragged(java.awt.event.MouseEvent)[메소드명(메소드가 포함된 클래스)]

in MouseEvent(클래스명)

발생되는 경우

implements한 interface의 모든 메소드를 구현하지 않아서 발생됨

조 치

interface는 모든 메소드가 선언만되고 구현되지 않은 추상(abstract) 메소드이다. 만

약, interface를 implements하려면 implements한 클래스가 interface에서 선언한 모

든 메소드를 구현해 주어야 한다. 하나라도 빠질 경우 implements한 클래스도 추상

클래스로 보고 에러가 발생한다. 에러에 구현해 주어야 할 메소드명이 나오므로 그

곳에 쓰여있는 메소드를 구현해주면 된다.

만약, 그 메소드를 구현해 주었는데 에러가 발생하면 철자 및 대/소문자를 다시 확

인해 본다.

ERROR

incompatible types

found : /null(입력한 자료형)

required : int(요구하는 자료형)

발생되는 경우

입력했을 때 맞지 않는 자료형이나 클래스형을 입력할 경우

조 치

incompatible은 성미가 맞지 않는, 모순된 이라는 뜻을 가진 단어로 단어의 뜻처럼

입력 경우 required에 나타난 자료형 및 클래스형을 요구하는데 found에서 나타난

자료형 및 클래스형을 써주어서 입력을 하지 못하게 되어서 발생하는 에러이다.

found에 나타난 자료형을 required에 나타난 자료형으로 변경해 주면 된다.

ERROR

package java.servlet(패키지명) does not exist

발생되는 경우

import한 패키지가 존재하지 않을 경우

조 치

import한 패키지가 존재하지 않을 경우에 발생하는 에러로 철자와 대/소문자를 먼저

확인하고 CLASSPATH 설정을 확인해 본다.

또한, 그 곳에 패키지가 jar 파일로 있는지도 확인해본다.(API에 나와 있는 패키지는

rt.jar에 다 있다.)

단, javax가 붙거나 다음으로 시작되는 확장 패키지를 설치해 주어야 한다.(javax.swing 제외)

ERROR

java.lang.NullPointerException

Exception in thread "main"(메소드) java.lang.NullpointerException

at java.awt.Container.addlmpl(Container.java:341)...[에러가 발생한 부분]

발생되는 경우

참조하거나 사용한 클래스 또는 자료형이 초기화되지 않은 경우

조 치

보통 이것은 awt나 배열 부분에서 자주 발생하는데 초기화를 해주지 않아서 많이 발

생한다. 자바의 변수들은 기본적으로(자동으로 초기화 되는 멤버 필드 등을 제외하

고) 초기화를 요구한다. 에러에 체크된 부분을 검토해 보고 초기화를 해준다.

ERROR

';'(빠진 부분) expected

발생되는 경우

문법상으로 써야할 것을 쓰지 않은 경우

조 치

주로 ';'을 안써주거나 아니면 '()'(괄호)를 열기만 하고 닫지 않은 실수를 할 경우 발

생하며 대부분 이 에러가 발생한 경우는 에러에 나온것을 소스에 추가해 주면 된다.

ERROR

unexpected type

required : value(요구하는 타입)

found : class(소스상 써준 타입)

발생되는 경우

써주어야 할 타입이 아닌 잘못된 타입을 써주었을 경우

조 치

unexpected type 에러를 해석하면 기대하지 않은 타입이란 뜻으로 원하는 타입

(required)이 아닌데 잘못된 타입(found)을 써준 경우 발생한다.

에러 체크된 부분의 타입을 required에서 나타난 타입으로 변경해 주면 된다.

ERROR

java.lang.ArrayIndexOutOfBoundsException

at Test.amin(Test.java:10)[클래스.메소드(파일명:에러난 위치)]

Exception in thread "main"(예외가 던져진 메소드)

발생되는 경우

배열의 범위를 넘어선 값을 넣었을 경우

조 치

위의 에러는 특이하게 컴파일은 이상 없이 되지만 실행을 하면 발생하는 에러이다.

배열의 범위를 넘어선 경우 발생하므로 에러난 위치의 배열의 참조 범위를

확인해보고 선언해준 배열의 범위에 맞게 조정해 주면 된다.

ERROR

illegal start of expression

발생되는 경우

선언자(modifier)를 잘못 넣은 경우

조 치

에러의 단어 뜻은 표현의 시작이 부적격 하다 라는 의미로 보통 선언자가 맞지 않거

나 쓰일때가 아닌데 선언자를 사용한 경우 발생하며

특히, 메소드안에서 static 선언자를 사용한 경우 발생한다.

에러가 발생한 부분의 선언자를 제거하거나 맞는 것인지 다시 확인한다.

ERROR

java.io.InputStream(클래스) is abstract; cannot be instantiated

발생되는 경우

abstract로 선언된 클래스를 직접 new 명령어를 이용하여 인스턴스화 할 경우

조 치

abstract로 선언된 클래스를 직접 new 명령어를 이용하여 인스턴스화 할 경우 발생

하는데, 이는 추상 클래스는 직접 new 명령어를 이용하여 인스턴스화 할 수 없기

때문이다. 이런 경우 인스턴스를 다른 방법으로 생성하면 되는데, 예를 들어 인스턴

스를 반환하는 메소드를 이용한다거나 상속을 통해서 상속받은 클래스의 인스턴스를

만들어 직접 인스턴스를 만드는 효과를 낼 수도 있다.

ERROR

local variable name(변수명) is accessed from within inner class; needs

to be declared final

발생되는 경우

Local Class의 변수를 final로 선언하지 않은 경우

조 치

Local Class의 변수는 참조 변수의 참조값 변동을 방지하기 위하여 final 선언자를

붙여주어야 한다.

변수에 final 선언자를 붙이면 변수는 값을 변동할 수 없는 상수처럼 쓰이며 만약 이

값을 참조할 경우 자바는 이 값을 넘기는게 아니라 이 값의 복사본을 참조값으로 넘

기게 된다. 그러므로 Local Class 에서 참조값 변동 없이 변수를 참조할 수 있게 되

는 것이다. Local Class를 정의해준 곳을 살펴보고 final 선언자를 확인해본다.

ERROR

inner classes cannot have static declarations

발생되는 경우

내부 클래스 안에서 static 선언자를 쓴 경우

조 치

내부 클래스 안에서는 static 선언자를 쓸 수 없다. 내부 클래스 안에서 사용된

static 선언자를 제거해 준다.

ERROR

referenceto List is ambiguous, both class java.util.List(클래스) in java.util(패키

지) and class java.awt.List(클래스) in java.awt(패키지) match

발생되는 경우

클래스 사용시 다른 패키지내에 동일 이름의 클래스들이 있어서 참조가 모호할 경우

조 치

import한 패키지 중에 같은 이름을 사용하는 클래스를 클래스 이름만으로 생성함으

로써 참조가 모호해질 경우 발생한다. 이와 같은 경우는 import를 하나 제거하거나

아니면 java.util.List 이런식으로 직접 그 클래스의 패키지를 같이 써줌으로써 모호

성을 제거할 수 있다.

ERROR

m()(메소드명) in B(클래스명) cannot override m()(메소드명) in A(클래스명);

attempting to use incompatiable return type

발생되는 경우

클래스를 상속받고서 메소드를 오버라이드 하고자 할 때 잘못한 경우

조 치

클래스를 상속 받고서 메소드를 오버라이드 할 경우에는 다음과 같은 규칙을 지켜야 한다.

1. 메소드의 이름이 같아야 한다.

2. 메소드의 파라미터 개수, 데이터형이 같아야 한다.

3. 메소드의 리턴형이 같아야 한다.

4. 상위 메소드와 동일하거나 더 구체적인 Exception을 발생시켜야 한다.

5. 상위 메소드와 동일하거나 접근 범위가 더 넓은 접근 제한자를 사용해야 한다.

ERROR

getPathBetweenRows(int, int)(메소드) has protected access in javax.swing.jTree

(클래스)

발생되는 경우

protected로 선언된 메소드를 상속 없이 직접 불러올 경우

조 치

protected로 선언되어 있는 메소드는 상속하거나 같은 Package에 있을 때만 쓸 수

있다. 상속하여 다시 public 메소드로 값을 받던지 아니면 public 메소드 중에서 비

슷한 기능을 하는 메소드가 있는지 찾아서 바꾸어 주어야 한다.

ERROR

invalid method declaration; return type required

발생되는 경우

리턴 타입을 쓰지 않아 메소드의 선언이 잘못된 경우

조 치

리턴 타입을 쓰지 않아 메소드의 선언이 잘못된 경우 발생하므로 에러가 발생한 메

소드를 확인해보고 리턴 타입을 맞추어 준다.

ERROR

Error occurred during initialization of VM java.lang.ExceptionInInitializerError

발생되는 경우

static으로 선언된 변수중 초기화가 안되어 있는 것이 있는 경우

조 치

static으로 선언된 변수중에 초기화가 안된게 있는 경우 발생하며 에러가 발생한 변

수를 확인해보고 알맞은 초기화를 시켜주거나 변수의 위치를 자동 초기화가 가능한

메소드 밖의 클래스 변수로서 사용하게 한다.

ERROR

Error opening registry key 'Spftware\JavaSoft\Java Runtime Environment'

Error: could not find java.dll

Error: could not find Java 2 Runtime Environment

발생되는 경우

중복 설치 등으로 인해 레지스트리 키 값이 잘못된 경우

조 치

중복 설치 등으로 인해 레지스트리 키 값이 잘못되어 있는 경우 발생하며 레지스트

리 편집기를 열어 HKEY_LOCAL_MACHINE ⇒ SOFTWARE ⇒ JavaSoft에 가보면 3

개의 키가 있는데, 그 중에서 첫번째 키인 Java 런타임 환경을 마우스 오른쪽 버튼

을 클릭하여 Java Runtime Environment로 이름을 바꿔주면 된다.

ERROR

Error Registry Key 'Software\JavaSoftware\Java Runtime

Environment\CurrentVerison'

has value '1.1', but '1.3' is requied.

Error: could not find java.dll

Error: could not find java 2 Runtime Environment.

발생되는 경우

중복 설치 등으로 인해 레지스트리 키 값의 자바 버전이 잘못된 경우

조 치

중복 설치 등으로 인해 레지스트리 키 값의 자바 버전이 잘못되어 발생하며 레지스

트리 편집기를 열어서 HKEY_LOCAL_MACHINE ⇒ SOFTWARE ⇒ JavaSoft ⇒

Java Runtime Environment의 Current version의 값을 1.3으로 값이 되어 있는지 확인한다.

ERROR

java.lang.ClassNotFoundException: org.gjt.mm.mysql.Driver(드라이브명)

발생되는 경우

JDBC로 데이터베이스에 연결하는 중 드라이버를 찾지 못할 경우

조 치

JDBC를 연결하는 중에 드라이버를 찾지 못할 경우에 발생하며 각 데이터베이스에

맞는 드라이버가 제대로 다운로드 되었는지 확인해보고 드라이버의 위치가 클래스

패스에 설정되어 있는지 확인한다.

ERROR

Method printLn(java.lang.String)(메소드명) not found in class java.io.PrintStream

(클래스명)

발생되는 경우

자신이 사용한 클래스의 메소드가 맞지 않는(없는) 경우

조 치

자신이 사용한 클래스의 메소드가 맞지 않는(없는) 경우 발생하며 API를 통해서 사

용하고자 하는 클래스와 메소드를 확인해 본다. 보통 이런 경우 메소드의 철자나 대

/소문자를 잘못 쓴 경우가 많으니 유심히 확인해 보고 마지막으로 철자와 대/소문자

도 맞는다면 메소드의 인자의 객체형을 맞게 주었는지 확인해 본다.







Posted by injunech
2017.12.11 08:29


[Java] jdk 설치 및 환경변수 설정


1. JAVA JDK 다운로드


오라클 홈페이지에서(oracle.com->download->java for developer) JDK 다운로드

http://www.oracle.com/technetwork/java/javase/downloads/index.html



> JDK Download 클릭



> 아래의 Accept 버튼 클릭 후 자신의 운영체제(Windows/MacOS/Linux)에 맞는 것으로 Download



> JDK 설치 : 다운로드한 JDK설치 파일을 실행합니다.


> JRE 설치 : JDK 설치 완료후 계속 설치가 진행됩니다.


> 설치 완료







2.  환경변수 설정


> 윈도우버튼 마우스 오른쪽 버튼으로 시스템 실행 > 고급시스템 설정 > 환경 변수

> 혹은 윈도우 검색에 '시스템 환경변수 편집' 검색해서 환경변수 제어판 실행



> 환경 변수 : 시스템 변수 -> 새로만들기 


> 변수 이름에 JAVA, 변수 값에 본인의 java jdk 설치 경로 입력


> 시스템변수 Path 에 JAVA JDK 폴더 경로 추가




3. JAVA JDK 설치 및 환경변수 설정 확인


> Ctrl + R 눌러 실행 창에서 cmd 로 command 창 실행


> java -version 입력해서 아래와 같이 Java version 정보가 나온다면 모두 완료














Posted by injunech
2017.04.10 00:57


hyperlink in JLabel


AWT, Swing 과 같은 Java GUI 를 이용한 개발시에
텍스트 라벨등을 클릭한 경우 HTTP 접속, Email 연결이 되도록 하는 방법.


/**
 * Example of a jLabel Hyperlink and a jLabel Mailto
 */

import java.awt.Cursor;
import java.awt.Desktop;
import java.awt.EventQueue;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 *
 * @author ibrabelware
 */
public class JLabelLink extends JFrame {
    private JPanel pan;
    private JLabel contact;
        private JLabel website;
    /**
     * Creates new form JLabelLink
     */
    public JLabelLink() {
        this.setTitle("jLabelLinkExample");
        this.setSize(300, 100);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);

        pan = new JPanel();
        contact = new JLabel();
        website = new JLabel();

        contact.setText("<html> contact : <a href=\"\">YourEmailAddress@gmail.com</a></html>");
        contact.setCursor(new Cursor(Cursor.HAND_CURSOR));

        website.setText("<html> Website : <a href=\"\">http://www.google.com/</a></html>");
        website.setCursor(new Cursor(Cursor.HAND_CURSOR));

    pan.add(contact);
    pan.add(website);
        this.setContentPane(pan);
        this.setVisible(true);
        sendMail(contact);
        goWebsite(website);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /*
         * Create and display the form
         */
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new JLabelLink().setVisible(true);
            }
        });
    }

    private void goWebsite(JLabel website) {
        website.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                try {
                    Desktop.getDesktop().browse(new URI("http://www.google.com/webhp?nomo=1&hl=fr"));
                } catch (URISyntaxException | IOException ex) {
                    //It looks like there's a problem
                }
            }
        });
    }

    private void sendMail(JLabel contact) {
        contact.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                try {
                    Desktop.getDesktop().mail(new URI("mailto:YourEmailAddress@gmail.com?subject=TEST"));
                } catch (URISyntaxException | IOException ex) {
                    //It looks like there's a problem
                }
            }
        });
    }
}




Posted by injunech
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.03.11 11:49


WindowBuilder Java GUI(AWT,SWT,Swing) Tool

Eclipse Plug-In 설치방법



<Tools> eclipse의 GUI(AWT/Swing)플러그인(window builder)

 

1. 먼저 이클립스 접속 http://www.eclipse.org/

2. 오늘쪽 상단 검색창에 window builder 검색!!!(사실 구글에서 검색해도 됨)


3. 사실 구글검색이다. 결과 첫번째것 클릭!!

 

4.https://www.eclipse.org/windowbuilder/ 이 사이트에서 Download 를 들어간다.
(다운로드 링크 주소 : https://www.eclipse.org/windowbuilder/download.php)


5. 위 사진의 중앙부분에 Update Sites의 link 부분에서 자기의 이클립스 버전에 맞는 link를 찾아 왼쪽 클릭이 아니라 오른쪽 클릭!!!(다운받는거 아님니다.) 그리고 속성!!!

(참고로 크롬에서는 속성이 없으니 왠만하면 익스플로어에서 접속하자)

 

6. 속성 창이 뜨면 주소(URL)을 드레그하고 ctrl + c 한다.

7. 그리고 이클립스를 실행하고 help - Install - New Software... 를 열면

8. 이런게 나온다.. 여기서 오른쪽에 Add...
 
9. 그럼 Add Repository가 나오는데 Name에 window builder(이름이야 뭐 아무렇게나..) 그리고 Location에 아까 ctrl + c 했던것을 붙여넣어 준다. 그리고 OK!!

 

10. 그럼 자동으로 설치할 파일을 웹이서 찾아주고 Name에 나타나 진다.

11. Select all 클릭 후 Next > 

 

12. 자동으로 다운로드 된다.(싱기방기...)

13. Install할 목록들이 Details하게 나온다..(Swing...SWT...)

Next > 

 

14. Licenses를 Review해라...(영어는 날 힘들게해...어차피 우리는 accept의 노예...I accept... 클릭)

Finish

 

15. 그럼 설치가 된다...


16. 껏다 키란다..Yes

17. 설치 끝.. 실행해 보자 New - other - WindowBuilder - JFram - Next> 하고 JFram을 만들어 보자

 

18. 아래쪽 Design을 클릭해 요런 화면이 나오면 성공!

 

이렇게 설정이 끝나면 Eclipse 툴로 java 디자인을 작업할수 있다.



출처 - http://blog.naver.com/ourbebop/30186910685





Posted by injunech