'JAVA'에 해당되는 글 60건

  1. 2010.12.17 [sample] FileUtil / File to Byte 2
  2. 2010.12.07 jar 실행파일로 만들기 1
  3. 2010.08.05 groovy / Run As를 구동했는데 실행이 되지 않아요. 1
  4. 2010.08.05 groovy / 외부 프로젝트 받아왔을때 먼저해야 할 일
  5. 2010.08.05 groovy / 이클립스 설치 (Helios install) 4
  6. 2010.08.04 groovy / 실행에 대한 오류 startup failed
  7. 2010.08.03 groovy / 설치 1
  8. 2010.07.13 BASE64 형변환 / encode & decode 1
  9. 2010.07.13 inputStream & String 형변환
  10. 2010.07.01 [sample] streaming read to xml (스트리밍 타입으로 xml읽기)


파일을 바이트로 변환하는 코드 입니다.
사용처는 Reomote 서버에 파일을 전송할때 유용하죠.
잊어먹으면 또 찾아야 되니 여기에 잘 보관 보관 ㅎㅎ

public static byte[] getBytesFromFile(File file) throws IOException {
     InputStream is = new FileInputStream(file);

     long length = file.length();

     // You cannot create an array using a long type.
     // It needs to be an int type.
     // Before converting to an int type, check
     // to ensure that file is not larger than Integer.MAX_VALUE.
     if (length > Integer.MAX_VALUE) {
         // File is too large
     }

     // Create the byte array to hold the data
     byte[] bytes = new byte[(int)length];

     // Read in the bytes
     int offset = 0;
     int numRead = 0;
     while (offset < bytes.length
            && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
         offset += numRead;
     }

     // Ensure all the bytes have been read in
     if (offset < bytes.length) {
         throw new IOException("Could not completely read file "+file.getName());
     }

     // Close the input stream and return bytes
     is.close();
     return bytes;
 }


jar 자체를 실행파일로 만들어 사용하는 방법입니다.

1. MANIFEST.MF 

Manifest-Version: 1.0
Class-Path: .
Main-Class: LocalTest

2. 그밖에 필요한 class 를 준비합니다.

3.  jar 로 엮어 냅니다. 

C:\lang\jdk1.5.0_09\bin\jar -cfm LocalTest.jar manifest.mf *

 4. jar 실행

export LD_LIBRARY_PATH=:.
java -cp ./TestAPIClient.jar:. -jar LocalTest.jar &

 
중요한것은  MANIFEST.MF  을 만들어서 최초 mainClass 를 지정하는것 입니다.
알아서 META-INF 를 만들어내니 신경 쓰지 않아도 됩니다.








errorMessage
  no configuration file or main class specified




groovy 오류메시지는 설정을 다 하기전까지 그다지 직관적이지 않다는데 좀 문제가 있어보인다.
하지만 몇번의 시행착오와 충분한 시간이 있다면 이런 뜬구름 잡는 메시지는  groovy를 깊게 이해할 수있게
하는 도구가 되어주는것 같다.


문제의 원인은 groovy 파일이 class 파일을 만들어 내지 못했다는 데서 출발한다.
class 파일을 못했다는것은 컴파일 되지 못했다는 뜻이며 컴파일이 못되었다는것은 현재 groovy 컴파일
버전에 문제가 있다는 이야기이다.


1. 지금 이클립스에서 컴파일 버전은 1.7로 되어있다. 버전을 1.6으로 변경해 보자! [switch to 1.6] 을 클릭한다.


모든 과정에 1.6이 절대 진리라 생각하지 않았으면 좋겠습니다. groovy의  converter 를 이용해서 변환을 했기 때문에 이런일을 하는것이지 만일 프로젝트를 groovy로 생성부터 하고 시작했다면 1.7로도 가능해지기 떄문입니다.  애써 groovy에서 버전을 이렇게 쉽게 바꾸도록 한 이유를 다시한번 생각해 봤으면 합니다.

새로운 버전에 목메여 새 버전 사용을 안하면 구닥다리 개발자라 취급하는 일부 관리자 분들이 있는데
그런분들은 제가 잘 압니다.  어줍잖하게 책 몇 권보고 애자일과  XP, 짝프로그램, 운운하시는 분들이죠. (실제 진행하신바는 겨우 프로파일링 정도?) 적어도 groovy를 찾아보실 정도면 여러분은 진정한 개발자 입니다. ^^



