서버 재시작 없이 java 파일 수정 적용하기

Eclipse에서 Spring 개발을 하고 프로젝트 규모가 커지게 되면,
java 파일 한줄 수정 하고 짧게는 10초 길게는 40초, 1분이상 기다려야 하는 슬픈 시간 낭비를 하게 된다.

java 코드를 수정하면 tomcat에 바로 올려주는 spring-loaded 를 알기 전까지는 그랬다.

Springloaded를 활용한 빠른 톰캣 재시작

springloaded는 개발 환경에서 .java 파일을 수정했을 때,
변경되는 클래스 파일만 재로딩 하는 도구이다.
local PC 에서 코드 수정과 Tomcat 재시작 하는 시간을 줄여, 개발 생산성에 큰 도움이 된다.

다만 다음과 같은 경우에는 tomcat 재시작이 불가피 하다.

  • 상속 구조의 변경
  • Reflection 정보가 Cache 된 것.
  • XML 설정 파일 수정.
  1. 다음 링크에서 springloaded.jar 파일을 적절한 경로에 다운 받는다.
    • maven repository
      • 나의 경우에는 workspace에 바로 넣어 줬다. ( C:\Users\jeaha\dev\workspace )
  2. Servers -> 해당 tomcat 서버 선택
    • Overview
      • Open launch configuration
        • Arguments VM arguments 탭에 다음과 같이 인자로 경로와 jar를 잡아준다.
          • -javaagent:{{경로}}\springloaded-{{버젼}}.jar -noverify
      • Server Options의 옵션들 체크 해제
      • Publishing의 Automatically publish when resources change 선택
    • Modules 탭 > Edit > Auto reloading enabled 체크박스 해제

 

2번에서 아래 사진을 참고 후 3, 4를 진행한다.
인자를 위와 같이 준다
Auto reloading enabled 체크박스 해제

728x90
반응형

Linux 에서 Tomcat 재시작 하는 스크립트

테스트 서버에서 구성해 둔 Tomcat을 재기동할 때마다 일일히 shutdown 시키고, startup 하는게 귀찮아서 한방에 재시작할 수 있도록 restart.sh를 만들어 봤다.
기존의 startup.sh와 shutdown.sh가 있는 상태에서 작동한다.

#!/bin/bash
export LANG=ko_KR.UTF-8

## 이곳에 각자 경로를 넣어주면 됨
C_HOME=/usr/local/tomcat7
C_PATH=$C_HOME/bin
C_LOG=$C_HOME/logs

#echo $C_HOME
#echo $C_PATH
#echo $C_LOG

## FUNCTION WAIT FOR 5 SECS
function stanby() {
  # full bar, e.g. 20 chars
  BAR='####################'
  VAC='                    '

  for i in {1..20}; do
    # waited sec
    var=`echo "0.25*$i"|bc`
    # print $i chars of $BAR from 0 position && from $i to 20
    echo -ne "\r>> STANBY [${BAR:0:$i}${VAC:$i:20}] $var sec << "
    # wait 250ms between "frames"
    sleep .25
  done
  echo -ne "\n"
}

### CHECK IS SERVER ALIVE
function isAlive() {
  if [ -z "`ps -eaf | grep java | grep $C_PATH`" ]; then
    # END
    echo 0
  else
    # RUN
    echo 1
  fi
}


echo -e "\n\n\t\t !!>> RESTART.SH RUN `date +%Y-%m-%d' '%H:%M:%S` <<!!\n\n" >> $C_LOG/catalina.out

## RUN SHUTDOWN.SH
echo -e "\nShutdown tomcat now...\n"
bash $C_PATH/shutdown.sh

stanby

## CHECK THE PROCESS ENDED
if [ isAlive == 0 ]; then
  echo -e "\n\t>>> Tomcat was terminated successfully. <<<\n"
else
  ## IF IT HAS NOT ENDED KILL PROCESS
  ps -eaf | grep java | grep $C_PATH | awk '{print $2}' |
  while read PID
  do
    echo "Killing $PID... "
    kill -9 $PID
    echo -e "Tomcat($PID) is being killed\n"
  done

  stanby
fi

echo -e "\n\t>>> try to restart tomcat now <<<\n"

## RUN STARTUP.SH
bash $C_PATH/startup.sh

if [ isAlive == 0 ]; then
  echo -e "\n\t>>> ERROR!!! CAN NOT START TOMCAT!!  <<<"
else
  ## IF IS PROCESS RUN, CHECK USER WANNA TAIL LOG
  echo -e "\n\t>>> TOMCAT STARTUP COMMAND IS ON ACTION. <<<"
  echo -en "tail log?? (y|n) : "
  read yn

  ## TAIL LOG
  if [ $yn == "y" ] || [ $yn == "Y" ]; then
    # **CHECK DIR**
    tail -f $C_LOG/catalina.out
  fi
fi

프로세스 확인하는 함수를 따로 빼 두거나,
startup이나 shutdown의 경로를 따로 변수로 잡아주면 좋을것 같지만 일단 킵해두도록 함.

추가적으로 서버 기동 후 로그를 보는 명령어도 귀찮아서 shell 파일로 만들어 봤다.

    #!/bin/bash
    export LANG=ko_KR.UTF-8

    tail -f ../logs/catalina.out
728x90
반응형

+ Recent posts