이클립스 - log4j.xml 파일의 Validation 문제

Developer Tools|2012. 5. 27. 15:09

이클립스에서 log4j.xml 파일의 Validation 문제가 발생할 때는 다음과 같이 XML Catalog를 등록한다.



위 그림은 DTD 선언이 아래와 같을 경우의 예이다.

<!DOCTYPE log4j:configuration PUBLIC “-//APACHE//DTD LOG4J 1.2//EN” “log4j.dtd”>


Location에는 아래와 같은 형식으로 log4j.jar 파일에 포함된 DTD 파일의 경로를 넣어줘야한다.

jar:file:/D:/dev/IDE/sts-2.5.0.RELEASE/plugins/org.apache.log4j_1.2.15.v201005080500.jar!/org/apache/log4j/xml/log4j.dtd

댓글()

logback.xml - No grammar constraints (DTD or XML Schema) referenced in the document

Java|2012. 5. 10. 14:46

Logback은 DTD나 Schema를 제공하지 않는다.

문제는 이클립스에서 이에 대한 Warning을 한다는 것이다. 없는데 어쩌라고...

 

이럴 때는 아래와 같이 <!DOCTYPE xml>을 추가해 주면 경고가 사라진다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>


혹은, 이클립스의 Window - Preference > XML - XML Files - Validation 메뉴에서 'No grammar specified' 항목의 값을 'Ignore'로 바꾸고 Validation을 실행해 보면 경고가 사라진다. 

댓글()

로컬 maven 저장소에 oracle jdbc 드라이버 인스톨

Developer Tools|2010. 8. 8. 23:34

아래의 명령으로 local maven repository에 오라클 jdbc 드라이버를 설치할 수있다.

C:>mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.4 -Dpackaging=jar -Dfile=다운받은 ojdbc14.jar 파일의 절대경로

실행 예 : C드라이브 루트에 10.2.0.4 버젼의 ojdbc14.jar 파일이 있을 때의 예이다.

C:>mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.4 -Dpackaging=jar -Dfile=C:\ojdbc14.jar

[INFO] Scanning for projects...

[INFO] Searching repository for plugin with prefix: 'install'.

[INFO] org.apache.maven.plugins: checking for updates from central

[INFO] org.codehaus.mojo: checking for updates from central

Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-install-plugin/2.2/maven-install-plugin-2.2.pom


Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-plugins/8/maven-plugins-8.pom


Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-install-plugin/2.2/maven-install-plugin-2.2.jar


[INFO] ------------------------------------------------------------------------

[INFO] Building Maven Default Project

[INFO]    task-segment: [install:install-file] (aggregator-style)

[INFO] ------------------------------------------------------------------------

Downloading: http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-digest/1.0/plexus-digest-1.0.pom


Downloading: http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-components/1.1.7/plexus-components-1.1.7.pom


Downloading: http://repo1.maven.org/maven2/org/codehaus/plexus/plexus/1.0.8/plexus-1.0.8.pom


Downloading: http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-digest/1.0/plexus-digest-1.0.jar


[INFO] [install:install-file {execution: default-cli}]

[INFO] Installing C:\ojdbc14.jar to C:\Documents and Settings\Admini

strator\.m2\repository\com\oracle\ojdbc14\10.2.0.4\ojdbc14-10.2.0.4.jar

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESSFUL

[INFO] ------------------------------------------------------------------------

[INFO] Total time: 7 seconds

[INFO] Finished at: Sun Aug 08 18:23:41 KST 2010

[INFO] Final Memory: 3M/6M

[INFO] ------------------------------------------------------------------------

C:>



댓글()

Google App Engine 1.3.1 실행 시의 오류 - javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.SAXParserFactoryImpl not found

기타|2010. 2. 28. 23:38

이클립스에 구글 앱 엔진 플러그인을 설치한 후 어플리케이션을 하나 만들고, 결과를 확인하려고 '프로젝트명 우클릭 > Run As > Web Application'을 실행했다.

간단한 테스트 앱이라 잘 될거라 생각했는데, 왠걸 이클립스 콘솔에 오류 로그가 주르륵 출력된다.

2010. 2. 28 오후 3:10:52 com.google.apphosting.utils.jetty.JettyLogger warn

경고: failed com.google.apphosting.utils.jetty.DevAppEngineWebAppContext@ca0115{/,D:\dev\WORKSPACE_APPENGINE\JavaShop\war}

javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.SAXParserFactoryImpl not found

    at javax.xml.parsers.SAXParserFactory.newInstance(SAXParserFactory.java:134)

    at org.mortbay.xml.XmlParser.setValidating(XmlParser.java:92)

    at org.mortbay.xml.XmlParser.<init>(XmlParser.java:84)

    at org.mortbay.jetty.webapp.TagLibConfiguration.configureWebApp(TagLibConfiguration.java:202)

    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1215)

    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:500)

    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448)

    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)

    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:117)

    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)

    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:117)

    at org.mortbay.jetty.Server.doStart(Server.java:217)

    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)

    at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:188)

    at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:147)

    at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:219)

    at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:162)

    at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48)

    at com.google.appengine.tools.development.DevAppServerMain.<init>(DevAppServerMain.java:113)

    at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:89)


The server is running at http://localhost:8888/

어쨌든 서버는 시작됐다니까 주소줄에 'http://localhost:8888/'을 넣고 이동해 봤다. 역시 제대로 안뜬다.

구글링 해보니까 'war/WEB-INF/lib' 디렉토리에 xercesImpl.jar 파일을 넣으면 해결된단다. 구글 앱은 XML Parser 관련한 이런 저런 문제가 좀 있는 것 같다.