2. 이제  RunAs를 보면 조금 달라 진것을 볼 수 있다.  실행해서 결과를 보자?


3. 잘 나온다.



여기까지 했으면 이제 groovy를 개발 할 수 있습니다.
별로 어렵지 않은데 모르면 한참을 돌아가야 되는것 이오니 groovy  개발에 많이 도움이 되셨길 바랍니다.


소제목 : 일반 프로젝트를 groovy 프로젝트로 변경하기

이미 누군가가 groovy  프로젝트를 만들어 놓았고 그것을 받아서 하는 입장이라면
개발에 앞서 선행 되어야 하는 일들이 있다.
이 과정을 수해하지 않으면 프로젝트를 활성화도 못시키고 test코드 한줄 구동시켜볼 수 없다.

1. 프로젝트가 java  되어있는 이유로 파일이 groovy라 할지라도 오류가 발생한다.

2. 프로젝트에 속성을 변경 시킨다. 이클립스에 groovy가 살 설치되었다면 configure에 "Convert to Groovy Project" 를 볼 수 있다.


3. 변환이 끝나면 소스코드가 아무런 오류없이 잘 보이는것을 볼 수 있다.


3번까지의 과정이 모두 완료 되었다고 groovy 설정이 다 끝났다고 보면 오산이다.
groovy는 아직까지 버전에 대한 호환성이나 이클립스에 버전 문제가 남아있는것 같다.
만일 3번까지 하고도 모든 설정이 성공적인지 아닌지를 확인하고 싶다면  Run As를 클릭 보면 안다.

선택할 수 있는것에  Groovy Script  가 빠져있다면 설정은 아직 더 진행해야한다.


groovy 를 이클립스에 설치할때 약간의 주의사항이 있다.
groovy 버전과 이클립스의 버전과의 상관 관계가 있다는 점이다.
 
 QUICK FACTS FOR ECLIPSE EXPERTS  
 GroovyEclipse update site for Eclipse 3.6.n (Helios) http://dist.codehaus.org/groovy/distributions/greclipse/snapshot/e3.6/  
 GroovyEclipse update site for Eclipse 3.5.n (Galileo), http://dist.springsource.org/milestone/GRECLIPSE/e3.5/ 
 GroovyEclipse update site for Eclipse 3.5.n (Galileo), http://dist.codehaus.org/groovy/distributions/greclipse/snapshot/e3.5/  
 GroovyEclipse update site for Eclipse 3.4.2 (Europa), http://ci.repository.codehaus.org/greclipse/snapshot/e34/  
 GroovyEclipse update site for Eclipse 3.4.2 (Europa),  available soon

설치에 들어가 보겠다. 이클립스 install에 설치를한다.

1. groovy 설치를 위해 work with  입력란에 위에 있는 url 을 입력한다.

2. 설치에 따른 자세한 사항을 입력한다.


3. 라이센스 관련에 대해서 동의를 해야 설치가 가능하다. "I accept the. .." 를 클릭한다.

4.설치가 진행이 되면 이클립스 화면 하단에 Install  하는 과정이 보인다.



5. 설치가 모두 완료되면 이클립스 Restat를 요청하는 팝업이 출력이 된다.


6. 모든게 재 시작되면 이클립스 Preference에 Groovy 가 들어와 있는것을 볼 수 있다.



이제부터는 groovy를 시작할 수 있게 되었습니다.





오류 메시지
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed




오류메세지를 보면 코드 생성자의 잘못은 별로 없어 보이고  groovy 설정에 뭐가 문제가 아닌가 싶을것이다.
하지만 이 문제는 조금 다르게 접근해야 한다.

1. groovy 버전을 몇으로 맞춰서 작업하는가?
  > 이 글을 쓰는 시점의 groovy 는 1.6과 1.7의 병행기에 해당한다.
    eclipse에서 쉽게 버전을 변경할 수 있으니 버전을 변경해 가면서 다시 확인 해야한다. 

2. groovy를 실행했을때 class 파일이 만들어 졌는가?
  > eclipse에서 개발한다면 Defauilt output folder 라는 항목에 classes (기본은 bin)위치를 잡아주었다면 
     해당 위치에서 생성된 class 를 만날 수 있다. 위에 메세지는 해당 class 를 못찾을때 나온다.
     반드시 class 생성을 먼저 확인해야 한다. 


