전체 서비스를 다시 시작하지 않고 Tomcat 웹앱을 어떻게 업데이트합니까?


93

저는 Tomcat. 약 5 개의 앱이 실행중인 개발 머신이 있습니다. dev에도 불구하고 테스트 중에 고객이 상당히 많이 사용합니다.

따라서 하나의 클래스 파일에서 작은 변경을해야한다고 가정 해보십시오. 지금 당장은 Tomcat을 종료하고 (다른 4 개의 앱에 영향을 줌) WAR파일 (및 웹 앱 디렉토리)을 삭제 하고 새 WAR파일을 재배포하고 Tomcat.

물론 이것은 모든 앱에 대해 로그인 한 모든 세션을 파괴하기 때문에 몇몇 사람을 화나게합니다.

이 작업을 수행하는 더 좋은 방법이 있습니까? 내 말은, dev 컴퓨터의 모든 것 대신 변경된 CLASS 만 다시로드하는 방법이 있습니까?

감사.


세션 관리를 파일에 유지되는 것으로 변경 하시겠습니까? 죄송합니다 :) 저항 할 수 없었다
— rogerdpack

1
@rogerdpack 저는 6 년 전에이 질문을 한 이후로 Tomcat에 대해 많은 것을 배웠습니다. 어쨌든 감사합니다.
— cbmeeks

핫 스와핑 단지 클래스에 대해서는, 참조 stackoverflow.com/questions/32459047/...
— rogerdpack

답변:


59

Tomcat의 관리자 응용 프로그램 을 사용해 보셨습니까 ? Tomcat을 종료하지 않고 war 파일을 배포 해제 / 배포 할 수 있습니다.

Manager 애플리케이션을 사용하지 않으려면 webapps 디렉토리에서 war 파일을 삭제할 수도 있습니다. Tomcat은 잠시 후 애플리케이션을 배포 해제합니다. 그런 다음 war 파일을 디렉토리로 다시 복사하면 Tomcat이 war 파일을 배포합니다.

Windows에서 Tomcat을 실행하는 경우 다양한 파일을 잠그지 않도록 컨텍스트를 구성 해야 할 수 있습니다.

다운 타임이 전혀 없다면 Tomcat 7의 병렬 배포 를 살펴볼 수 있습니다. 동시에 동일한 컨텍스트 경로로 여러 버전의 웹 애플리케이션을 배포 할 수 있습니다. 요청을 컨텍스트 버전에 일치시키는 데 사용되는 규칙은 다음과 같습니다.

  • 요청에 세션 정보가 없으면 최신 버전을 사용하십시오.
  • 요청에 세션 정보가있는 경우 각 버전의 세션 관리자에서 일치하는 세션이 있는지 확인하고 하나가 있으면 해당 버전을 사용합니다.
  • 요청에 세션 정보가 있지만 일치하는 세션을 찾을 수없는 경우 최신 버전을 사용하십시오.

그것도 좋은 제안입니다. 오늘까지 매니저 앱에 대해 들어 본 적이 없습니다. 예, Windows를 사용합니다. WAR 파일을 삭제하고 기다리는 것에 대한 한 가지 우려는 클라이언트가 "작은 수정"을 자주 기대한다는 것입니다. 이러한 제안이 해당 시나리오에 적용됩니까?
— cbmeeks

1
@cbmeeks-이러한 작은 수정이 발생하는 빈도와 누군가가 알아 차리기까지 걸리는 시간에 따라 다릅니다. 두 경우 모두 응용 프로그램을 사용할 수없는 약간의 시간이 있습니다. 그 시간은 하드웨어 / 애플리케이션에 따라 다릅니다. 하지만 초 단위로 측정됩니다. 일반적으로 애플리케이션에서 5 ~ 10 개라고 말하고 싶습니다. 그러나 귀하의 마일리지가 :) 다를 수 있습니다
— 스티브 K

1
와. 이 질문을 한 이후로 많은 것을 배웠습니다. 예, 이제 Tomcat을 완전히 다운시키지 않고 Tomcat 앱을 배포합니다. 내가 한 한 가지는 모든 로깅 (앱 및 Tomcat)이 webapps / application 폴더 안에 로그를 기록하지 않도록하는 것입니다. 또는 잠그지 않도록 Tomcat을 구성하는 것도 작동합니다. 그래서 우리는 Tomcat 폴더 외부의 중앙에 로깅을 둡니다. 꿈처럼 작동합니다. 하지만 당신의 대답이 가장 도움이되었습니다. 감사!
— cbmeeks 2013 년

5
다시 시작하지 않고 재배포 할 때 메모리 누수에주의해야합니다. 매우 자주 클래스 로더가 참조를 누수하고 이전 버전의 응용 프로그램에서 메모리를 해제하려면 전체 Tomcat 프로세스를 다시 시작해야합니다. LiveRebel (다른 답변에서 언급)은 모든 것을 자동화 할 수 있습니다.
— Neeme Praks 2013-06-10

3
재배치하기 위해 전쟁을 삭제할 필요가 없습니다. 이전 전쟁을 복사하고 몇 초만 기다리십시오.
— peceps

30

여러 가지 쉬운 방법이 있습니다.

  1. 웹앱의 web.xml을 터치하기 만하면됩니다.

    touch /usr/share/tomcat/webapps/<WEBAPP-NAME>/WEB-INF/web.xml
    

또한 전체 war 파일을 빌드하고 다시 배포하는 대신 WEB-INF / lib에서 특정 jar 파일을 업데이트 한 다음 web.xml을 터치 할 수도 있습니다.

  1. webapps / YOUR_WEB_APP 디렉토리를 삭제하면 Tomcat이 5 초 이내에 war 배포를 시작합니다 (war 파일이 webapps 폴더에 여전히 존재한다고 가정).

  2. 일반적으로 새 버전으로 war 파일을 덮어 쓰면 tomcat에 의해 자동으로 재배치됩니다. 그렇지 않은 경우 위에서 설명한대로 web.xml을 터치 할 수 있습니다.

  3. 복사 이미 웹 어플리케이션 폴더에 "디렉토리를"폭발 이상


1
'touch'메서드가 클래스를 다시로드하지 않는다는 것을 아는 것이 유용합니다. IOW, webapp에 대한 클래스 로더 계층을 제거하고 다시로드하지 않습니다
— Rondo

2
이것이 작동하는 이유를 보려면 $CATALINA_BASE/conf/context.xml. WEB-INF / web.xml은 변경 사항을 감시합니다. 필요에 따라 다른 리소스를 쉽게 나열 할 수 있습니다.
— Kevin

21

apache tomcat의 conf 디렉토리에서 context.xml 파일을 찾을 수 있습니다. 해당 편집 태그에서 < Context reloadable = "true" >. 이렇게하면 문제가 해결되고 서버를 다시 시작할 필요가 없습니다.


대신 관리자 응용 프로그램을 선호하십시오. 이것은 숫양에게 값 비싼 작업입니다.
— Sorter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.