서버를 죽이려고 구글 앱을 위한 Server View가 있나 찾아 봤는데, 그런건 없다. 콘솔 우측의 Terminate 버튼을 눌러서 서버를 중지한 후 xercesImpl.jar를 복사해 넣어 주고 재시작.

잘 된다.

댓글()

Spring MVC의 CommonsMultipartResolver를 사용하여 업로드한 임시파일은 지워질까?

Java|2010. 2. 23. 23:30

Spring MVC는 Commons FileUpload 패키지를 이용한 파일 업로드를 지원한다.


아무 생각 없이 사용하고 있다가 문득 FileUpload를 Spring 없이 사용할 때는 FileCleanerCleanup 리스너를 web.xml에 등록해서 temporary 파일을 자동으로 삭제하게 한다는게 기억났다.


아차! 지금이라도 등록해 줘야하는건가? 하는 생각에 확인차 서버의 temporary 경로를 살펴봤다.

그런데 이상하게도 파일 업로드 후에 남아 있었어야할 임시 파일이 하나도 없었다.


CommonsMultipartResolver가 뭔가 알아서 지우는건가 해서 뒤져봐도 관련 코드는 없었다.

이해가 안가서 좀 더 뒤지다가 결국 DispatcherServlet에서 삭제 코드를 찾았다. doDispatch 메서드의 finally 절에 cleanupMultipart 메서드를 호출하는 부분이 있었던 것이다.

public class DispatcherServlet extends FrameworkServlet {


    protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {

        ......

        try {

            ......

        finally {

            // Clean up any resources used by a multipart request.

            if (processedRequest != request) {

                cleanupMultipart(processedRequest);

            }


            // Reset thread-bound context.

            RequestContextHolder.setRequestAttributes(previousRequestAttributes, this.threadContextInheritable);

            LocaleContextHolder.setLocaleContext(previousLocaleContext, this.threadContextInheritable);


            // Clear request attributes.

            requestAttributes.requestCompleted();

            if (logger.isTraceEnabled()) {

                logger.trace("Cleared thread-bound request context: " + request);

            }

        }

    }


    /**

     * Clean up any resources used by the given multipart request (if any).

     * @param request current HTTP request

     * @see MultipartResolver#cleanupMultipart

     */

    protected void cleanupMultipart(HttpServletRequest request) {

        if (request instanceof MultipartHttpServletRequest) {

            this.multipartResolver.cleanupMultipart((MultipartHttpServletRequest) request);

        }

    }

    ......

}




댓글()

cygwin에서 classpath와 함께 java 콘솔 프로그램 실행하기

Developer Tools|2010. 2. 20. 23:26

책(Groovy Recipes)을 보다가 간단한 groovy 프로그램을 groovyc로 컴파일한 후 실행하려고 했더니 잘 안된다.

$ java -classpath .:$GROOVY_HOME/embeddable/groovy-all-1.7.0.jar Greet

Exception in thread "main" java.lang.NoClassDefFoundError: Greet

Caused by: java.lang.ClassNotFoundException: Greet

        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

        at java.security.AccessController.doPrivileged(Native Method)

        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)

        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)

        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)

        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

보아하니 java 클래스로 컴파일된 groovy 파일을 실행하려면 필요한 groovy-all-1.7.0.jar 파일이 classpath로 안잡히는 거다.

cygwin에서 실행되는 java.exe는 윈도우용이라서 cygwin의 path 방식(유닉스 형식)을 이해할 수가 없다. 따라서 윈도우 방식의 path로 바꿔줘야한다.

$ java -classpath `cygpath -wp .:$GROOVY_HOME/embeddable/groovy-all-1.7.0.jar` Greet

Groovy Rocks!

댓글()

이클립스에서 log4j 설정과 함께 자바 어플리케이션 실행

Developer Tools|2010. 2. 16. 23:13

Run Configutaions의 VM arguments에 다음과 같이 log4j.properties 혹은 log4j.xml 파일의 경로를 지정해 준다.

-Dlog4j.configuration=file:/C:/WORKSPACE_STS/SNOW/log4j.properties



댓글()

MySQL 5.0.45 원하는 위치에 수동 설치 및 윈도 서비스로 등록 하기

DevOps|2008. 2. 20. 10:10

