VRaptor 3.4.0 - Mais de um projeto usando as mesmas libs

Boa Noite,

Pessoal, dei uma boa googleada, mas não achei nenhum material que resolvesse por completo uma questão que está comecando a me assombrar…

Tenho alguns projetos que usam o VRaptor, bem como as libs adicionais, Hibernate, Spring e toda aquela cacalhada de libs que são comuns entre vários projetos.

Cada vez que tenho que jogar o projeto no ambiente de produção, lá se vai aquele WAR enorme por causa de todas as libs que vão empacotadas junto.

Queria saber se não tem uma forma de deixar a grande maioria dessas libs (OU TODAS :twisted: ) que são comuns aos projetos desvinculadas do pacote .WAR

Exemplo:

  • Jogaria na pasta LIB do Tomcat, todo o pessoal do VRaptor, Hibernate, Spring, etc…
  • Meus projetos .war na pasta webapps (WARs teoricamente enxutos… em vez de 100MB teriam 60MB)

Claro que para trablhar no Eclipse sem erros de import eu iria estar adicionando nas configuracoes as Libs para ele entender…

Queria saber se alguem também passa por essa situação e já conseguio resolver isso…

Resolvi separar todas as libs aqui… jogando no tomcat e deixando o projeto sequinho… mas nao rola… o VRaptor nao sobe… nao acontece nada… :?

Alguma ideia???

Encontrei o seguinte link… mas nao sei se tem muito a ver com oque estou precisando…
Alguem poderia me informar se é por esse caminho tbm oq devo fazer…

https://groups.google.com/forum/?fromgroups#!topic/javasf/nuZsAa5Q6Tk

:wink:

Eu também costumo fazer isto. Colocar jars direto na lib do tomcat.

Entretanto nunca testei com VRaptor. Qual o problema?

vc pode tentar selecionar melhor as dependências, removendo o que não é muito usado…

o blank project do vraptor tem 15MB… se vc mudar de spring pra guice ele vai pra menos ainda… os outros 90 MB são jars que vc importou da sua aplicação, dá uma olhada se vc não está com jars que não usados pra nada.

se um jar é usado em vários projetos vc pode até colocar na lib do servidor, mas cuidado com conflitos de versões e com a atualização dessas libs

Valeu pela atenção pessoal,

Mas ainda assim, mesmo que eu enxugue o máximo meu projeto apenas com Libs realmente necessárias… MASSSS… tais libs são compartilhadas por 10, 20 projetos… todos rodando com VRaptor e demais libs…

Ainda assim… nao teria uma forma de evitar essa “repetição” de libs… ???

Pergunto isto pq tentei da forma simples, colocar todas as libs na pasta lib do TomCat e deixar os projetos sem nada… mas como o jar do vraptor nao esta na pasta lib do Projeto … ele nem sobe nada…

E ainda assim deixando só o jar do vraptor dentro dos projetos… ai ele comeca a reclamar do restante… nao entendendo que coloquei no lib do TOMCAT.

Alguma ideia p/ isso… ou isso de fato nao existe… e o negocio é cada projeto ter seu pack de libs … mesmo que isto seja meio que uma “repetição” de libs no servidor…

http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html

dá uma olhada nessa doc, aqui fala onde vc deve colocar os jars compartilhados…

só cuidado que o eclipse talvez sobrescreva essas configurações, vc deveria tentar com um servidor rodando fora do eclipse.

Beleza Lucas, vou dar uma analisada no material… e vou fazer os testes fora do Eclipse sim… podexá…

Vou meter no servidor em produção… :twisted:

Depois dou o feedback… por enquanto valeu camarada!

Então Rapaziada,

Li a documentacao sobre o ClassLoader mas não me iluminou muito sobre o problema que estou passando…

Porem tenho duas situações nas mãos e acredito que a solução esteja próxima.

