VRaptor3 no weblogic

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
      • 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:

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:

  1. 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.
  2. 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.

Oi Rafael!

Valeu pela ajuda. Coloquei um log.warn caso o retorno seja null do getRealPath.

Da pra ele ler do lib sim. Pra isso voce precisa configurar o base packages no web.xml:

    <context-param>  
            <param-name>br.com.caelum.vraptor.packages</param-name>  
            <param-value>br.com.arm.logic</param-value>  
    </context-param>  

Ai ele carrega usando um esquema que não precisa do getRealPath, interno do Spring. Testa e ve se funciona?

Sensacional!
Nada como falar com os criadores da criatura :smiley:
Meu web.xml ficou assim:

<context-param> <param-name>br.com.caelum.vraptor.packages</param-name> <param-value>br.com.cvc.myapp.controller</param-value> </context-param>
Você vê algum motivo para o weblogic não retornar o “real path” de WEB-INF/classes que contenha os .class?
Usar esse parâmetro br.com.caelum.vraptor.packages foi um trade-off para o weblogic ou ele existe para isso mesmo?

Valeu mesmo Paulo!

Abs…

É bom saber disso. Tenho quatro aplicações com vraptor que atualmente rodam no OC4J 10g, e assim que a empresa fechar a licença para o Weblogic teremos um pouco de adrenalina.

Essa versão do Weblogic é a pós aquisição da Oracle? No caso é o Oracle Weblogic 11g?

O parametro br.com.caelum.vraptor.packages existe desde o inicio do vr3. Ele era usado para você especificar qual pacote o vr3 fará o scan de seus componentes. Desde a versão 3.1 isso não é mais necessário, pois o vr3 faz scan de tudo que está dentro do WEB-INF/classes. Você só precisa declarar isso se suas classes não estiverem dentro do WEB-INF/classes. Acho que é isso, o Paulo e o Lucas podem confirmar melhor.

Abraços

é isso mesmo

Exatamente, 11gR1.

Valeus!

oi Rafael!

Colocando o br.com.caelum.vraptor.packages ele deve conseguir ler tambem do WEB-INF classes, verifique! Mas ai ele so vai ler daquele pacote e “subpacotes”.

Tópico errado, desculpe!

Paulo ou Rafael, ve se conseguem me ajudar também:

Estou implantando minha aplicação no servidor WebLogic 10.3.5 e está ocorrendo o seguinte problema:

<Could not load user de
fined filter in web.xml: br.com.caelum.vraptor.VRaptor.
java.lang.VerifyError: JVMCFRE056 contagem do argumento de bytecode invokeinterface incorreta; class=br/com/caelum/vraptor/generated/StaticProjectBootstrap, met
hod=configure(Lbr/com/caelum/vraptor/ComponentRegistry;, pc=13
at java.lang.ClassLoader.defineClassImpl(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:295)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:154)
at weblogic.utils.classloaders.GenericClassLoader.defineClass(GenericClassLoader.java:343)
at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:302)

Estou utilizando a SDK 1.6 da IBM.

Se utilizao a jdk 1.6 da Oracle a aplicação funciona perfeitamente, porém com a SDK da IBM ocorre este erro.

vc usou o static scanner?

Sim Lucas, estou utilizando.

Não entendo porque no JDK 1.6 da Oracle funciona e quando utilizo o SDK 1.6 da IBM não funciona.

 <java classpathref="build.classpath"
         classname="br.com.caelum.vraptor.scan.VRaptorStaticScanning" fork="true">
     <arg value="${module-dir}/target/${project.name}/WEB-INF/web.xml" />
     <classpath refid="build.classpath" />
     <classpath path="${module-dir}/target/${project.name}/WEB-INF/classes" />
 </java>

vc tá gerando o scanning num SDK e rodando em outro?

Lucas,

Estou gerando o scanning do mesmo SDK que a aplicação está rodando.

Se vc fizer o deploy do mesmo war em um tomcat, ele funciona?

Lucas,

O problema ocorre por causa de conflito da biblioteca javassist do Vraptor e do hibernate-entitymanager.
Realizando a exclusão desta biblioteca no artefato do hibernate resolve o problema. Tenho que realizar agora testes na aplicação para ver se não teve nenhum impacto, pois com o JDK da Oracle não ocorria este problema e com SDK da IBM o problema estava ocorrendo.

		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-entitymanager
			</artifactId>
			<version>3.4.0.GA</version>
			<scope>compile</scope>
			<exclusions>


javassist
javassist


dever ser algo a ver com a ordem de carga dos jars… numa VM ele deve ter pego a certa primeiro e na outra não.

Com certeza Lucas.

Obrigado pela ajuda.

Problema resolvido.