Skip to content


Tomcat Deployment Order

Olá pessoal,

Várias vezes precisei definir a ordem de deployment do Tomcat, mas nunca tinha dedicado um tempo para tentar resolver isso. Já fiz algumas pesquisas no Google, mas também não achei uma resposta, pois até a versão 6.0.14 do Tomcat, essa definição de ordenação de deployment não existia.
A minha necessidade (e que também é a de outras pessoas no mundo que procuram essa funcionalidade no Tomcat) é poder indicar que uma aplicação sempre deve ser iniciada antes de outras. Por exemplo, a primeira aplicação pode disponibilizar um webservice ou uma variável no contexto (compartilhado, ou seja, “crossContext”) e as demais podem se comunicar com a primeira no startup. Neste mesmo exemplo, a primeira aplicação é chamada de “infrastructure” e as demais “financeiro”, “rh” e etc. Quando o contexto “financeiro” inicia, ele tenta efetuar alguma comunicação com “infrastructure”, e por isso, se “infrastructure” ainda não iniciou, ocorre um erro na inicialização de “financeiro” e preciso efetuar um “reload” manual neste contexto.

No Windows nunca tivemos problemas, pois por coincidência a primeira letra do nome do contexto sempre é maior que “i” (de “infrastructure”), e parece que é carregado em ordem alfabética. Já no linux, percebo que depende muito do ambiente, pois às vezes funciona, e às vezes não.
Nesse último final de semana fiz download do código-fonte do Tomcat 6.0.14 e consegui achar a classe responsável por efetuar o deployment das aplicações. Alterei o código-fonte apenas para resolver o meu problema, não me preocupei em criar parametrizações para a ordem de deployment.
Caso você tenha o mesmo problema que eu tive durante alguns anos, edite o arquivo HostConfig.java do pacote org.apache.catalina.startup. Essa classe possui três métodos que são responsáveis por fazer o deployment das aplicações: deployDescriptors(…), deployWARs(…) e deployDirectories(…). Esses métodos são executados nessa mesma ordem. No meu caso, alterei apenas o deployDescriptors, que implanta os aplicativos que possuem um arquivo XML na pasta “./conf/Catalina/localhost/”.
Incluí o seguinte código para que o aplicativo “infrastructure” seja sempre o primeiro a ser carregado:

//coloca o contexto "infrastructure.xml" em primeiro lugar
for (int i = 0; i < files.length; i++) {
    if (files[i].equals("infrastructure.xml")) {
        if (i != 0) {
            String file0 = files[0];
            files[0] = files[i];
            files[i] = file0;
        }
        break;
    }
}

Compilei, gerei um JAR tomcat-6-openk-extension-1.0.0.jar e apaguei os arquivos HostConfig$DeployedApplication.class e HostConfig.class de catalina.jar, para que minhas classes sejam reconhecidas.

Pronto! Um problema que parecida não ter solução no Tomcat foi resolvido em 1 hora. E viva o open-source!

Posted in Java, Tomcat.

Tagged with , , .


One Response

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. Normandes Junior says

    Muito bom Thiago. Realmente está foi uma excelente “descoberta”!



Some HTML is OK

or, reply to this post via trackback.