오류에 눈이 멀어 오류 자체만 해결하려고 들지 말았으면 좋겠다. 
결구 문제의 원인은 다른곳에서 있을 수 있으니 말이다.







  

groovy / 설치

JAVA/groovy 2010. 8. 3. 12:17
groovy가  ruby 처럼 간략하고  script 형태로 구동되기 때문에 eclipse에서 개발을 하고
필요에 따라 실행을 위한 groovy 설치가 요구된다.
이때문에  groovy를 설치하는 과정을 간단하게 소개한다.
(추가로 실행을 위한 과정은 따로 소개하겠습니다. )

추가 : 하지만 이클립스를 기반으로  groovy를 개발만 한다면 본 과정은 생략해도 됩니다.


> 다운로드 :  groovy-jsr-05

> set GROOVY_HOME



> add GROOVY_HOME/bin











 public final static String encodeSun(byte[] str) {
        String b64enc="";
        sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
        b64enc  = encoder.encode(str);
        return b64enc;
 }

 

 public final static byte[] decodeSun(String str) {
  byte[] b64dec = null;
  try {
   sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
   b64dec = decoder.decodeBuffer(str);
  } catch (IOException ex) { }
        return b64dec;
 }


inputStream 을 String으로 만들때

StringBuffer sb = new StringBuffer();
     byte[] b = new byte[4096];
     for (int n; (n = inputStream.read(b)) != -1;) {
         sb.append(new String(b, 0, n));
     }
  sb.toString();



String 을 inputStream 으로 만들때

InputStream input = new ByteArrayInputStream(contents.getBytes("UTF-8"));


 


 


xml을 스트리밍 타입으로 읽어야 되는 필요성은 xml파일의 크기가 큰 경우에 해당하는것으로
이경우 xml 구조를 원하는데로 한꺼번에 가져오면 outOfMemory가 발생해서
VM이 죽어버리게 된다.
해법은 XML을 순차적으로 읽는것인데 JAVA에서는 특별한 API를 이용하지 않고서도
JDK6.0이상에서 지원되는 기본 API만으로도 쉽게 해결 할 수 있다. 

   : 찾아보면 아래와 같은 방법을 SAX와 DOM의 장점을 섞어 놓은 방법이라고 한다. test해본 결과
     의도한데로의 결과가 잘 출력이 되어서 다행이였다.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.XMLEvent;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class Read2StreamingTypeXML {
   
    private XMLInputFactory inputFactory = null;   
    private XMLStreamReader xmlReader = null;
   
    public Read2StreamingTypeXML() {
        inputFactory = XMLInputFactory.newInstance();
    }
   
    public void read() throws Exception{
          
        xmlReader = inputFactory.createXMLStreamReader(
            new FileReader("neouserCreate.xml"));
       
        while (xmlReader.hasNext()){
           
            Integer eventType = xmlReader.next();
            if (eventType.equals(XMLEvent.START_ELEMENT)){
                System.out.print(" " + xmlReader.getName() + " ");
            }else if (eventType.equals(XMLEvent.CHARACTERS)){
                System.out.print(" " + xmlReader.getText() + " ");
            }else if (eventType.equals(XMLEvent.ATTRIBUTE)){
                System.out.print(" " + xmlReader.getName() + " ");
            }else if (eventType.equals(XMLEvent.END_ELEMENT)){
                System.out.print(" " + xmlReader.getName() + " ");
            }
        }       
        xmlReader.close();
    }
       
    public static void main(String args[]){
        try{
            Read2StreamingTypeXML obj = new Read2StreamingTypeXML();
            obj.read();           
        }catch(Exception exception){
            exception.printStackTrace();
        }
    }
}



추가적으로 stream 방법으로xml을 읽는경우에는 start와 end를 적절히 사용해서
stringBuffer에 적재하고 분석하는 로직이 추가로 개발 되어야 한다. 위에 코드는  단순히 streaming 형태로 xml을 읽을 수 있다는 sample만을 제시하고 있다.



1 2 3 4 ··· 6 

글 보관함

카운터

Total : / Today : / Yesterday :
get rsstistory!