민서네집

"쉽게 따라하는 자바웹개발" project error/warning 없애기. 본문

Spring

"쉽게 따라하는 자바웹개발" project error/warning 없애기.

브라이언7 2013. 10. 17. 04:22

도서명: 쉽게 따라하는 자바웹개발

출판사: 인사이트

지은이: 백기선

출판일: 2012년 11월 30일


1.3.2 프로젝트 다운로드 (10 page)

http://whiteship.me/book/legacy-sample.zip   (파일 다운로드)

https://github.com/keesun/legacy-sample    ( STS 에서 Import > Git )


개발툴: STS(Spring Tool Suite) Version: 3.4.0.RELEASE      Build Id: 201310051818


나는 STS 의 Import 메뉴를 이용해 github 에서 import  했다.


프로젝트를 빌드하면서 나는 대부분의 에러는 Maven 관련 에러였다.

인터넷을 통해 라이브러리(jar파일)을 가져오면서 완전히 다 못 가져온다던지, 파일 크기는 맞아도 jar 파일의 압축을 풀어보면 헤더가 손상되었다는 메시지가 출력되는 경우 등. - SHA-1 의 checksum 을 계산해서 ~.sha1 파일과 비교해보면 jar 파일이 온전한지를 확인할 수 있다.


이클립스(혹은 STS)에서 Problems View 에서 jar 파일명이 나오는 경우는 어느 jar 파일이 문제인지 쉽게 알 수 있지만, class 파일이 없다고 나오는 경우도 있고, - 이런 경우는 인터넷에서 검색해서 그 class 파일이 어느 jar 에 속해 있는지 알아야 한다.

어떤 경우는 Problems View 에는 error 가 없어도 실행해보면 에러가 나는 경우도 있다. 그러면 로그 파일을 보고 인터넷 검색을 해봐서 어느 클래스에서 문제가 있는지 확인해보고, 그 클래스가 속한 jar 파일이 온전한지를 체크해봐야 한다.


jar 파일의 checksum 이 맞지 않는다면 그 jar 가 속한 폴더를 통째로 지우고, 이클립스에서 clean 하고 다시 빌드를 한다.


나는 우리집 인터넷이 네트워크가 불안하다고는 생각하지 않고 있었는데, - 파일을 다운로드 받으면서 깨지거나 그런 경우는 없었다. - maven 을 통해 라이브러리를 가져오는 것이 왜 이렇게 불안한 것일까? maven 에서 다운로드 받는 로직을 개선해서 다운로드 받은 파일의 유효성을 체크해야 되는 것이 아닐까?


내 컴퓨터 내의 maven repository 내의 모든 jar 파일의 checksum 을 계산해서 맞지 않는 폴더를 출력해주는 스크립트라도 만들어 놔야 할 듯하다.


http://bryan7.tistory.com/276  => 여기에 Python 으로 만든 Maven Repository Check Script를 만들어 놨다.


Spring 이나 Maven 을 처음 접해보는 사람이라면 책의 처음 예제에서 이런 많은 에러가 난다면 아마 4분의 3 은 포기하지 않을까? 좋은 책인데, Maven 관련해서 이렇게 많은 문제가 있는지 나도 실제로 돌려보고야 알았다.

봄싹 Google Groups 에 올라온, 이 책과 관련된 수많은 질문은 대부분 Maven 때문이었다.

저자인 백기선 님도 다음에는 자신의 컴퓨터의 maven repository 를 통째로 압축해서 CD 에 담아서 배포하겠다고 할 정도였다.


Error - Can not find the tag library descriptor for "http://www.springframework.org/tags/form"



Can not find the tag library descriptor for "http://www.springframework.org/tags/form"


<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>


이 에러는 치명적인 것처럼 보이지만, 실행에는 문제가 없다.

이 에러는 소스의 문제가 아니라 이클립스의 버그인 것 같다.

왜냐하면 spring의 tag library 가 spring-webmvc-3.0.5.RELEASE.jar 파일에 있는데, 이 파일을 project 의 WEB-INF/lib 폴더에 넣으면 에러가 사라지기 때문이다.




이 jar 파일은 Java Build Path 에서 Libraries 탭에 보면 Maven Dependencies 에 속해 있다.
그러면 이클립스에서 자동으로 인식해서 tag library를 찾아야 하는데, 꼭 WEB-INF/lib 에 있어야지만 된다니...


P.S.

모든 에러를 해결하고 나서 Tomcat 7 서버를 실행도 시켜본 후, /WEB-INF/lib 에서 spring-webmvc-3.0.5.RELEASE.jar 파일을 삭제하고 나서 clean 하고 다시 빌드해도 

Can not find the tag library descriptor for "http://www.springframework.org/tags/form"

라는 에러가 발생하지 않는다.

웹 서버가 실행되면서 Maven의 라이브러리가 /WEB/lib 폴더로 export 된 것으로 이클립스에서 인식한 것일까?



Error - Referenced file contains errors (http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd)



이 에러는 저자가 약간의 실수를 한듯 하다.

web.xml 파일에서 xml schema 정의한 부분이 좀 잘못 되었다.

그러나 web.xml 의 이런 XML 정의와 관련된 에러는 실행에는 문제가 없다.


이 에러의 해결책은 2가지다. 


<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

version="2.5"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd">


이렇게 되어 있는 부분을 다음과 같이 수정한다.


<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

version="2.4"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">


아니면 다음과 같이 수정한다.


<web-app version="2.5"

xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">


