2018년 5월 3일 목요일

[ubuntu] spring boot war 배포 시 발생하는 에러 대응 방법

spring boot 프로젝트로써 빌드된 war 파일을 ubuntu tomcat8 서버에 배포 후, tomcat8 재실행 시, 알수 없는 버그들을 만났다.

만난 버그 내용과 대응책을 공유 하도록 한다.

먼저, 구성되어있는 개발 환경 이다.

배포서버 환경 
OS : Ubuntu 17.10
JAVA : java version "1.8.0_171"
TOMCAT : tomcat8

개발피시 환경
OS : Windows 7 64비트
JAVA : java version "1.8.0_102"
TOOL : Spring Tool Suite (Version: 3.9.2.RELEASE)

위 개발 피시의 환경에서, Maven Install 을 해서 생성된 war 파일을 FTP를 이용해서 서버에 업로드 하고,
service tomcat8 restart
명령을 통해 tomcat8을 재실행 하였다.

그러나, 톰캣은 실행되지 않고 아래 메시지를 만났다.

Job for tomcat8.service failed because the control process exited with error code.
See "systemctl  status tomcat8.service" and "journalctl  -xe" for details.

에러가 발생하여 tomcat8이 실행되지 못하고 종료됬다.

/var/lib/tomcat8/logs 에서 catalina.out 파일을 열어서 error를 확인해야한다.

내가 만난 에러 메시지는,

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]...

해당 에러 메시지에 대한 웹 검색으로 찾은 대응 방법은

프로젝트에서 사용하는 servlet 2.5 버전파일을 3.x 버전파일로 업그레이드해라 

이다.

그러나 내겐 해당 되지 않는 해결책 이었다.

어째든 servlet을 찾지 못해 발생하는 에러 임은 확인 되어, 기본적으로 소스 코드에서 문제가 있는지 확인 해 보았다.

확인 결과 Application class 파일에 SpringBootServletInitializer 가 빠져있었다.
그래서 아래 처럼 수정 하고 인스톨후 배포했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class SeApplication extends SpringBootServletInitializer {
 
    public static void main(String[] args) {
        SpringApplication.run(SeApplication.class, args);
    }
 
    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        
        Resource[] arrResource = new PathMatchingResourcePatternResolver().getResources("/mapper/*Mapper.xml");
        sqlSessionFactoryBean.setMapperLocations( arrResource );
        return sqlSessionFactoryBean.getObject();
    }
    
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(SeApplication.class);
    }
}
 





cs


그러나, 다시 두번째 tomcat8 실행 에러를 만났다.

이번에 확인 한 에러 메시지는

1
2
org.apache.catalina.LifecycleException: A child container failed during start
 
cs

확인 해 보니, <사용자명>/.m2/repository 내의 maven 저장 jar 파일들 중 같은 파일이지만 버전이 다른 것들 사용하지 않는것들이 프로젝트 내에 연결되어 있는 상태였다.

spring tool suit를 종료하고,
.m2 폴더를 삭제 후, spring tool suite를 실행 하였다.

상단 메뉴의 Project - Build Automatically 에 체크 상태이면, spring tool suite 실행시, 자동으로 모든 프로젝트들에 대하여 maven - update project 를 실행한다.

그리고 pom.xml 파일에서 최 상단에 에러가 표시된다.

Multiple annotations found at this line: %09- Failure to transfer ...

그러면, pom.xml 전체 스크립트를 카피하고 저장 그리고 다시 붙여넣기 후 재저장 하면,

해당 프로젝트의 pom.xml 에러가 해결된다.




















댓글 없음:

댓글 쓰기