테스트 환경으로 사용할 일이 생겨서 MySQL을 집에 설치 했었습니다. 인스톨러 없이 D:\TOOLS 디렉토리에 UTF-8 환경으로 설치한 후 윈도 서비스로 등록까지 마쳤는데... 오늘 설치본을 그대로 복사해서 회사에서 사용하는 컴퓨터에 설치하려고 하니 어떻게 했는지 기억이 전혀 안나더군요. :-( 이러한 이유로 여기에 설치법을 남깁니다.


MySQL 설치

저는 MySQL AB다운로드 페이지에 있는 윈도 버전 중 수동설치 버전(Without installer 혹은 ZIP Archive라고 써 있는 놈)을 다운로드 받았습니다. MySQL Account 만들거냐고 물어보면 아래에 있는 "No Thanks..." 링크를 눌러서 등록 안하고 받으셔도 됩니다.


무설치 버전인 만큼 설치는 매우 간단합니다. 원하는 디렉토리에 압축을 풀어주기만 하면 되죠!
저는 D:\TOOLS\mysql-5.0.45-win32 디렉토리에 압축을 풀었습니다.

다른 작업 없이 명령 프롬프트를 하나 실행한 다음 D:\TOOLS\mysql-5.0.45-win32\bin 디렉토리로 이동한 후에 "mysqld --console" 명령만 실행하셔도 MySQL 서버를 바로 사용하실 수 있습니다.

D:\TOOLS\mysql-5.0.45-win32\bin>mysqld --console
080220 10:47:57  InnoDB: Started; log sequence number 0 19944194
080220 10:47:58 [Note] mysqld: ready for connections.
Version: '5.0.45-community-nt'  socket: ''  port: 3306  MySQL Community Edition (GPL)

위와 비슷한 메시지를 보여 주며 오류 없이 MySQL 서버가 시작된 후, 다음과 같이 "mysqlshow -u root" 명령을 실행하시면 Database 목록을 볼 수 있습니다.

D:\TOOLS\mysql-5.0.45-win32\bin>mysqlshow -u root
+--------------------+
|     Databases      |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+


위의 과정만으로도 MySQL은 사용할 수 있는 상태가 되었습니다만, 좀 더 세밀한 설정을 하기 위해서는 옵션 파일을 만들어 줘야 합니다. 옵션 파일의 예제가 설치 디렉토리에 있기 때문에 약간의 수정을 해주면 바로 사용할 수 있습니다. 설치 디렉토리(D:\TOOLS\mysql-5.0.45-win32)를 보면 5개의 ini 확장자를 가진 파일이 있습니다. 용도에 따라 선택 하시면 됩니다. 저는 간단한 테스트가 목적이기 때문에 my-small.ini 파일을 선택했습니다.
MySQL은 "[설치 디렉토리]\my.ini" 파일 혹은, "C:\Windows\my.ini" 파일이나 "C:\my.cnf" 파일을 옵션 파일로 찾습니다. 저는 my-small.ini 파일의 복사본을 하나 만들어서 my.ini로 이름을 변경한 후, "C:\Windows" 디렉토리로 복사해서 옵션 파일 설정을 마쳤습니다.

MySQL은 Windows directory에서 my.ini 파일을 찾습니다. Windows directory 경로는 윈도 종류에 따라서 다르기 때문에 정확한 경로를 확인하려면, 명령 프롬프트에서 다음의 명령을 실행해 보시면 됩니다.

C:\> echo %WINDIR%


윈도 서비스로 등록하기

이 글에서 옵션파일을 만들어서 사용하는 목적은 윈도 서비스로 MySQL을 등록하기 위해서입니다. 이를 위한 최소한의 수정을 한 후 MySQL을 윈도 서비스로 등록해 보겠습니다.

윈도 서비스로 등록하기 위해서는 my.ini 파일에 설치 경로를 명시해야합니다.
위에서 만든 "C:\Windows\my.ini" 파일을 열어서 "[mysqld]" 섹션을 찾은 후 다음의 2줄을 넣어 줍니다(경로 구분자로 '\'가 아닌 '/'를 사용합니다. 주의하세요!).

basedir = D:/TOOLS/mysql-5.0.45-win32
datadir  = D:/TOOLS/mysql-5.0.45-win32/data


쉽게 짐작할 수 있겠지만, 위의 내용은 설치경로와 MySQL이 사용하는 데이터의 저장 경로입니다.
이제 my.ini 파일은 아래와 비슷한 내용으로 변경되었을겁니다.

# The MySQL server
[mysqld]
basedir = D:/TOOLS/mysql-5.0.45-win32
datadir  = D:/TOOLS/mysql-5.0.45-win32/data

port  = 3306
socket  = /tmp/mysql.sock
skip-locking
key_buffer = 16K
max_allowed_packet = 1M
table_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 64K


이제 윈도 서비스로 등록을 해보죠. MySQL이 실행 중이라면, 아래의 명령을 실행하여 MySQL을 죽입니다.
D:\TOOLS\mysql-5.0.45-win32\bin>mysqladmin -u root shutdown

MySQL이 완전히 종료된 것을 확인한 후, 아래의 명령으로 MySQL을 윈도 서비스로 등록할 수 있습니다.
D:\TOOLS\mysql-5.0.45-win32\bin>mysqld --install

만약 MySQL 서비스의 시작유형을 자동이 아닌 수동으로 하고 싶다면, 아래의 명령으로 등록합니다.
D:\TOOLS\mysql-5.0.45-win32\bin>mysqld --install-manual

설치된 MySQL 서비스를 삭제하고 싶으면, 아래의 명령으로 삭제할 수 있습니다.
D:\TOOLS\mysql-5.0.45-win32\bin>mysqld --remove

윈도 서비스 등록에 대한 더 많은 정보를 원하시면 이곳의 문서를 참고하세요~!
charset euckr
set character set euckr;
show variables like 'c%';


'DevOps' 카테고리의 다른 글

Install knife-solo(knife-solo 설치)  (0) 2014.10.21
Install Chef on CentOS(Chef 설치)  (0) 2014.10.20
SonarQube Runner를 사용하여 프로젝트 분석하기  (0) 2014.08.17
SonarQube 설치 및 설정  (2) 2014.08.05
HSQLDB 시작하기  (2) 2007.11.30

댓글()

Commons FileUpload 1.2 버젼의 boundary 오류

Java|2008. 1. 4. 10:45
Commons FileUpload 1.2 버젼을 사용하여 ActiveX 업로드 컨트롤을 테스트 하던 중, "org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found"라는 에러 메시지를 보게 되었습니다. Commons FileUpload 사이트의 가이드를 따라 하던 중이라 별로 잘못한 건 없어보였는데 말이죠.

NetBeans에 포함된 HTTP Monitor의 도움을 받아(FiddlerHttpWatch는 ActiveX에서 발생하는 HTTP 통신을 볼 수 없더군요) HTTP Header 정보를 살펴보니 content-type은 아래와 같은 형식이었습니다.

multipart/form-data, boundary=ZYDa6MZ62846kJOUYu9kybvA750KGm3r

문제는 글자를 하나하나 아무리 뜯어봐도 boundary를 못찾을 이유가 없어 보인다는 겁니다.
결국 Commons FileUpload의 boundary 관련 소스를 다 뒤져보기에 이르렀는데... 이놈은 boundary 구분자로 세미콜론(;)을 사용하더군요. 제가 사용하는 업로드 컨트롤은 구분자로 쉼표(,)를 사용하고 있으니까 당연히 boundary를 못찾죠.
이걸 어떻게 해야하나... "직접 소스를 고칠까?" "이슈 등록을?" 등등의 고민을 하다가 구글링을 해봤더니 아파치재단의 버그 트래커에 이미 오류로 등록된 문제였습니다.

결론은 Commons FileUpload가 rfc1867을 지키지 않고 있다는 것입니다. 하지만 rfc1521은 세미콜론을 구분자로 제시하고 있고 대부분의 브라우져가 세미콜론을 구분자로 사용하기 때문에, 쉼표와 세미콜론을 모두 지원하는 방향으로 결정이 난 것 같습니다.

아래의 링크에서 관련 정보와 패치를 받으실 수 있습니다. 제가 패치한 jar 파일을 올리려다가 소스 등까지 다 같이 올려야하는게 귀찮아서 링크만 올립니다.

[fileupload] separator of boundary doesnt match rfc1867 examples

댓글()

Groovy 1.5가 릴리즈 되었습니다

기타|2007. 12. 12. 10:04
여행을 다녀온 후 조금 멍한 기분으로 infoq.com에 갔더니, 지난 주말에 Groovy 1.5가 릴리즈 되었다는 소식이 있더군요. 자바5에 대한 지원이 강화된 점이 눈에 띕니다.

http://www.infoq.com/articles/groovy-1.5-new

댓글()

HSQLDB 시작하기

DevOps|2007. 11. 30. 11:36

자바개발환경만 있으면 간단하게 사용할 수 있는 Database Engine인 HSQLDB를 설치해 보겠습니다.


HSQLDB 설치

먼저 소스포지의 다운로드 페이지에서 HSQLDB를 다운로드 받습니다. 현재(2007-11-30) 최신버젼은 1.8.0.9 버젼이군요.
사실 HSQLDB는 설치라고 할만한 과정이 없습니다. 그냥 압축파일의 lib 폴더 안에 있는 hsqldb.jar 파일만 있으면 HSQLDB를 사용할 수 있습니다. 원하는 곳에 복사하고 원하는 방식으로 실행을 하면 됩니다.
저는 하이버네이트 테스트를 위해서 설치한 터라 "D:\WORKSPACE_JEE\HibernatePractice\lib" 폴더에 넣었습니다.

사용자 삽입 이미지


HSQLDB 실행

HSQLDB는 Server Mode라고 부르는 3가지의 실행방법을 가지고 있습니다. 이 Server Mode 중 가장 일반적인 방식인 Hsqldb Server로 실행하는 방법에 대해서 알아보겠습니다. 다른 방식에 대해서는 나중에 또 기회가 있을거라고 생각합니다. :-)

명령 프롬프트 창을 하나 띄우고 다음과 같이 입력합니다.

D:\WORKSPACE_JEE\HibernatePractice>java -classpath lib/hsqldb.jar org.hsqldb.Server -database.0 file:data/test -dbname.0 javaworld


"-database.0 file:data/test" 옵션은 Database가 사용할 경로와 파일명을 명시하고 있습니다. 예에서는 상대경로로 현재 폴더 아래의 data 폴더에 "test.*" 형식으로 관련 파일을 생성하라고 얘기하고 있습니다. 물론 절대경로로 지정해도 됩니다.

D:\WORKSPACE_JEE\HibernatePractice>java -classpath lib/hsqldb.jar org.hsqldb.Server -database.0 file:D:\WORKSPACE_JEE\HibernatePractice\data\test -dbname.0 javaworld

[Server@1270b73]: [Thread[main,5,main]]: checkRunning(false) entered
[Server@1270b73]: [Thread[main,5,main]]: checkRunning(false) exited
[Server@1270b73]: Startup sequence initiated from main() method
[Server@1270b73]: Loaded properties from [D:\WORKSPACE_JEE\HibernatePractice\server.properties]
[Server@1270b73]: Initiating startup sequence...
[Server@1270b73]: Server socket opened successfully in 40 ms.
[Server@1270b73]: Database [index=0, id=0, db=file:data/test, alias=javaworld] opened sucessfully in 1351 ms.
[Server@1270b73]: Startup sequence completed in 1411 ms.
[Server@1270b73]: 2007-12-05 10:50:20.203 HSQLDB server 1.8.0 is online
[Server@1270b73]: To close normally, connect and execute SHUTDOWN SQL
[Server@1270b73]: From command line, use [Ctrl]+[C] to abort abruptly

"-dbname.0 javaworld" 옵션은 Databse의 alias(별칭)을 지정하고 있습니다. 위의 경우는 'javaworld'라는 이름으로 Database의 이름을 지정하고 있는거죠. 이 alias는 어플리케이션에서 jdbc를 통해 hsqldb에 접근할 때 사용하게 됩니다. 위의 경우 jdbc connection URL은 "jdbc:hsqldb:hsql://localhost/javaworld"입니다.

각 옵션명의 뒤쪽에 붙어있는 ".0" 이라는 문자는 database의 인덱스를 의미합니다. hsqldb는 0~9까지의 인덱스 값을 허용하므로, 총 10개의 Database를 동시에 띄울 수 있습니다.
즉 옵션 "-database.0 file:data/test -dbname.0 javaworld"은 인덱스 값 0에 할당된 Database가 현재 폴더 아래의 'data' 폴더에 'test.*' 형식의 관련 파일들을 사용하며, alias(dbname)은 javaworld라는 것을 의미합니다. 위의 실행 예에 녹색으로 표시된 부분을 보면 이해에 조금 더 도움이 될겁니다.

Database Manager

Database Manager는 HSQLDB Database에 질의를 하거나 테이블 등의 Database 객체를 볼 수 있게 해주는 GUI 툴입니다.
Database Manager는 hsqldb.jar 파일에 포함 되어 있기 때문에 아래와 같이 명령 프롬프트에서 입력하면 바로 사용이 가능합니다.

D:\WORKSPACE_JEE\HibernatePractice>java -classpath lib/hsqldb.jar org.hsqldb.util.DatabaseManager


사용자 삽입 이미지javaworld Database 접속


javaworld database가 이미 실행 중이라면 위와 같이 Driver, URL 등을 입력하고 OK 버튼을 누르면 바로 javaworld database를 관리할 수 있습니다.

사용자 삽입 이미지


DDL이나 DML을 입력한 후 Execute 버튼을 누르면(단축키 : Ctrl-Enter) 입력한 SQL문이 실행됩니다.
위와 같이 DDL 문을 실행했을 경우에는 좌측의 트리가 자동으로 갱신되지 않는데, 이럴 때는 View-Refresh Tree 메뉴를 한 번 클릭해 주면 갱신된 트리를 볼 수 있습니다.

사용법이 매우 직관적이고 간단하기 때문에 메뉴 등을 직접 살펴보면 더이상의 설명은 필요 없을 듯합니다. :-)