version 을 2.5 로 하려면 j2ee 로 되어 있는 부분을 javaee 로 수정하면 된다.


[출처] http://stackoverflow.com/questions/13437569/what-does-this-web-xml-error-mean


web-app_2_5.xsd 파일을 다운로드 받아보면 상단에


<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"

   targetNamespace="http://java.sun.com/xml/ns/javaee"

   xmlns:javaee="http://java.sun.com/xml/ns/javaee"

   xmlns:xsd="http://www.w3.org/2001/XMLSchema"

   elementFormDefault="qualified"

   attributeFormDefault="unqualified"

   version="2.5">


이렇게 되어 있다.


참고로 Tomcat 7 은 Servlet 3.0 까지 지원하고, Tomcat 6 는 Servlet 2.5 까지 지원, Tomcat 5.5 는 Servlet 2.4 버전까지 지원한다고 한다. [출처] http://stackoverflow.com/questions/8400301/cout-unknown-tag


[참고] 서블릿 버전별 DTD - http://antop.tistory.com/145



Warning - Unknown tag (Spring Custom Tag 를 인식못하고 warning 이 나는 경우)




별로 대단한 것은 아니다. 단순히 무시해도 되는 Warning 이지만, 이 warning 을 없애려면


web.xml 에서 <welcome-file-list> 태그 뒤에


<jsp-config>

<taglib>

<taglib-uri>http://www.springframework.org/tags/form</taglib-uri>

<taglib-location>/WEB-INF/tlds/spring-form.tld</taglib-location>

</taglib>

</jsp-config>


를 갖다붙인다.


spring-form.tld 파일은 

C:\Users\{사용자명}\.m2\repository\org\springframework\spring-webmvc\3.0.5.RELEASE\spring-webmvc-3.0.5.RELEASE.jar 파일의 압축을 풀어보면 META-INF 폴더 안에 들어있다.


spring-form.tld 파일을 복사해서 내 프로젝트의 WEB-INF 밑에 web.xml 에서 정의된 경로에 갖다 놓지 않으면 warning 은 없어지지만 실행 시 에러가 나서 해당 페이지가 뜨지 않는다.


에러메시지: 

org.apache.jasper.JasperException: /WEB-INF/views/member/form.jsp (line: 3, column: 71) File "/WEB-INF/tlds/spring-form.tld" not found


[참고] No tag library could be found with this URI ( http://antop.tistory.com/146 )

Tomcat 7 서버에서는 web.xml 에 <taglib> 를 정의하지 않아도 별 문제가 없지만, 웹로직 서버에서는 에러가 난다는 내용이다.



실행 시 Error - javax.validation.ValidationException: Unable to find a default provider


Build Error 를 다 해결하고 나서 웹 브라우저로 접속 시 첫화면은 잘 뜬다.



그런데, 웹 브라우저에서 http://localhost:8080/app/member/form 로 접속 시 500번 에러가 나는 경우이다.



org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.validation.beanvalidation.LocalValidatorFactoryBean#0': Invocation of init method failed; nested exception is javax.validation.ValidationException: Unable to find a default provider


Error log 를 봐도 소스의 어디에서 이상이 있는지를 알 수 없다.


javax.validation.ValidationException: Unable to find a default provider 를 Google 에서 검색해보면

이 에러는 hibernate-validator 라는 jar 파일과 관련이 있다는 것을 알 수 있다.


[출처] http://blog.naver.com/muchine98/140161045048


위 블로그의 내용을 발췌해 보자면,


Spring MVC 에서 JSR 303 @Valid Annotation 을 사용하기 위해서는 아래와 같이 hibernate-validator 라이브러리를 포함시켜야 한다.


<dependency>

 <groupId>org.hibernate</groupId>

 <artifactId>hibernate-validator</artifactId>

 <version>4.2.0.Final</version>

</dependency>


이름은 Hibernate이지만 실제로 하는 역할은 Validation과 관련된 것 뿐이다. 만약 다른 javax.validation 패키지를 지원하는 라이브러리를 등록한다면, WAS 서버 기동 시javax.validation.ValidationException: Unable to find a default provider라는 에러가 발생한다.


이후 세팅은 아래 링크를 참조한다.

http://www.mkyong.com/spring-mvc/spring-3-mvc-and-jsr303-valid-example/


legacy-sample 프로젝트의 pom.xml 에서 hibernate-validator 으로 검색해 보면


<dependency>

            <groupId>org.hibernate</groupId>

            <artifactId>hibernate-validator</artifactId>

            <version>4.0.0.GA</version>

        </dependency>


이제 C:\Users\{사용자명}\.m2\repository\org\hibernate\hibernate-validator\4.0.0.GA 폴더로 가서

hibernate-validator-4.0.0.GA.jar 를 검사해보자.

SHA-1 로 checksum 을 구해봐도 hibernate-validator-4.0.0.GA.jar.sha1 의 내용과 같지 않고, 압축을 풀어보면 에러가 나면서 압축이 풀리지 않는 것을 알 수 있다.


이제 C:\Users\{사용자명}\.m2\repository\org\hibernate\hibernate-validator\4.0.0.GA 폴더를 지우고, 프로젝트를 clean 하고 다시 빌드해보자. 그러면 eclipse 에서 pom.xml 에 정의된 라이브러리가 없는 경우 자동으로 다시 다운로드 받는다.


이런 경우가 Maven 의 잘못된 라이브러리 다운로드 때문에 실행 시 알수 없는 에러가 나는 경우이다.


Comments