Does Tomcat carregar o mesmo arquivo de biblioteca na memória duas vezes se eles estão em duas aplicações web?

StackOverflow https://stackoverflow.com/questions/267953

  •  06-07-2019
  •  | 
  •  

Pergunta

Eu tenho dois pedidos em pasta tomcat/webapps.

tomcat/webapps/App1
tomcat/webapps/App2

Ambos os aplicativos compartilham as mesmas bibliotecas. Que são armazenados por exemplo, em tomcat/webapps/App1/WEB-INF/lib.

são ambas as bibliotecas carregadas duas vezes na memória?

Devo colocar essas bibliotecas compartilhadas em tomcat/server/lib?

Foi útil?

Solução

Como você pode ver aqui , Tomcat cria uma classe-loader por webapp no ??seu servidor. Assim, se você tem WebApp1 e webapp2 que compartilham a mesma biblioteca, então esta biblioteca será de fato carregado duas vezes.

Você pode, eventualmente, colocar esta biblioteca no diretório comum (tomcat-dir / common / lib) se for compartilhado por todas webapps que são executados em seu servidor Tomcat.

Outras dicas

Eu não recomendo colocar os arquivos JAR na pasta compartilhada. Vamos dizer por exemplo que você precisa no futuro para implantar um aplicativo de terceiros, que tem uma versão mais recente de um arquivo jar na pasta WEB-INF. Para esta aplicação as classes do frasco será carregado duas vezes (mesmo que tenham os mesmos nomes), um da pasta compartilhada e um da pasta app web. Esta situação pode causar erros muito difícil de encontrar.

Se os arquivos jar estão nas pastas de aplicativos web, em seguida, eles são carregados por carregadores de classes separadas e não interferem uns com os outros.

A partir da experiência:. As duas web-apps estão totalmente isolados uns dos outros - as bibliotecas para não são utilizados em outro - assim para responder a sua pergunta inicial - sim, eles seriam carregados duas vezes

Para responder-lhe segunda questão, se você deve implantar essas bibliotecas em diretório compartilhado do Tomcat - Eu diria que não, e aqui está o porquê:

Se você implantar um frasco biblioteca para o local compartilhado (tomcat / server / lib), então essa versão da biblioteca torna-se o padrão para todas as aplicações web que funcionam sob essa instância do Tomcat. Como você pode ver a partir esta visão geral da arquitetura tomcat , a aula loader funciona "para baixo da cadeia", com lib de um web-app indivíduo pasta sendo o último lugar ele vai olhar antes que ele lança uma exceção de classe não encontrado. Isso não é verdade no Tomcat 6 e Tomcat 7: todas as classes nas aplicações web lib e aulas pasta irá ser resolvidos antes que aqueles em comum, e, portanto, isso não vai quebrar outros aplicativos que implantar todo o seu frascos na guerra 2 .

O problema, portanto, de implantação de uma biblioteca compartilhada para esse diretório é que ele quebra a arquitetura para aplicações individuais sendo isoladas de um outro. Belas no seu exemplo inicial, mas se você deseja implantar um aplicativo de terceiros (por exemplo, se a execução de um aplicativo que consome Portlet de lidar com conteúdo específico), você instantaneamente correr em problemas de dependência de versão - a sua versão compartilhada de uma biblioteca pode não ser correto para o aplicativo de terceiros, mas porque o pacote já estiver carregado, você vai lançar exceções à esquerda à direita e do centro.

Estamos usando tomcat6 e encontrar uma boa maneira de ter tomcat recheado com bibliotecas comuns a todos os nossos webapps precisa.

Editar em conf / catalina.properties a entrada common.loader . Por exemplo. anexar uma pasta adicional com frascos você gostaria de compartilhar 'mylibs'

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

Em seguida, coloque todas as bibliotecas comuns lá. Feito.

Por que nós começar a usar um mylibs pasta em vez do WEB-INF / lib em todos os webapps (arquivos WAR)?

Implantação começou a ser um pesadelo depois da guerra cruzou a linha de 50MB!

Ao ter um webapp com uma versão não jar você ainda pode colocá-lo em WEB-INF / lib para substituir o que você tem em mylibs .

Se você não quer que as suas bibliotecas para carregar duas vezes colocá-los em:

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

(retirado da pergunta e copiado aqui para que ele possa ser votado / comentou sobre)

PermGen espaço de pilha é usado para aulas de loja e Meta dados sobre classes em Java.

Erro java.lang.OutOfMemoryError: PermGen espaço pode ocorrido com freqüência porque somos lotes de carregamento de biblioteca duplicado em apache tomcat Alguém pode compartilhar sobre isso em detalhes

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top