댓글()

Groovy 처음 시작하기 : Scriptom 설치

기타|2007. 11. 1. 23:40

Groovy에서 COM이나 ActiveX를 사용할 수 있게 해주는 모듈인 Scriptom을 설치해 보겠습니다.

Scriptom의 설치는 매우 간단합니다. Groovy를 설치한 후 몇 개의 관련 파일을 설치 폴더에 복사해 주기만 하면 됩니다.

Scriptom 설치를 위한 선행조건

  • Java 1.5 이상이 설치 되어 있어야 합니다(Scriptom 2.0은 Jacob 1.4를 사용하기 때문입니다)
  • Groovy 1.1이 설치 되어 있어야 합니다
  • GROOVY_HOME 환경 변수가 설정되어 있어야합니다(Groovy 설치 폴더를 가리키도록)

Scriptom 설치

먼저 Scriptom 페이지에서 가장 최신인 Scriptom 2.0 alpha Scriptom 2.0 (Beta) 버젼을 다운로드 다운로드 받습니다. 보통은 알파 버젼을 추천하지는 않겠지만, Scriptom은 2.0 버젼 부터는 하위 호환성을 보장하지 않기 때문에 2.0 버젼부터 시작하는 것을 추천합니다.

다시 말씀드리지만 설치는 간단합니다. 다운로드 받은 scriptom-2.0-alpha.zip 파일을 원하는 경로에 압축을 풀어주고 새로 생긴 폴더에 있는 jacob.dll, scriptom-2.0-alpha.jar 두 개의 파일을 복사해 주기만 하면 됩니다.
만약 jacob이 의존하고 있는 라이브러리가 PC에 설치가 안된 상태라서 '응용 프로그램 구성이 올바르지 않기 때문에...' 메시지를 보게된다면 Microsoft Visual C++ 2005 SP1 Redistributable Package (x86)를 설치해야할 수도 있습니다