:arrow: Na versão LOCAL, rodando na maquina a partir do Tomcat que tem dentro do Eclipse, deixei apenas a lib do VRaptor na pasta WEB-INF/lib, e as demais libs (Hibernate, Spring e etc… adicionei às libs do Tomcat nas configurações do servidor, aba CLASSPATH.

Com isto… o projeto sobe sem problemas, e todos os recursos funcionam OK.

:arrow: Na versão WEB, rodando num CentOS (Tomcat7x, jdk 1.6*), fiz o .WAR da app apenas com o vraptor-3.4.0.jar na pasta WEB-INF/lib, e as demais libs joguei na pasta lib da instalacao do TOMCAT.

Com isto… o projeto sobe… bunitinho também… todos os mapementos acontecem… as definicoes de rota… enfim… sobe sem problemas…

Mas ao tentar acessar a aplicação ele dá essa exception:

13:07:58,449  INFO [VRaptor             ] VRaptor 3.4.0 successfuly initialized
Jul 20, 2012 1:07:58 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory host-manager
Jul 20, 2012 1:07:58 PM org.apache.coyote.AbstractProtocolHandler start
INFO: Starting ProtocolHandler ["http-bio-/127.0.0.1-5344"]
Jul 20, 2012 1:07:58 PM org.apache.coyote.AbstractProtocolHandler start
INFO: Starting ProtocolHandler ["http-bio-/127.0.0.1-5343"]
Jul 20, 2012 1:07:58 PM org.apache.coyote.AbstractProtocolHandler start
INFO: Starting ProtocolHandler ["ajp-bio-/127.0.0.1-5342"]
Jul 20, 2012 1:07:58 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 9057 ms
java.lang.ArrayIndexOutOfBoundsException: -1
	at org.eclipse.jdt.internal.compiler.parser.Parser.consumeTypeParameters(Parser.java:7852)
	at org.eclipse.jdt.internal.compiler.parser.Parser.consumeRule(Parser.java:6454)
	at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:9368)
	at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:9605)
	at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:9562)
	at org.eclipse.jdt.internal.compiler.parser.Parser.dietParse(Parser.java:8155)
	at org.eclipse.jdt.internal.compiler.Compiler.internalBeginToCompile(Compiler.java:712)
	at org.eclipse.jdt.internal.compiler.Compiler.beginToCompile(Compiler.java:377)
	at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:422)
	at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:447)
	at org.apache.jasper.compiler.Compiler.compile(Compiler.java:374)
	at org.apache.jasper.compiler.Compiler.compile(Compiler.java:352)
	at org.apache.jasper.compiler.Compiler.compile(Compiler.java:339)
	at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:594)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:344)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at br.com.caelum.vraptor.core.DefaultStaticContentHandler.deferProcessingToContainer(DefaultStaticContentHandler.java:64)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:80)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:471)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
	at br.com.caelum.vraptor.view.DefaultPageResult.defaultView(DefaultPageResult.java:67)
	at br.com.caelum.vraptor.interceptor.ForwardToDefaultViewInterceptor.intercept(ForwardToDefaultViewInterceptor.java:60)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:85)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:48)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.virtuoso.prosaude.interceptors.NoCacheInterceptor.intercept(NoCacheInterceptor.java:44)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:662)

As libs todas estao lá… mas de alguma forma ele não deve estar entendendo…

Qual seria a diferenca real do Tomcat do Eclipse p/ Tomcat que está no servidor, sendo que os dois são a instalação padrão :roll:

A solução estaria no catalina.properties ??? mexendo algo nos trechos abaixo???

#
#
# List of comma-separated paths defining the contents of the "common" 
# classloader. Prefixes should be used to define what is the repository type.
# Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute.
# If left as blank,the JVM system loader will be used as Catalina's "common" 
# loader.
# Examples:
#     "foo": Add this folder as a class repository
#     "foo/*.jar": Add all the JARs of the specified folder as class 
#                  repositories
#     "foo/bar.jar": Add bar.jar as a class repository
common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar

#
# List of comma-separated paths defining the contents of the "server" 
# classloader. Prefixes should be used to define what is the repository type.
# Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute.
# If left as blank, the "common" loader will be used as Catalina's "server" 
# loader.
# Examples:
#     "foo": Add this folder as a class repository
#     "foo/*.jar": Add all the JARs of the specified folder as class 
#                  repositories
#     "foo/bar.jar": Add bar.jar as a class repository
server.loader=

