Tüm hizmeti yeniden başlatmadan bir Tomcat web uygulamasını nasıl güncellerim?


94

İçin yeniyim Tomcat. Yaklaşık 5 uygulamanın çalıştığı bir geliştirici makinemiz var. Dev olsa da, testler sırasında müşterilerimiz tarafından oldukça yoğun bir şekilde kullanılıyor.

Diyelim ki bir sınıf dosyasında küçük bir değişiklik yapmamız gerekiyor. Şu anda, Tomcat'i (diğer dört uygulamayı etkileyen) kapatmalı, WARdosyayı (ve web uygulaması dizinini) silmeli , yeni WARdosyayı yeniden konuşlandırmalı ve yeniden başlatmalıyız Tomcat.

Tabii ki, bu birkaç kişiyi üzüyor çünkü tüm uygulamalar için oturum açmış tüm oturumları yok ediyor.

Bunu yapmanın daha iyi bir yolu var mı? Demek istediğim, dev makinesindeki her şey yerine yalnızca değişen SINIFI yeniden yüklemenin bir yolu var mı?

Teşekkürler.


Oturum yönetiminizi dosyalanmaya devam eden bir şeyle değiştirmek mi istiyorsunuz? Maalesef karşı koyamadım :)
rogerdpack

1
@rogerdpack Altı yıl önce bu soruyu sorduğumdan beri Tomcat hakkında çok şey öğrendim. Yinede teşekkürler.
cbmeeks

Çalışırken değiştirilen sadece sınıflarla ilgili olarak, stackoverflow.com/questions/32459047/…
rogerdpack

Yanıtlar:


59

Tomcat's Manager uygulamasını kullanmayı denediniz mi? Tomcat'i kapatmadan savaş dosyalarını dağıtmanıza / dağıtmanıza olanak tanır.

Yönetici uygulamasını kullanmak istemezseniz, savaş dosyasını webapps dizininden de silebilirsiniz, Tomcat kısa bir süre sonra uygulamayı kaldırır. Daha sonra bir savaş dosyasını dizine geri kopyalayabilirsiniz ve Tomcat savaş dosyasını konuşlandıracaktır.

Tomcat'i Windows'ta çalıştırıyorsanız , Bağlamınızı çeşitli dosyaları kilitlemeyecek şekilde yapılandırmanız gerekebilir .

Kesinlikle herhangi bir kesinti süresine sahip olamıyorsanız, Tomcat 7'nin Paralel dağıtımlarına bakmak isteyebilirsiniz Aynı anda aynı bağlam yolu ile bir web uygulamasının birden çok sürümünü dağıtabilirsiniz. İstekleri bir bağlam sürümüyle eşleştirmek için kullanılan kurallar aşağıdaki gibidir:

  • İstekte oturum bilgisi yoksa, en son sürümü kullanın.
  • İstekte oturum bilgisi mevcutsa, eşleşen bir oturum için her sürümün oturum yöneticisini kontrol edin ve bulunursa o sürümü kullanın.
  • Oturum bilgisi istekte mevcutsa ancak eşleşen oturum bulunamıyorsa, en son sürümü kullanın.

Bu da iyi bir öneri. Bugüne kadar yönetici uygulamasını hiç duymadım. Evet, Windows kullanıyoruz. WAR dosyasını silme ve beklemeyle ilgili endişelerimden biri, müşterilerimizin sık sık "küçük düzeltmeler" beklemesi. Bu öneriler bu senaryo için işe yarar mı?
cbmeeks

1
@cbmeeks - Bu küçük düzeltmelerin ne sıklıkla gerçekleştiğine ve birinin ne kadar süre önce farkına varacağına bağlı. Her iki durumda da, uygulamanın kullanılamadığı kısa bir süre olacaktır. Bu sürenin ne kadar uzun olduğu donanımınıza / uygulamanıza bağlıdır. Ancak saniyelerle ölçülür, uygulamalarımızda genellikle 5-10 diyebilirim. Ancak kilometreniz değişebilir :)
Steve K

1
Vay. Bu soruyu sorduğumdan beri çok şey öğrendim. Evet, artık Tomcat uygulamalarını Tomcat'i tamamen devre dışı bırakmadan dağıtıyoruz. Yaptığım bir şey, tüm günlük kayıtlarının (uygulama ve Tomcat) webapps / uygulama klasörünün İÇİNDE günlükleri kaydetmediğinden emin olmaktı. Veya Tomcat'i kilitlenmeyecek şekilde yapılandırmak da işe yarar. Böylece günlük kaydını Tomcat'in klasörünün dışında merkezi bir yere koyduk. Bir rüya gibi çalışır. Ama cevabınız çok yardımcı oldu. Teşekkürler!
cbmeeks

5
Yeniden dağıtım yapmadan yeniden dağıtırken, bellek sızıntılarına dikkat etmeniz gerekir - çoğu zaman sınıf yükleyiciler referansları sızdırır ve uygulamanın eski sürümünden bellek boşaltmak için tüm Tomcat işlemini yeniden başlatmanız gerekir. LiveRebel (başka bir cevapta bahsedilmiştir) sizin için bunların hepsini otomatikleştirebilir.
Neeme Praks

3
Yeniden konuşlandırmak için savaşı silmenize gerek yok. Sadece eski savaşı kopyalayın ve birkaç saniye bekleyin.
2014,

31

Birden çok kolay yol var.

  1. Herhangi bir web uygulamasının web.xml dosyasına dokunmanız yeterlidir.

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

Ayrıca, belirli bir jar dosyasını WEB-INF / lib'de güncelleyebilir ve ardından tüm savaş dosyasını oluşturup yeniden dağıtmak yerine web.xml'ye dokunabilirsiniz.

  1. Webapps / YOUR_WEB_APP dizinini silin, Tomcat 5 saniye içinde savaşı dağıtmaya başlayacak (savaş dosyanızın hala webapps klasöründe mevcut olduğunu varsayarak).

  2. Genellikle yeni sürümle savaş dosyasının üzerine yazılması, tomcat tarafından otomatik olarak yeniden konuşlandırılır. Değilse, yukarıda açıklandığı gibi web.xml'ye dokunabilirsiniz.

  3. Kopya zaten senin webapps klasörüne "dizini" patladı üzerinde


1
'Dokunma' yönteminin sınıfları yeniden yüklemediğini bilmek faydalıdır. IOW, webapp için sınıf yükleyici hiyerarşisini temizlemiyor ve yeniden yüklemiyor
Rondo

2
Bunun neden işe yaradığını görmek okuyabilir $CATALINA_BASE/conf/context.xml. WEB-INF / web.xml değişiklikleri için izlenir. Diğer kaynaklar gerektiğinde kolayca orada listelenebilir.
Kevin

21

Apache tomcat'in conf dizininde context.xml dosyasını bulabilirsiniz. Bu düzenleme etiketinde < Context reloadable = "true" > olarak. bu sorunu çözmelidir ve sunucuyu yeniden başlatmanıza gerek yoktur


Bunun yerine yönetici uygulamasını tercih edin. Bu koç için pahalı bir işlemdir.
Sıralayıcı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.