저는 D:\Repository\Groovy\zip\scriptom-2.0-alpha 폴더에 압축을 풀었습니다.

사용자 삽입 이미지

D:\Repository\Groovy\zip\scriptom-2.0-alpha 폴더에 압축을 풀었습니다


이제 압축을 풀어 둔 폴더에 있는 scriptom-2.0-alpha.jar 파일을
%GROOVY_HOME%\lib 폴더로 복사합니다(scriptom-2.0-alpha.jar 파일은 이전 버젼과는 다르게 scriptom이 의존하고 있는 jacob 라이브러리까지 포함하여 패키징되었습니다).
제 시스템환경변수에는 %GROOVY_HOME%이 'D:\SDK\groovy-1.1-rc-1' 폴더로 지정 되어 있어서 'D:\SDK\groovy-1.1-rc-1\lib' 폴더로 복사했습니다(환경변수 설정에 대해서는 이전 글을 참고하세요).

사용자 삽입 이미지

scriptom-2.0-alpha.jar 파일 복사


다음으로 jacob.dll 파일을 %GROOVY_HOME%\bin 폴더로 복사합니다. java.library.path에 포함되는 다른 곳(예를 들면 'C:\WINDOWS\system32')에 복사해도 됩니다.

사용자 삽입 이미지

jacob.dll 파일 복사


이제 Scriptom 설치는 완료 되었습니다. 간단하죠? :)

Caught: java.lang.UnsatisfiedLinkError: D:\SDK\groovy-1.1-rc-1\bin\jacob.dll: 응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다.
위와 같은 오류 메시지를 보게 되면 Microsoft Visual C++ 2005 SP1 Redistributable Package (x86)를 설치합니다.