#
# List of comma-separated paths defining the contents of the "shared" 
# classloader. Prefixes should be used to define what is the repository type.
# Path may be relative to the CATALINA_BASE path or absolute. If left as blank,
# the "common" loader will be used as Catalina's "shared" loader.
# Examples:
#     "foo": Add this folder as a class repository
#     "foo/*.jar": Add all the JARs of the specified folder as class 
#                  repositories
#     "foo/bar.jar": Add bar.jar as a class repository 
# Please note that for single jars, e.g. bar.jar, you need the URL form
# starting with file:.
shared.loader=

Att,

Att,

java.lang.ArrayIndexOutOfBoundsException: -1  
    at org.eclipse.jdt.internal.compiler.parser.Parser.consumeTypeParameters(Parser.java:7852)  
    at org.eclipse.jdt.internal.compiler.parser.Parser.consumeRule(Parser.java:6454)  
    at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:9368)  
    at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:9605)  
    at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:9562)  
    at org.eclipse.jdt.internal.compiler.parser.Parser.dietParse(Parser.java:8155)  
    at org.eclipse.jdt.internal.compiler.Compiler.internalBeginToCompile(Compiler.java:712)  
    at org.eclipse.jdt.internal.compiler.Compiler.beginToCompile(Compiler.java:377)  
    at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:422)  
    at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:447)  

tá dando erro em classes do eclipse… estranho isso. será que não foi algo a mais no war que vc está instalando no servidor?

Estou gerando o .WAR a partir do menu File -> Export -> WAR File :frowning:

[x] Optimize for a specific server runtime
(Apache Tomcat v7.0)

[ ] Export source files
[x] Overwrite existing file

Ai que ta o problema sera?

extrai o war (pode renomear pra .zip e fazer isso) e veja quais arquivos estão lá dentro… vê se foram arquivos a mais que não deveriam estar lá

Entao Lucas,

Desde o início estou fazendo isto até p/ me certificar se está indo tudo certo com as libs… e nao tem nada a mais nem a menos… :?

Também desconfiei que ao empacotar ele poderia estar colocando algo proprietario no meio… mas não…

A impressão que tenho … é que meu ambiente na WEB não está carregando as libs da pasta LIB, algo meio dificil de acontecer já que a documenacao do Tomcat é bem clara e o ClassLoader passa de qualquer jeito no %CATALINA_HOME%\lib…

Eita sinuca de bico.

vc chegou a rodar um tomcat local por fora do eclipse com esse war?

Bom Pessoal,

Infelizmente depois de muitos testes não deu certo.

A ordem do ClassLoader do Tomcat é muito clara.

:arrow: Bootstrap classes of your JVM
:arrow: System class loader classes (described above)
:arrow: /WEB-INF/classes of your web application
:arrow: /WEB-INF/lib/*.jar of your web application
:arrow: Common class loader classes (described above)

Ou Seja, a pasta commom/lib do tomcat só é carregada após as webapps oque nao resolve o meu objetivo de deixar apenas uma colecao de jars p/ todos os webapps que tenho.

E tentando alterar o catalina.sh tbm não deu muito certo, tao pouco o catalina.properties

Algumas pessoas conseguiram implementar uma forma diferente do ClassLoader, isso alterando os fontes do Tomcat, oque não estou nem um pouco interessado em fazer agora.

Vou dar continidade a estes estudos mais tarde, talvez com o JBoss que é um AS, fazendo assim com que ele carregue essas libs antes do Container de Servlet dele, deixando assim essas libs disponiveis.

Bom era isso… Obrigado a todos pela ajuda, mas dessa vez … (por enquanto) … nao deu certo.

guivirtuoso, o melhor teste seria vc pegar o ZIP do Tomcat do jeito que veio do site e descompactar, mover as libs para a pasta LIB do tomcat e fazer o deploy do .war sem as libs.

PS: já deixei de usar disketes de 1,2MB eu não fico preocupado com essa “diferença” de 60MB para 100MB em um .war, inté…

guivirtuoso,
Estou passando pela mesma necessidade e mesmos problemas.
Conseguiu descobrir uma solução?