VRaptor3 no weblogic

16 respostas
zinho
Estou a alguns (dois) dias tentando rodar uma aplicação web simples com VRaptor no Weblogic. De maneira resumida a aplicação consiste em:
- 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
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:

This method returns null if the servlet container is unable to translate the given virtual path to a real path.

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.

16 Respostas

Paulo_Silveira

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?

zinho

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…

G

É 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

Lucas_Cavalcanti

é isso mesmo

zinho

Exatamente, 11gR1.

Valeus!

Paulo_Silveira

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”.

ifbcqueiroz

Tópico errado, desculpe!

F

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.

Lucas_Cavalcanti

vc usou o static scanner?

F

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>
Lucas_Cavalcanti

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

F

Lucas,

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

Lucas_Cavalcanti

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

F

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


Lucas_Cavalcanti

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.

F

Com certeza Lucas.

Obrigado pela ajuda.

Problema resolvido.

Criado 10 de fevereiro de 2010
Ultima resposta 16 de abr. de 2013
Respostas 16
Participantes 6