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

이클립스에서 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

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 드라이버 인스톨

아래의 명령으로 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

이클립스에 구글 앱 엔진 플러그인을 설치한 후 어플리케이션을 하나 만들고, 결과를 확인하려고 '프로젝트명 우클릭 > 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를 사용하여 업로드한 임시파일은 지워질까?

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);

        }

    }

    ......

}




신고