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!
Muito bom Thiago. Realmente está foi uma excelente “descoberta”!