Estou a alguns (dois) dias tentando rodar uma aplicação web simples com VRaptor no Weblogic.
De maneira resumida a aplicação consiste em:
[code]
- Myapp.ear
- myapp.ejb
- meus (dãh) ejbs. (Não são importantes neste contexto)
- myapp.war
- src/main/java
- controller
- JobsController.java
- controller
- src/main/webapp
- css
- js
- jsp
- jobs
- list.jsp[/code]
Debugando o código do VRaptor, na classe br.com.caelum.vraptor.config.BasicConfiguration, método getWebinfClassesDirectory encontrei o seguinte código:
- list.jsp[/code]
- jobs
- src/main/java
- myapp.ejb
servletContext.getRealPath("/WEB-INF/classes/") e é aí que começou o problema.
Primeiro, por default, o weblogic retorna null pra qualquer chamada a servletContext.getRealPath. É preciso habilitar no console ou
incluir no weblogic.xml o trecho:
<container-descriptor>
<show-archived-real-path-enabled>true</show-archived-real-path-enabled>
</container-descriptor>
Ok. Algumas horas perdidas mas beleza.
Segundo problema. O weblogic “explode” o ear em DUAS pastas, algo como:
1) WEBLOGIC_HOME\bea\user_projects\domains\my_domain\servers\AdminServer\tmp.appmergegen_1265752539359\myapp-ear
2) WEBLOGIC_HOME\bea\user_projects\domains\my_domain\servers\AdminServer\tmp_WL_user\myapp-ear
As duas pastas possuem os recursos (html, css, js, jsp, etc) do meu projeto web (contido dentro do ear) MAS, com uma ligeira diferença.
Na 2º não existem os “.class” dentro de /WEB-INF/classes enquanto que na 1º eles estão lá.
Adivinha qual caminho o weblogic retorna no servletContext.getRealPath? O segundo lógico.
Quando acesso a uri http://localhost:7001/myapp-web/jobs/list recebo um “Error 404–Not Found”.
Acredito que o que está acontecendo é que o VRaptor acaba não carregando meus Controllers pois não encontrou nenhuma classe com a anotação @Resource (na verdade não encontrou classe alguma =/).
Copiando manualmente os .class da pasta 1 pra pasta 2 e “restartando” a aplicação, bingo, a uri responde.
Tenho duas perguntas:
- Alguém aí já teve sucesso em rodar uma aplicação com VRaptor em cima do weblogic? A saber, a vesão que estou usando é o 11gR1.
- A api do ServetContext método getRealPath diz o seguinte:
Obviamente não tem como garantir que o container irá conseguir traduzir o “virtual path” em “real path”, mas levando em conta que “/WEB-INF/classes” é um padrão a ser seguido ele deve conseguir. No meu caso o Weblogic conseguiu mas, não tem nada lá dentro. Isso faz sentido pra alguém? Pra mim não muito mas é assim que ele funciona.
Outras pessoas já tiveram problemas com getRealPath + weblogic. Sei que parece ser uma peculiaridade do weblogic mas, levando em conta que ele está se comportando de acordo com a especificação (eu acho) não existiria uma forma melhor do VRaptor procurar pelas classes?
Se por exemplo meus controllers anotados com @Resource estiverem dentro de um .jar em /WEB-INF/lib essa estratégia com o getRealPath("/WEB-INF/classes") irá encontrá-los? Fiz um teste rápido aqui no weblogic e a resposta foi negativa.
Veja, não é uma crítica, mesmo porque não tenho uma alternativa para propor. Meu objetivo é conseguir rodar uma applicação desenvolvida com VRaptor
no weblogic.
