SW-PRODUCT/개발-Mentor

2015. 2. 2. 18:22

* Jar 패키징 형태의 Stand-alone 만들기 Howto : http://blog.daum.net/rollin/8097077



spring-boot 메인페이지 : http://projects.spring.io/spring-boot/

RESTfull 서비스 starter : http://spring.io/guides/gs/rest-service/
ㄴ jar로 만들어서 stand-alone으로 실행됨


Thymeleaf 기반으로 Jar 및 WAR 기반 프로젝트 가이드 : http://spring.io/guides/gs/convert-jar-to-war-maven/

ㄴ 근데 Thymeleaf가 좀 별로인듯..;;


war로 만들기 가이드 : http://spring.io/guides/gs/convert-jar-to-war/

ㄴ 내용은 별로 없고, spring-boot 레퍼런스의 war 만들기 위치로 링크 제공.


레퍼런스의 maven으로 war 만들기 가이드 : http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#build-tool-plugins-maven-packaging


Maven 기준으로 보면,

- type을 war로 지정하고,

- spring-boot-start-tomcat을 provided로만 바꿔주고,

- SpringBootServletInitializer를 상속하는 클래스를 하나 만들어줘야 한다.


public class WebInitializer extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
}


특이한것은  만들어진 war를 까봐도 web.xml은 없다.

Servlet 3.0부터 @WebServlet 어노테이션이 추가되면서 web.xml을 대체할 수 있다고 되어 있는데 딱히 나는 @WebServlet을 사용한적도 없다. spring이 만들어 심어둔것이 있을거라 추정되긴 하지만...못찾겠다.

특이한건 servlet container가 이걸 어떻게 찾는가 하는거다... 어떠한 힌트도 적어준 적이 없다...


@WebServlet 관련 링크들.

- Java EE 6 Tutorial > Creating and Initializing a Servlet

- http://blog.caucho.com/2009/10/06/servlet-30-tutorial-weblistener-webservlet-webfilter-and-webinitparam/

- http://www.codejava.net/java-ee/servlet/quick-start-guide-for-java-servlet-annotations

- https://blogs.oracle.com/swchan/entry/servlet_3_0_annotations



어쩄든... jar와 war 둘 다 가능한 방식으로 spring-boot로 프로젝트 간단히 생성해두면

간단한 웹서비스는 뚝딱 만들기 좋다.

로컬에서는 stand-alone으로 테스트하고

서비스는 war 형태로 클라우드에 올리고..



restful 샘플을 그대로 war 배포용으로 바꾸려고 하면 SpringBootServletInitializer 클래스가 없는 문제 때문에 애먹는다.

뭔가 spring이...기능도 많고 spring-boot 같이 쉽게 접근하는 방법도 다양한데...
하나씩 끊겨있는 부분이 있다.

spring-boot의 stand-alone을 war로 배포하는 부분만 봐도, 문서는 분명 이런저런 얘기를 다 해주고 있는데, 그냥 보면서 따라가서는 절대 restfull 샘플에서 deploy 가능한 war 만드는게 안된다.

SpringBootServletInitializer를 어떻게 상속받아서 구현해야 하는지 알 수 없어서...
-> 링크: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-convert-an-existing-application-to-spring-boot

참 어렵다...
요즘 찾은것 중에 appassembler 라는 메이븐 플러그인도 있다.
http://www.mojohaus.org/appassembler/appassembler-maven-plugin/
jar를 한덩어리로 억지로 만드는게 아닌
jar 프로그램의 패키지를 만들어주는 플러그인이다.
관련 라이브러리나 설정들을 이쁘게 디렉토리로 모아주고
실행스크립트에 CLASSPATH를 자동으로 작성해준다.
개발한 jar는 진짜 내가 짠 코드 결과물로만 깔끔하게 떨어진다.

dependency 관리도 잘 되고,spring-boot과 달리 설정 수정하기도 용이해서
개인적으론 spring-boot 방식보다 마음에 든다.