설치가 완료 됐으니까 정말 잘 된건지 확인해 보도록 하겠습니다.
먼저 명령 프롬프트를 하나 띄운 후, 압축을 풀어 둔 폴더 하위의 examples\ie 폴더로 이동합니다. 저는 'D:\Repository\Groovy\zip\scriptom-2.0-alpha\examples\ie'로 이동했습니다.
groovy IE.groovy 명령을 실행한 후, 익스플로러 창이 열리면서 http://glaforge.free.fr/weblog 사이트로 이동하면 제대로 설치에 성공하신 겁니다.

사용자 삽입 이미지

+

아침에 출근해 보니 몇시간 사이에 alpha 버젼이 없어지고 Beta 버젼으로 변경되었더군요. 급하게 링크만 수정했습니다

댓글()

Practical JRuby on Rails Web 2.0 Projects 출간

기타|2007. 10. 30. 11:41
Apress에서 JRuby 책이 출간되었습니다.
제목은 Practical JRuby on Rails Web 2.0 Projects입니다. 책의 소개 페이지로 가서 좌측의 Book Extras 메뉴를 보면 목차, 소스코드, 1장 샘플 챕터가 있습니다. 그리고 TheServerSide.COM의 Practical JRuby on Rails Book Excerpt 페이지에 가시면 3장, 4장을 다운 받을 수 있습니다. :)

댓글()

시스템 환경변수 설정

설치&설정|2007. 10. 28. 19:32

이제 압축을 푼 후 새로 생성된 'D:\SDK\groovy-1.1-rc-1' 디렉토리를 Groovy의 홈디렉토리로 설정합니다. 저는 관리자 권한으로 명령 프롬프트를 실행한 후, 설정했습니다.

C:\>reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v GROOVY_HOME /d D:\SDK\groovy-1.1-rc-1
C:\Documents and Settings\MyHome>echo %GROOVY_HOME%
%GROOVY_HOME%
C:\Documents and Settings\MyHome>set GROOVY_HOME=D:\SDK\groovy-1.1-rc-1
C:\Documents and Settings\MyHome>echo %GROOVY_HOME%
D:\SDK\groovy-1.1-rc-1

첫째 줄은 시스템 환경 변수에 GROOVY_HOME을 추가하는 명령입니다. 마지막 옵션으로 쓰인 디렉토리 경로를 본인의 환경에 알맞게 고쳐서 실행하시면됩니다. 세번째 줄에서 set 명령으로 GROOVY_HOME을 다시 설정한 이유는 현재 이 명령을 수행하고 있는 유저에게는 GROOVY_HOME 환경변수가 적용이 안된 상태라서 임시로 변수를 설정한 것입니다(다시 로그인하면 set 명령 없이 환경변수가 설정됩니다).


댓글()

Groovy 처음 시작하기 : 설치

기타|2007. 10. 26. 18:02
Scriptom 2.0 alpha에 관한 글을 작성하고 보니 너무 뜬금 없는 얘기가 된 것 같아서, 자바개발자를 위한 Groovy 설치법을 간단히 설명해 보려고 합니다. 그리고 아마도 다음 글에서는 Scriptom 설치에 관해서 쓸 것 같습니다.

Groovy 설치를 위한 선행조건
  • Java SDK 1.4 버젼 이상이 설치되어 있어야합니다
  • JAVA_HOME 환경 변수가 설정되어 있어야합니다(Java SDK의 설치 디렉토리를 가리키도록)
Groovy 설치

당연한 얘기지만 Groovy 홈페이지에서 배포본을 다운 받아야 합니다. 지금(2007.10.28) 받을 수 있는 가장 최신의 버젼이 Groovy 1.1-rc-1이라서 저는 이 배포본으로 예를 들도록 하겠습니다.
다운로드 받은 압축파일을 설치를 원하는 위치에 압축을 풀어줍니다. 저는 'D:\SDK' 디렉토리에 풀었습니다.

압축파일을 풀어준다

D:\SDK 디렉토리에 압축파일을 풀었다


이제 압축을 푼 후 새로 생성된 'D:\SDK\groovy-1.1-rc-1' 디렉토리를 Groovy의 홈디렉토리로 설정합니다. "내 컴퓨터" 아이콘을 우클릭한 후 "속성" 선택 - "고급" 탭 선택 - "환경 변수" 버튼을 클릭한 후 가장 아래에 있는 "새로 만들기" 버튼을 클릭합니다. 새 시스템 변수 창이 뜨면 변수 이름에 GROOVY_HOME을, 변수 값에 Groovy 배포본의 압축을 푼 후 생긴 디렉토리의 전체 경로를 입력합니다. 저는 'D:\SDK\groovy-1.1-rc-1'을 입력했습니다.

사용자 삽입 이미지

GROOVY_HOME 시스템 환경변수 설정


마지막으로 %GROOVY_HOME%\bin 디렉토리를 Path 시스템 환경변수에 추가해줍니다. 이미 존재하는 Path 변수를 선택하고 "편집" 버튼을 누른 후, 이미 입력되어 있는 변수 값의 끝에 세미콜론(;)을 추가한 후 다시 %GROOVY_HOME%\bin을 입력한 후 확인 버튼을 누릅니다. 중간에 추가하던 마지막에 추가하던 이미 입력된 다른 경로명과 세미콜론으로 경계를 지어 주어야한다는 점만 주의하면 됩니다.

사용자 삽입 이미지

Path에 %GROOVY_HOME%\bin을 추가


이제 명령 프롬프트 창을 하나 실행한 후, groovy -version 명령을 실행 해 봅니다.
"Groovy Version: 1.1-rc-1"이 출력되면 Groovy를 제대로 설치한 겁니다.

