전체 서비스를 다시 시작하지 않고 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.