2008-11-06 13 views

cevap

37

here'u gördüğünüz gibi, Tomcat sunucunuzda webapp başına bir sınıf yükleyici oluşturur. Bu nedenle, aynı kitaplığı paylaşan webapp1 ve webapp2'niz varsa, bu kitaplık gerçekten iki kez yüklenecektir.

Bu kitaplığı, Tomcat sunucunuzda çalışan tüm webapps tarafından paylaşılan webapps tarafından paylaşılan ortak dizinde (tomcat-dir/common/lib) sonunda yapabilirsiniz.

+1

i sunucusu içinde ortak bir dizin yok olabilir apache tomcat yinelenen kütüphanesinde çok yüklüyorsunuz çünkü PermGen uzay Sadece sıkça meydana edebilirsiniz sınıfları ve lib dizini var. İçinde ortak bir tane mi yaratmalıyım? –

+0

Kullanacağım iyi dizinin [tomcat-installation-directory]/common/lib – romaintaz

+0

olduğunu açıkça belirtmek için gönderimi düzenledim, görünüşe göre jdbc sürücülerini ortak FWIW http://stackoverflow.com/questions/ adresine dağıtmak 6981564/neden-jdbc-sürücü-in-in-in-tomcat-home-lib-klasörü] – rogerdpack

6

Tecrübemizden: iki web uygulaması birbirinden tamamen izole edilmiştir - biri için kütüphaneler bir başkasında kullanılmaz - böylece ilk sorunuza cevap verir - evet iki kez yüklenir.

paylaşılan konuma kütüphane Jar dağıtırsanız (erkek kedi/sunucu/lib: hayır derdim ve burada neden -

Eğer Tomcat'in paylaşılan dizine bu kitaplıkları dağıtmak gerekmediğini, size ikinci soruyu cevaplamak için), daha sonra, bu Tomcat örneğinin altında çalışan tüm web uygulamaları için varsayılan kütüphane sürümü haline gelir. this overview of the tomcat architecture'dan görebileceğiniz gibi, sınıf yükleyici "zincirden aşağı" çalışır; bireysel bir web-app'ın lib klasörü, bulunamayan bir istisna atmadan önce bakacağı son yer olur. Bu, Tomcat 6 ve Tomcat 7'de doğru değildir: web uygulamaları lib ve sınıflar klasöründeki sınıfındaki tüm sınıflar, ortak olanlardan önce çözülecektir ve bu nedenle, tüm kavanozlarını savaşta dağıtan diğer uygulamaları bozmayacaktır 2 . Bu nedenle, paylaşılan bir kitaplığı bu dizine dağıtma sorunu, tek tek uygulamaların birbirinden yalıtılması için mimariyi bozmasıdır. Üste | İlk örneğinizde sorun değil, ancak üçüncü taraf bir uygulama dağıtmak istiyorsanız (örneğin belirli bir içeriği işlemek için Portlet kullanan bir uygulamayı çalıştırıyorsanız), sürüm bağımlılığı sorunlarına anında erişirsiniz - bir kitaplığın paylaşılan sürümünüz Üçüncü taraf uygulaması için doğru olmayacak, ancak paket zaten yüklendiğinden, sağ ve ortada istisnalar atacaksınız.

+0

Ben "zincir kadar" çalıştı ancak düşündüm? Ayrıca bağlantı bir çeşit ödemeli doktora mı? – rogerdpack

+0

Yönlendirmekte olduğunuz belge silinir. Bağlantıyı güncelleyebilir veya kaldırabilir misiniz (Tomcat mimarisine genel bakış)? – naXa

+0

@ steve-ash ve Tomcat 8 ve Tomcat 9'da çözünürlük sırasına ne dersiniz? Tomcat 7'deki ile aynı mı? – naXa

28

Kavanoz dosyalarını paylaşılan klasöre yerleştirmenizi önermem. Örneğin, gelecekte WEB-INF klasöründe bir kavanoz dosyasının daha yeni bir sürümüne sahip olan üçüncü taraf bir uygulamayı dağıtmak için ihtiyacınız olduğunu varsayalım. Bu uygulama için kavanozun sınıfları (aynı ada sahip olsalar bile) iki kez, biri paylaşılan klasörden ve bir tanesi web uygulama klasöründen yüklenecektir. Bu durum hataların bulunması çok zor olabilir.

Kavanoz dosyaları web uygulama klasörlerinde bulunuyorsa, bunlar ayrı sınıf yükleyicileri tarafından yüklenir ve birbirleriyle etkileşime girmezler.

+0

Oldukça katılıyorum. Kütüphaneleri commons dizinine yerleştirmek tehlikeli olabilir ve yalnızca hangi webapps'in dağıtılabileceğini kontrol edebilmeniz ve her webapp için kullanılan kütüphanelerin sürümünün ne olduğu ... kullanılmalıdır. – romaintaz

+0

İki kez yüklenmeye devam edebilir misiniz? Paylaşılanlar WEB-INF klasöründekileri "geçersiz kılar" mı? – rogerdpack

+0

Bu durumu "tanımlanmamış" olarak ele almak daha iyidir. Aynı sınıfın, her biri farklı bir sınıf yükleyici tarafından yüklenmiş iki örneğiniz olur. Bu genellikle problemler anlamına gelir. – kgiannakakis

5

tomcat6 kullanıyoruz ve tüm webapps'larımızın gereksinim duyduğu ortak kitaplıklarla tomcat doldurmak için iyi bir yol bulmak.

Düzenleme conf/catalina.özellikleri girişi common.loader. Örneğin. Orada 'mylibs'

common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar, 
       ${catalina.home}/lib,${catalina.home}/lib/*.jar, 
       {catalina.home}/mylibs/*.jar 

Sonra koymak tüm ortak kitaplıkları paylaşmak ister kavanoz ile ek klasör ekleyin. Bitti.

Neden WEB-INF/lib yerine tüm webapps'lerde (WAR dosyaları) mylibs klasörünü kullanmaya başladık?

SAVAŞ 50 MB hattını geçtikten sonra dağıtım bir kabus olmaya başladı! Bir asla kavanoz sürümü ile bir webapp sahip olduğunda

hala mylibs ne var üzerine yazmak lib WEB-INF/ içine koyabilirsiniz.

1

Eğer kütüphaneler iki defa yük içine koymak istemiyorsanız:

  • Tomcat 6: $CATALINA_HOME/lib
  • Tomcat 5: $CATALINA_HOME/common/lib

(soru çıkarılır ve burada kopyalanan bu yüzden oylanabilir/yorum yapılabilir)

+1

Ayrıca kendi özel dizini ortak sınıf yükleyicisine eklemek için catalina.properties'i de özelleştirebilirsiniz. Bu, Tomcat kavanozlarını uygulamalarınızın ihtiyaç duyduğu kavanozlarla ayırmaya yardımcı olur. – JustinKSU

+1

Bunu tavsiye etmem - özel dosyalarınızı stok dosyalarıyla birlikte karıştırmamalısınız, çünkü ileride birileri yeni geldiğinde hangisinin sizin olduğunu anlamayacaksınız. –

0

PermGen Yığın alanı Java'da sınıflar hakkında sınıflar ve Meta verileri.

Hata java.lang.OutOfMemoryError: Biz ayrıntılarda bu konuda herkes pay