2 minute read

배포 개요

: 자바프로젝트를 원시적인 방법인 리눅스로 배포하는 방법을 알아본다.

jar 명령어

war 압축파일 생성 (for 리눅스OS)

: jar 명령어로 자바프로젝트 디렉토리를 war확장자로 압축한다.

# jar -cvf [생성할파일명].war [생성대상]

# 현재 경로의 모든 파일들을 압축
jar -cvf study.war .

# 특정 디렉토리 자체를 압축
jar -cvf study.war /testDir 

war 압축파일 해제 (for 리눅스OS)

: jar 명령어로 war확장자 압축을 해제한다. (자동배포를 사용하지 않는 경우 직접 배포한다.)

# jar -cvf [압축해제대상]

# 현재 경로에 아래경로의 압축파일을 해제
jar -xvf ~/study/study.war

배포

: 순차적으로 요약하면 다음과 같다.

  1. sever.xml 자동배포 설정
  2. war 압축파일 생성
  3. ContextRoot 경로로 war파일 넣기 (톰캣이 기동되면 자동으로 폴더가 생성되어 배포된다. 단, 반드시 정상적인 파일이어야 배포된다.)
  4. 서버기동 후 배포확인
  5. server.xml 에서 docBase 등록

(0) sever.xml 자동배포 설정

: 현재 톰캣서버가 자동배포 설정이 되어있는지 확인한다.

vi [톰캣루트]/conf/server.xml

<Host name="localhost"  
  appBase="webapps"  
  unpackWARs="true"    #톰캣구동시점 자동배포
  autoDeploy="true">   #war압축을풀어서 배포

  ...
</Host>

참고)
두 옵션은 디폴트로 true 이다.
환경에 따라 다르겠지만 확인은 필요할것이다.

(1) war 압축파일 생성

: war파일을 생성한다. (나는 기존의 프로젝트를 war로 묶는것을 설명하겠다.)

# 'study' 이라는 기존 자바프로젝트 Directory 존재.
cd ~/study

# 안에는 당연히 웹프로젝트 구조이다.
ls
META-INF  hi.jsp             resources
WEB-INF   public_index.html


# war 압축파일 생성
cd ~/study
jar -cvf study.war .

주의)
폴더를 압축하는 것이 아닌 폴더 내부의 파일들을 압축해야한다.
(설정에 따라 다르겠지만 디폴트 기준으로 작성)

(2) ContextRoot 경로로 war파일 넣기

: 자동배포를 위해 war파일을 톰캣컨택스트루트에 위치시킨다.

cd [톰캣루트]/webapps

# 톰캣컨택스트루트에 방금만든 war압축파일 이동
mv ~/study/study.war .

(3) 서버기동 후 배포확인

: 서버를 기동하여 정상배포를 확인한다.

# 톰캣 기동 스크립트
wasstop
wasstart

# 정상적으로 war 압축이 해제되어 디렉토리가 생겼다.
ls [톰캣루트]/webapps/
study   study.war

배포시 디렉토리권한
배포시 디렉토리 권한이 root 로 설정되어있다. 아래 명령어로 관리자에게 디렉토리권한을 할당하자.

sudo chown -R wasadm:wasadm /fswas

(4) server.xml 에서 docBase 등록

: 해당 프로젝트에 접근할 수 있도록 컨택스트 매핑해준다.

vi [톰캣루트]/conf/server.xml


# <HOST> 태그 내부에 추가
<Context docBase="study" path="/study" reloadable="true"/>

이슈(작성중)

: 실시간으로 추가 이슈를 기록.

CASE1. war-tracker 자동배포 실패

: 기존 아무 프로젝트를 jar명령어를 통해 war확장자로 묶어서 배포하는데 계속해서 자동배포가 안되었다.. (3시간 삽질)

catalina.log
java.io.IOException: 파일 […/META-INF/war-tracker]을(를) 생성할 수 없습니다 해결

  1. 원인
    톰캣 공식문서에서 war 파일을 확장하면, 톰캣이 실행 중이 아닐 때 war 파일의 변경을 감지하기 위해 [/META-INF/war-tracker] 파일을 추가한다고 한다.
    • 나는 수동으로 war파일(다른프로젝트파일을 통으로 압축)을 META-INF/war-tracker 파일을 포함시키고 pack 했다.
    • 배포중에 tomcat은 변경 사항 감지를 위해 해당 파일(war-tracker)을 생성하려고 하지만 이미 파일이 존재하면 tomcat은 파일을 만들 수 없다며 위의 Exception을 발생시킨다.
  2. 해결방안
    war-tracker 파일을 삭제하고 다시 war를 pack한다.
     rm ~/study/META-INF/war-tracker
    
    
  3. 해결완료
    다시 war 압축하고 컨택스트루트에 넣고 톰캣기동하니까 정상적으로 배포한다.

CASE2. FTP 전송된 jsp ‘^M’ 에러

: FTP 으로 전달받은 war 로 배포하려고하니까 톰캣이 에러를 발생시킨다.

catalina.log
Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map ‘Controller’ method

  1. 원인
    FTP로 전송한 war압축 내용에서 jsp의 내용이 변조되었다.
    • 윈도우에서 작성한 파일을 Unix/Linux상에 올리면 개행 문자가 깨져서 ^M가 보이는 경우가 있다.
    • 이것은 윈도우에서는 CRLF 가 개행인데 Linux/Unix에서는 LF가 개행이라 나타나는 현상으로 보면 된다.

      [CR,LF 뜻]
      라인피드(LF : Line Feed) => 현재 위치에서 바로 아래로 이동.
      캐리지리턴(CR: Carriage return) => 커서의 위치를 앞으로 이동.

  2. 해결방안
    vi, vim에서 FTP 전송중에 붙어버린 ^M 을 제거하면 끝.
     vi [^M붙은JSP파일]
    
     # 아래 정규식으로 모두 제거
     :%s/^M//g
    
    

    주의)
    ^M는 ^+M 이 아니고 Ctrl + v + m 이다.

  3. 해결완료
    완료했다.

참고용)

작성중

: javac -cp “../../../lib/*” SessionController.java

Leave a comment