사용자 삽입 이미지

정상 설치 여부 확인





댓글()

Scriptom 2.0 alpha

기타|2007. 10. 25. 17:42
Groovy 홈페이지에 오래간만에 들어가 봤더니 Scriptom 2.0 alpha버젼이 나와있더군요.  Scriptom은 ActiveX나 COM 컴포넌트를 Groovy에서 접근할 수 있게 해주는 훌륭한 모듈입니다.
루비의 'win32ole'로 엑셀을 만지는 재미를 Groovy에서도 느낄 수 있을까해서 예전에 사용해 봤었는데 루비와 비교해볼 때 기능이 약했던 기억이 있습니다.
하지만 Scroptom 2.0은 1.2 버젼과 비교해서 많은 면에서 발전이 있다고 합니다. 아직 alpha 버젼이지만 코드는 안정화된 상태고 기능구현도 완료되었다고 해서 금새 다운 받아서 예제를 실행시켜 봤습니다.

Scriptom 페이지에 Quick Start 예제로 나와있는 그루비 코드는 examples/speech 폴더에 각각 'Speak.groovy', 'SpeechInterfaces.groovy'라는 파일로 있었습니다. Quick Strat 예제답게 잘 실행됩니다.
 그런데, 가장 완성도 높은 예제라고 소개된 examples/excel 폴더의 'ExcelReport.groovy'는 아래와 같이 오류가 발생합니다.

D:\Repository\Groovy\zip\scriptom-2.0-alpha\examples\excel>groovy ExcelReport.groovy
  CREATING A SPREADSHEET FROM A TEMPLATE:
  Opening Excel template, inserting data, and creating a chart.
  The output document is 'D:\Repository\Groovy\zip\scriptom-2.0-alpha\examples\excel\report.xls'.
Caught: com.jacob.com.ComFailException: A COM exception has been encountered:
At Invoke of: Item
Description: 매개 변수의 개수가 잘못되었습니다.
        at ExcelReport$_run_closure2.doCall(ExcelReport.groovy:30)
        at ExcelHelper$_create_closure1.doCall(ExcelHelper.groovy:101)
        at ExcelHelper$_create_closure1.doCall(ExcelHelper.groovy)
        at ExcelHelper.create(ExcelHelper.groovy:69)
        at ExcelReport.run(ExcelReport.groovy:28)
        at ExcelReport.main(ExcelReport.groovy)

COM에서 발생한 예외라니! 나보고 어쩌라고...... 줄 30을 찾아보니 다음과 같았습니다.

def worksheet = workbook.Worksheets.Item[1]

한참을 멍하니 있다가, Excel Workbook의 Worksheets 컬렉션에서 Item을 호출하는건 Excel API를 바로 호출하는거니까 일반적인 컬렉션을 다루는 문법과는 다를 것이라는 생각에 대괄호를 소괄호로 바꿨습니다.

def worksheet = workbook.Worksheets.Item(1)
               .
               .
               .
def worksheet = workbook.Worksheets.Item('DATA') // 줄95

저장하고 다시 실행해 보니. 이번에는 줄 61에서 예외가 발생했습니다. 'Item'을 키워드로 파일 내용을 검색하다보니 눈에 띄었던 부분이었습니다.

worksheet.Cells.Item[row+1,1] = "$row/1/2007"

줄 61과 줄 65를 마찬가지 형식으로 변경했습니다.

worksheet.Cells.Item(row+1,1) = "$row/1/2007"
               .
               .
               .
worksheet.Cells.Item(row+1,col+1) = (row + col)

엉뚱한 에러가 납니다.

D:\Repository\Groovy\zip\scriptom-2.0-alpha\examples\excel>groovy ExcelReport.groovy
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed, ExcelReport.groovy: 61:
"worksheet.Cells.Item((row + 1), 1)" is a method call expression, but it should be a variable expression at line: 61 column: 35. File: ExcelReport.groovy @ line 61, column 35.
       worksheet.Cells.Item(row+1,1) = "$row/1/2007"
                                                                ^
1 error

Item Property를 호출하여 Range 객체를 꺼낸 것까지는 좋았는데 문자열 할당을 하려면 Value Property에 해야한다는걸 깜빡했나 봅니다.

worksheet.Cells.Item(row+1,1).Value = "$row/1/2007"
               .
               .
               .
worksheet.Cells.Item(row+1,col+1).Value = (row + col) // 줄65

이제야 잘되는군요. :)

D:\Repository\Groovy\zip\scriptom-2.0-alpha\examples\excel>groovy ExcelReport.groovy
  CREATING A SPREADSHEET FROM A TEMPLATE:
  Opening Excel template, inserting data, and creating a chart.
  The output document is 'D:\Repository\Groovy\zip\scriptom-2.0-alpha\examples\excel\report.xls'.
        EVENT Change (1,2) = 1/1/2007
        EVENT Change (2,2) = 2.0
        EVENT Change (3,2) = 3.0
        EVENT Change (4,2) = 4.0
        EVENT Change (5,2) = 5.0
        EVENT Change (6,2) = 6.0
        EVENT Change (1,3) = 2/1/2007
               .
               .
               .

가장 완성도 높은 예제라고 했는데 왜 오류가 있을까요? 단순히 추측해보면 Groovy에서 List나 Map을 다루는 방식으로 COM의 Property(indexed properties)를 다룰 수 있도록 한다는 Scriptom 2.0의 개선사항 반영이 제대로 안된게 아닌가하는 생각이 듭니다.

+

