Boa tarde,
Estou com uma aplicação antiga, Java 1.4 com EJB 2.1, Struts 1 e iBatis 2. Por questões de problemas com licenciamento, estamos efetuando testes para migrar de servidor de aplicação, para um open source.
Inicialmente, efetuei a migração para o JBoss 5, e tivemos sucesso.
Porém, por determinações superiores, tenho que migrar a aplicação para o Tomcat + OpenEJB. Já utilizei o Tomcat antes (nunca com OpenEJB), porém somente para aplicações mais triviais (usando Spring, JSF, por exemplo). E, agora, para migrar esta aplicação, estou deparando com uma série de adversidades.
A aplicação está empacotada em um EAR (são vários módulos WAR - mais de 100, e diversos EJBs empacotados em JARs) e, dentro da mesma, há um módulo ROOT.war que deve ser carregado por padrão (quando o usuário acessar localhost:8080, por exemplo). Eu já fiz a configuração do contexto deixando o path vazio, o que espero que funcione, porém, antes de conseguir testar já me deparei com outro problema: configurar o datasource!
Encontrei vários tutoriais no Google, porém, não estou tendo sucesso. Eu tentei três abordagens diferentes:
1. Colocar a definição do <Resource> no TOMCAT_HOME\conf\server.xml, como no exemplo abaixo (a única alteração que fiz no arquivo):
<Host>
...
<Context path="" docBase="nome-projeto" debug="0" reloadable="true">
<Resource name="NomeDS" auth="Container"
type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="user" password="pass"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="string.conexao.oracle" />
</Context>
</Host>
2. Colocar a mesma definição do Resource no arquivo TOMCAT_HOME\conf\context.xml:
<Context>
<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
<!-- Uncomment this to enable Comet connection tacking (provides events
on session expiration as well as webapp lifecycle) -->
<!--
<Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
-->
<Resource name="NomeDS" auth="Container"
type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="user" password="pass"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="string.conexao.oracle" />
</Context>
3. Criar um arquivo context.xml dentro do META-INF do meu EAR, com o mesmo conteúdo da solução 2, e editar todos os meus arquivos web.xml (inicialmente estou testando apenas com um módulo web, claro) para colocar a referência ao resource, da seguinte forma:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/NomeDS</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<!-- Definição servlets -->
...
</web-app>
No código, há um ServiceLocator invocado sempre que é necessária uma chamada/referência ao Datasource. Para carregar o datasource, é utilizado o código:
Context context = new InitialContext();
DataSource ds = (DataSource) context.lookup("java:comp/env/jdbc/NomeDS");
Em todas as abordagens, ao iniciar o Tomcat (estou inicializando por linha de comando), recebo o erro abaixo:
javax.naming.NameNotFoundException: Name comp is not bound in this Context
Todos os tutoriais que encontrei até agora recomendam sempre uma das abordagens que testei, e que não consigo fazer funcionar. Após consultar aqui no fórum, vi que o pessoal estava chamando o contexto da seguinte forma:
Context context = new InitialContext();
Context envContext = (Context)context.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/NomeDS");
Apesar de inicialmente não ter entendido a diferença téorica entre as opções, alterei o ServiceLocator para ficar como acima, e também não tive sucesso. Permanece o mesmo erro na inicialização do Tomcat. Apaguei tudo, instalei o Tomcat de novo (para garantir que não há nenhum teste de configuração esquecido que esteja atrapalhando), removi o arquivo context.xml do META-INF do EAR e repeti o processo conforme descrito num outro tópico aqui no GUJ
http://www.guj.com.br/java/199168-datasource-da-aplicacao-java-no-tomcat
E continuo com o mesmo erro: Name comp is not bound in this Context. Tentei também o tutorial deste link, sempre com o mesmo erro.
http://numberformat.wordpress.com/tag/tomcat-6-mysql-datasource/
Eu entenderia este erro se tivesse esquecido de colocar “java:” nos fontes, mas, já utilizei a busca do Eclipse em todos os fontes do projeto (incluindo nos fontes empacotados em JARs nossos), e em nenhum lugar deixei de escrever “java:/comp/env” (pois é, tem código repetido na aplicação ¬¬’ Já tem um chamado aberto para corrigir isso, mas, até lá a gente se vira como dá). Alguém tem idéia do que possa ser?
Obrigada.
Obs: fiquei em dúvida sobre onde postar, visto que minha aplicação envolve EJBs, mas, postei nesta seção por ser um problema aparentemente relacionado à configuração do Tomcat. Caso não seja o apropriado, peço desculpas.