COM Methods and Properties in Scriptom 이 문서를 보니까 확실히 알파버젼이라서 생기는 문제군요. 그렇다면 베타 버젼쯤에서는 이 예제가 멀쩡히 잘 돌아가겠지요?

+

2007.11.02
베타 버젼이 나와서 테스트 해 봤습니다. 줄 30과 줄 95의 소스가 약간 변경('workbook.Worksheets'가 'workbook.Sheets'로) 되었지만 여전히 제 PC에서는 같은 오류가 발생합니다. 'workbook.Worksheets'를 'workbook.Sheets'로 변경하지 않고 괄호 등만 위의 방식으로 변경하면 잘 실행됩니다만...... 이거 설마 제 PC에서만 안되는건가요? Excel 2003 버젼 쓰고 있습니다만...... :(

댓글()

SlickRun

Developer Tools|2007. 10. 7. 02:02

SlickRunBayden Systems에서 무료로 제공하는 유용한 툴입니다.

쉽게 설명하자면 '윈도우키+R'를 누르면 나타나는 실행 창의 확장판이라고 할 수 있겠습니다. 저는 실행 창에서 notepad 쳐서 메모장을 실행시키거나 mspaint를 쳐서 그림판을 실행시키는 일이 자주있는데요. SlickRun을 설치하면 패스(path)에 등록되지 않은 어플리케이션도 'MagicWord'를 등록하면 쉽게 실행시킬 수 있습니다. 저는 이 툴을 사용한 후로 바탕화면의 바로가기 혹은 빠른 실행 아이콘을 사용하는 일이 많이 줄었습니다.

설치는 간단합니다. 무조건 Yes하면됩니다. 중간에 추가로 파일을 다운로드해서 설치할거냐고 물어보는데 그것도 Yes 해서 설치하면 됩니다.

사용방법도 간단합니다. 설치후 나타나는 남색 바(bar)를 클릭한 후 notepad, mspaint, cmd 등의 MagicWord를 입력하고 엔터키를 치면 됩니다. 바를 클릭하기가 귀찮으면 '윈도우키+Q'를 누르면 바에 커서가 가 있을겁니다.

설치후 보이는 남색 바

설치후 보이는 남색 바


매직워드는 자동완성도 지원하기 때문에 매우 편리합니다.

자동완성 기능 - 'no'만 입력했는데 전체 매직워드가 자동입력된 상태

자동완성 기능 - 'no'만 입력했는데 전체 매직워드가 자동입력된 상태

매직워드 등록은 간단합니다. 바의 끝부분을 우클릭하면 나타나는 컨텍스트 메뉴에서 'New MagicWord...'를 선택한 후 입력창이 나타나면 원하는 MagicWord를 입력하고 실행파일의 절대 경로나 URL을 입력하면됩니다. 절대경로는 레이블 Filename or URL을 클릭하면 파일선택 창이 뜨기 때문에 찾아서 선택하면 됩니다. 이게 불편하다고 생각되거나 이미 매직워드로 등록하고 싶은 어플리케이션이 실행중이라면 초록색 스포이드(?) 아이콘을 실행 중인 어플리케이션 창으로 드래그하면 창 색이 변경되면서 실행파일의 절대경로가 자동으로 입력되어 있는걸 볼 수 있을겁니다.

Total Commander를 'tc'라는 MagicWord로 등록했습니다

Total Commander를 'tc'라는 MagicWord로 등록했습니다


미리 입력되어 있는 매직워드 중 Filename이 iexplorer로 되어 있는 매직워드가 무엇인지 궁금하실 텐데요. 이런 매직워드는 웹사이트 검색을 위해서 사용합니다. 예를 들면, 아래 그림과 같이 입력하면 두번째 단어인 'java'가 검색어로 입력된 구글 창이 뜨게됩니다.

구글 검색

구글 검색


네이버를 검색하고 싶으시다면 매직워드 'naver'를 새로 등록하고 Filename or URL에는 iexplore를 입력합니다. 중요한건 Parameters인데 여기에는 아래와 같이 입력했습니다. '$W$'가 검색어로 변환되는 대치어입니다.

http://search.naver.com/search.naver?where=nexearch&query=$W$&frm=t1&sm=top_hty

네이버 검색

네이버 검색


아마 마우스로 손을 가져가기가 짜증날 때 이 툴을 자주 사용하게 될거라고 생각합니다. 마우스를 자주 안사용하는 분들, 특히 프로그래머에게는 매우 유용한 툴입니다. :)

댓글()

UTF8과 UCS2 간에 서로 변환할 수 없습니다

기타|2007. 10. 4. 10:19
java.sql.SQLException: UTF8과 UCS2 간에 서로 변환할 수 없습니다
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:189)
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:231)
    at oracle.jdbc.dbaccess.DBError.check_error(DBError.java:957)
    at oracle.sql.LobPlsqlUtil.plsql_read(LobPlsqlUtil.java:202)
    at oracle.jdbc.dbaccess.DBAccess.lobRead(DBAccess.java:700)
    at oracle.sql.LobDBAccessImpl.getChars(LobDBAccessImpl.java:210)
    at oracle.sql.CLOB.getChars(CLOB.java:247)
    at oracle.sql.CLOB.getSubString(CLOB.java:159)
  • CLOB 컬럼에 정상적으로 insert된 컨텐츠가, 읽어올 때에는 오류가 발생 함.
  • OC4J 10g 버젼에서 오래된 jdbc driver(classes12.jar)를 사용하였을 때 발생 하는 것으로 추정.
  • Oracle 10g Release 2 버젼용 jdbc driver(ojdbc14.jar)로 변경하자 정상적으로 작동함.


댓글()