advertisement

JBossClassLoader

67 %
33 %
advertisement
Information about JBossClassLoader
Technology

Published on November 10, 2008

Author: rafaelcba

Source: slideshare.net

Description

Breve introdução ao modelo de class loader do JBoss AS.
advertisement

JBoss Class Loader Overview do modelo de Class Loader no JBoss AS

Java Class Loader Tipo x Classe Class Type : Nome totalmente qualificado da classe Ex: com.mycompany.MyClass Class : formado pelo class type e pelo class loader responsável por carregar ( byte code ) e definir o tipo. Enfim uma instância de java.lang.class – byte code carregado JavaDoc : " Every Class object contains a reference to the ClassLoader that defined it." ® Rafael Torres 2008

Tipo x Classe

Class Type : Nome totalmente qualificado da classe

Ex: com.mycompany.MyClass

Class : formado pelo class type e pelo class loader responsável por carregar ( byte code ) e definir o tipo.

Enfim uma instância de java.lang.class – byte code carregado

JavaDoc : " Every Class object contains a reference to the ClassLoader that defined it."

Java Class Loader Regra geral segundo o JavaDoc da API: Sempre que uma classe/recurso for requisita, uma instância de Class Loader irá delegar a busca primeiro para o Class Loader pai. Somente se o pai não puder carregar a classe, a instância do class loader em questão deve carregar. Exceção a regra : em alguns casos é necessário reduzir o escopo de uma determinada classe/recurso. Neste caso o próprio class loader solicitado carrega a classe. Este é o caso dos servlet containers e dos EJB containers . Nesta situação um class loader pode ter apenas uma única representação de um tipo carregada. Isso significa, por exemplo, que você só pode ter um único class type com.mycompany.MyClass em um mesmo class loader. ® Rafael Torres 2008

Regra geral segundo o JavaDoc da API: Sempre que uma classe/recurso for requisita, uma instância de Class Loader irá delegar a busca primeiro para o Class Loader pai. Somente se o pai não puder carregar a classe, a instância do class loader em questão deve carregar.

Exceção a regra : em alguns casos é necessário reduzir o escopo de uma determinada classe/recurso. Neste caso o próprio class loader solicitado carrega a classe.

Este é o caso dos servlet containers e dos EJB containers .

Nesta situação um class loader pode ter apenas uma única representação de um tipo carregada. Isso significa, por exemplo, que você só pode ter um único class type com.mycompany.MyClass em um mesmo class loader.

Java Class Loader Para mais detalhes sobre o funcionamento e modelo do Class Loader Java consulte: Dynamic Class Loading in the Java™ virtual Machine: http://www.cs.purdue.edu/homes/jv/smc/pubs/liang-oopsla98.pdf (Esse é das raízes mesmo...  ) Understanding the Java Classloading Mechanism http://java.sys-con.com/node/37659/print ® Rafael Torres 2008

Para mais detalhes sobre o funcionamento e modelo do Class Loader Java consulte:

Dynamic Class Loading in the Java™ virtual Machine: http://www.cs.purdue.edu/homes/jv/smc/pubs/liang-oopsla98.pdf (Esse é das raízes mesmo...  )

Understanding the Java Classloading Mechanism

http://java.sys-con.com/node/37659/print

Class loader no JBoss AS Unifield Class Loader O Componente central deste modelo é o: org.jboss.mx.loading.UnifiedClassLoader3 (UCL) Esse cara estende a classe java.net.URLClassLoader do Java e sobrescreve o comportamento padrão do modelo "parent delegation" : JavaDoc API: " The ClassLoader class uses a delegation model to search for classes and resources. Each instance of ClassLoader has an associated parent class loader " Usa um repositório compartilhado de classes e recursos: org.jboss.mx.loading.UnifiedLoaderRepository3 (ULR) Neste modelo cada UCL é associado à um único UnifieldLoaderRepository3 , e um ULR por sua vez tem vários UCLs associados. Um UCL pode ter várias URLs (endereços de classes/jars/libs) associadas a ele para o carregamento ( loading ) de classes e recursos. ® Rafael Torres 2008

O Componente central deste modelo é o: org.jboss.mx.loading.UnifiedClassLoader3 (UCL)

Esse cara estende a classe java.net.URLClassLoader do Java e sobrescreve o comportamento padrão do modelo "parent delegation" :

JavaDoc API: " The ClassLoader class uses a delegation model to search for classes and resources. Each instance of ClassLoader has an associated parent class loader "

Usa um repositório compartilhado de classes e recursos:

org.jboss.mx.loading.UnifiedLoaderRepository3 (ULR)

Neste modelo cada UCL é associado à um único UnifieldLoaderRepository3 , e um ULR por sua vez tem vários UCLs associados.

Um UCL pode ter várias URLs (endereços de classes/jars/libs) associadas a ele para o carregamento ( loading ) de classes e recursos.

Unifield Class loader Deployers usam o UCL de nível mais alto como um class loader compartilhado e então todos os pacotes de deploy (WAR, SAR, EAR, HAR, etc) são associados a este class loader. Quando um UCL é solicitado para carregar uma classe ele: Verifica no repositório ( UnifieldLoaderRepository3 ) com o qual ele está associado se a classe já foi carregada. O UCL carregará a classe apenas se ela ainda não existir no repositório. Por padrão existe apenas 1 repositório (ULR) compartilhado para todas as instâncias de UCLs. Isto significa que as instâncias de UCLs formam um único espaço de nomes para o class loader. ® Rafael Torres 2008

Deployers usam o UCL de nível mais alto como um class loader compartilhado e então todos os pacotes de deploy (WAR, SAR, EAR, HAR, etc) são associados a este class loader.

Quando um UCL é solicitado para carregar uma classe ele:

Verifica no repositório ( UnifieldLoaderRepository3 ) com o qual ele está associado se a classe já foi carregada.

O UCL carregará a classe apenas se ela ainda não existir no repositório.

Por padrão existe apenas 1 repositório (ULR) compartilhado para todas as instâncias de UCLs.

Isto significa que as instâncias de UCLs formam um único espaço de nomes para o class loader.

Esquema de Class Loader no JBoss AS Veja o diagrama não muito didático... Jboss AS Guide – ch 2 [1] ® Rafael Torres 2008

Veja o diagrama não muito didático...

Sequência de carregamento de classes e recursos A seguinte seqüência de passos ocorre quando o método UnfiedClassLoader3.loadClass(String, boolean) é invocado: 1. Verifica se a classe já foi carregada antes Cache: contém classe que já foram carregadas por uma instância do UCL abc.class xyz.class Arq.properties ... URLs: locais onde as classes, pacotes estão armazenados: direório deploy, lib, etc 2. Procura a classe nos URLClassLoaders ou se está visível em um class loader pai. 2.1 Se a classe foi encontra, é colocada no cache (ULR) e retornada para uso... Jboss AS Guide – ch 2 [1] 2.2 próximo slide... ® Rafael Torres 2008

A seguinte seqüência de passos ocorre quando o método UnfiedClassLoader3.loadClass(String, boolean) é invocado:

Sequência de carregamento de classes e recursos... "2.2 Caso contrário – a classe não foi encontrada nas URLs associadas aos UCLs – O repositório cache (ULR) é consultado para todos os UCLs que sejam capazes de fornecer a classe com base no mapeamento de nome de pacotes/UCL. Quando um UCL é adicionado (associado) ao repositório cache (repositório ULR3 – que é único) é estabelecida uma associação entre os nomes de pacotes disponíveis nas URLs associadas ao UCL em questão. Isso permite determinar qual UCL é capaz de carregar uma determinada classe. Os UCLs são consultados sobre a classe requisitada na ordem em que os UCLs foram adicionados ao repositório (ULR3). Nesta busca, se algum UCL for capaz de carregar a classe, ela é retornada, caso contrário um java.lang.ClassNotFoundException é lançado." [1] ® Rafael Torres 2008 Jboss AS Guide – ch 2 [1]

"2.2 Caso contrário – a classe não foi encontrada nas URLs associadas aos UCLs – O repositório cache (ULR) é consultado para todos os UCLs que sejam capazes de fornecer a classe com base no mapeamento de nome de pacotes/UCL.

Quando um UCL é adicionado (associado) ao repositório cache (repositório ULR3 – que é único) é estabelecida uma associação entre os nomes de pacotes disponíveis nas URLs associadas ao UCL em questão.

Isso permite determinar qual UCL é capaz de carregar uma determinada classe.

Os UCLs são consultados sobre a classe requisitada na ordem em que os UCLs foram adicionados ao repositório (ULR3).

Nesta busca, se algum UCL for capaz de carregar a classe, ela é retornada, caso contrário um

java.lang.ClassNotFoundException é lançado." [1]

C lass loading no JBoss AS... ® Rafael Torres 2008 JBossClassLoadingUseCases (wiki.jboss.org) [2]

Descrição mais detalhada: wiki.jboss.org... JBossClassLoadingUseCases : https://www.jboss.org/community/docs/DOC-10290 ® Rafael Torres 2008

JBossClassLoadingUseCases :

https://www.jboss.org/community/docs/DOC-10290

Aplicações WEB ® Rafael Torres 2008 Java™ Servlet Specification Version 2.3

Java™ Servlet Specification Version 2.3

Visibilidade entre class loaders no AS ® Rafael Torres 2008 JBoss in Action – Figura 3.3 [4]

Visibilidade entre class loaders no AS No diagrama anterior classes de um certo nível possuem acesso/visibilidade à classes do mesmo nível ou de um nível mais baixo, mas não o contrário. Para alterar este comportamento padrão (definido na Servltet spec 2.3) os seguintes atributos devem ser alterados: <!-- Get the flag indicating if the normal Java2 parent first class loading model should be used over the servlet 2.3 web container first model. --> <attribute name=&quot;Java2ClassLoadingCompliance&quot;>false</attribute> <!-- A flag indicating if the JBoss Loader should be used. This loader uses a unified class loader as the class loader rather than the tomcat specific class loader. The default is false to ensure that wars have isolated class loading for duplicate jars and jsp files. --> <attribute name=&quot;UseJBossWebLoader&quot;>false</attribute> O arquivo com essa config está em JBOSS_HOME/server/MyConfig/deploy/jboss-web.deployer/META-INF/jboss-service.xml ATENÇÃO: está alteração pode causar efeitos colaterais indesejáveis. Não haverá isolamento de class loader – suas classes ficarão visíveis como se estivesse em um único espaço compartilhado. ® Rafael Torres 2008

No diagrama anterior classes de um certo nível possuem acesso/visibilidade à classes do mesmo nível ou de um nível mais baixo, mas não o contrário.

Para alterar este comportamento padrão (definido na Servltet spec 2.3) os seguintes atributos devem ser alterados:

<!-- Get the flag indicating if the normal Java2 parent first class

loading model should be used over the servlet 2.3 web container first

model.

-->

<attribute name=&quot;Java2ClassLoadingCompliance&quot;>false</attribute>

<!-- A flag indicating if the JBoss Loader should be used. This loader

uses a unified class loader as the class loader rather than the tomcat

specific class loader.

The default is false to ensure that wars have isolated class loading

for duplicate jars and jsp files.

-->

<attribute name=&quot;UseJBossWebLoader&quot;>false</attribute>

O arquivo com essa config está em JBOSS_HOME/server/MyConfig/deploy/jboss-web.deployer/META-INF/jboss-service.xml

ATENÇÃO: está alteração pode causar efeitos colaterais indesejáveis. Não haverá isolamento de class loader – suas classes ficarão visíveis como se estivesse em um único espaço compartilhado.

java2ParentDelegation O default é true para aplicações JEE . Exceto para WEB Apps (Servlet spec. 2.3) java2ParentDelegation=false Força o JBoss usar a versão da classe localizada dentro do repositório isolado da APP (EAR, SAR, WAR, etc) – se houver mais de uma versão de classe carregada no repositório. Se a classe não puder ser carregada pelo UCL da APP, o JBoss busca em seu próprio UCL (server/xxx/lib, JBOSS_HOME/lib, etc). ® Rafael Torres 2008

O default é true para aplicações JEE . Exceto para WEB Apps (Servlet spec. 2.3)

java2ParentDelegation=false

Força o JBoss usar a versão da classe localizada dentro do repositório isolado da APP (EAR, SAR, WAR, etc) – se houver mais de uma versão de classe carregada no repositório.

Se a classe não puder ser carregada pelo UCL da APP, o JBoss busca em seu próprio UCL (server/xxx/lib, JBOSS_HOME/lib, etc).

Níveis de class loader No nível mais baixo estão as classes do classpath da JVM (rt.jar, tools.jar, etc) e as classes usadas na inicialização do AS encontradas no diretório JBOSS_HOME/lib . O próximo nível contém classes compartilhadas para as aplicações deployadas no AS em JBOSS_HOME/server/<server-config>/deploy e as bibliotecas disponíveis em JBOSS_HOME/server/<server-config>/lib . O nível mais alto representa classes contidas em um arquivo WAR , o qual pode estar contido dentro do diretório deploy ou dentro de um pacote EAR ou SAR. ® Rafael Torres 2008

No nível mais baixo estão as classes do classpath da JVM (rt.jar, tools.jar, etc) e as classes usadas na inicialização do AS encontradas no diretório JBOSS_HOME/lib .

O próximo nível contém classes compartilhadas para as aplicações deployadas no AS em JBOSS_HOME/server/<server-config>/deploy e as bibliotecas disponíveis em JBOSS_HOME/server/<server-config>/lib .

O nível mais alto representa classes contidas em um arquivo WAR , o qual pode estar contido dentro do diretório deploy ou dentro de um pacote EAR ou SAR.

Classes/Bibliotecas compartilhadas O esquema de class loader compartilhado no AS é conveniente quando se deseja compartilhar suas bibliotecas de classes com todas as aplicações. Se suas aplicações não puderem compartilhar bibliotecas de classes para evitar conflito entre versões, você precisará isolar o class loader da aplicação. Sem isolamento de class loader alguns problemas podem ser encontrados: ClassCastException, IllegalAccessErrors, VerifyErrors e Alguns comportamentos estranhos durantes novos deploys/redeploys/undeploy. Para isso é necessário utilizar o mecanismo de escopo de classes. ® Rafael Torres 2008

O esquema de class loader compartilhado no AS é conveniente quando se deseja compartilhar suas bibliotecas de classes com todas as aplicações.

Se suas aplicações não puderem compartilhar bibliotecas de classes para evitar conflito entre versões, você precisará isolar o class loader da aplicação.

Sem isolamento de class loader alguns problemas podem ser encontrados:

ClassCastException,

IllegalAccessErrors,

VerifyErrors e

Alguns comportamentos estranhos durantes novos deploys/redeploys/undeploy.

Para isso é necessário utilizar o mecanismo de escopo de classes.

J2ee Specification J2EE 1.4 Specification &quot;There must be only one version of each class in an application.&quot; &quot;All components in a single application may be loaded in a single class loader and share a single namespace. &quot; ® Rafael Torres 2008

J2EE 1.4 Specification

&quot;There must be only one version of each class in an application.&quot;

&quot;All components in a single application may be loaded in a single class loader and share a single namespace. &quot;

Scoping class Neste esquema você pode definir um class loader repository específico para sua APP – um repositório isolado. HierarchicalClassLoader3 É possível fazer isso definindo um class loader repository em um arquivo de configuração descritor específico para o JBoss AS. ® Rafael Torres 2008

Neste esquema você pode definir um class loader repository específico para sua APP – um repositório isolado.

HierarchicalClassLoader3

É possível fazer isso definindo um class loader repository em um arquivo de configuração descritor específico para o JBoss AS.

Scoping classes Em um arquivo SAR (META-INF/jboss-service.xml): Em um arquivo EAR (META-INF/jboss-app.xml): Em um arquivo WAR(WEB-INF/jboss-web.xml): <service> <loader-repository>jbia.loader:loader=Loader1</loader-repository> . . . </service> <jboss-app> <loader-repository>jbia.loader:loader=Loader2</loader-repository> . . . </jboss-app> <jboss-web> <class-loading> <loader-repository>jbia.loader:loader=Loader3</loader-repository> </class-loading> . . . </jboss-web> ® Rafael Torres 2008

Em um arquivo SAR (META-INF/jboss-service.xml):

Em um arquivo EAR (META-INF/jboss-app.xml):

Em um arquivo WAR(WEB-INF/jboss-web.xml):

Escopo de classes – HierarchicalLoaderRepository3 Visualizando o Class Loader isolado de uma Aplicação no JMX Console do JBoss. ® Rafael Torres 2008

Visualizando o Class Loader isolado de uma Aplicação no JMX Console do JBoss.

Alguns testes... Cenário 1: com.mycompany.mylibs.ClassA v1 (lib.jar) em App1.ear com.mycompany.mylibs.ClassA v2 (lib.jar) em server/default/lib displayClassInfo() JMX Mbean Operation: com.mycompany.mylibs.ClassA Information Not loaded in repository cache ### Instance0 found in UCL: org.jboss.mx.loading.UnifiedClassLoader3@18a49e0 { url=null , addedOrder=2 } ### Instance1 found in UCL: org.jboss.mx.loading.UnifiedClassLoader3@e8709d { url=file:/C:/java/tools/jbdevstudio/jboss-eap/jboss-as/server/default/deploy/App1.ear/ , addedOrder=38 } De qual UCL a classe será retornada? Observe a ordem em que o UCL foi associado ao repositório... 17:38:09,934 INFO [STDOUT] Eu sou a versao 2 da classe A 17:38:09,934 INFO [STDOUT] logA(): ContextClassLoader - org.jboss.mx.loading.UnifiedClassLoader3@e8709d{ url=file:/C:/java/tools/jbdevstudio/jboss-eap/jboss-as/server/default/deploy/App1.ear/ ,addedOrder=38} ® Rafael Torres 2008 A classe foi requisitada para o UCL do EAR ( addedOrder=38 ), mas quem retornou foi o UCL associado à URL server/default/lib ( addedOrder=2 )!

Cenário 1:

com.mycompany.mylibs.ClassA v1 (lib.jar) em App1.ear

com.mycompany.mylibs.ClassA v2 (lib.jar) em server/default/lib

displayClassInfo() JMX Mbean Operation:

De qual UCL a classe será retornada?

Observe a ordem em que o UCL foi associado ao repositório...

A classe foi requisitada para o UCL do EAR ( addedOrder=38 ), mas quem retornou foi o UCL associado à URL server/default/lib ( addedOrder=2 )!

Alguns testes... Cenário 2: com.mycompany.mylibs.ClassA v1 (lib.jar) em APP1.ear com.mycompany.mylibs.ClassA v2 (lib.jar) em server/default/lib Escopo de classe declarado com.mycompany.mylibs.ClassA Information Not loaded in repository cache ### Instance 0 found in UCL: org.jboss.mx.loading.UnifiedClassLoader3@16d2633{ url=null ,addedOrder=2} De qual UCL a classe será retornada? Observe a ordem em que o UCL foi associado ao repositório... 10:42:23,635 INFO [STDOUT] logA(): Eu sou a versao 1 da classe A 10:42:23,636 INFO [STDOUT] logA(): ContextClassLoader - org.jboss.mx.loading.UnifiedClassLoader3@557d7e{ url=file:/C:/java/tools/jbdevstudio/jboss-eap/jboss-as/server/default/deploy/App1.ear/ ,addedOrder=36} displayClassInfo() JMX Mbean Operation: <jboss-app> <loader-repository> EJBTest.loader:loader=Loader1 </loader-repository> </jboss-app> ® Rafael Torres 2008 Observe que agora a classe aparece apenas no UCL do AS, pois foi encontrada em server/xxx/lib.

Cenário 2:

com.mycompany.mylibs.ClassA v1 (lib.jar) em APP1.ear

com.mycompany.mylibs.ClassA v2 (lib.jar) em server/default/lib

Escopo de classe declarado

De qual UCL a classe será retornada?

Observe a ordem em que o UCL foi associado ao repositório...

displayClassInfo() JMX Mbean Operation:

Alguns testes... Cenário 3: com.mycompany.mylibs.ClassA v1 (lib.jar) removido de APP1.ear com.mycompany.mylibs.ClassA v2 (lib.jar) em server/default/lib Escopo de classe declarado java2ParentDelegation desligado! com.mycompany.mylibs.ClassA Information Not loaded in repository cache ### Instance 0 found in UCL: org.jboss.mx.loading.UnifiedClassLoader3@16d2633{ url=null ,addedOrder=2} De qual UCL a classe será retornada? Observe a ordem em que o UCL foi associado ao repositório... 10:58:49,844 INFO [STDOUT] Eu sou a versao 2 da classe A 10:58:49,844 INFO [STDOUT] logA(): ContextClassLoader - org.jboss.mx.loading.UnifiedClassLoader3@348ab2{ url=file:/C:/java/tools/jbdevstudio/jboss-eap/jboss-as/server/default/deploy/App1.ear/ ,addedOrder=36} displayClassInfo() JMX Mbean Operation: <jboss-app> <loader-repository> EJBTest.loader:loader=Loader1 <loader-repository-config>java2ParentDelegation=false</loader-repository-config> </loader-repository> </jboss-app> ® Rafael Torres 2008 No Loader1 (escopo de classe) a classe A não foi carregada! Foi removida de dentro do EAR. O objetivo é verificar se o JBoss encontrará a classe no UCL pai (do AS: server/xxx/lib).

Cenário 3:

com.mycompany.mylibs.ClassA v1 (lib.jar) removido de APP1.ear

com.mycompany.mylibs.ClassA v2 (lib.jar) em server/default/lib

Escopo de classe declarado

java2ParentDelegation desligado!

De qual UCL a classe será retornada?

Observe a ordem em que o UCL foi associado ao repositório...

displayClassInfo() JMX Mbean Operation:

Alguns testes... Cenário 4: 2 EARs (App1 e APP2) com.mycompany.mylibs.ClassA v1 (lib.jar) removido de App1.ear App1.ear com escopo de classe! com.mycompany.mylibs.ClassA v2 (lib.jar) em App2.ear App2.ear sem escopo de classe. displayClassInfo() JMX Mbean Operation : com.mycompany.mylibs.ClassA Information Not loaded in repository cache De qual UCL a classe será retornada? Observe a ordem em que o UCL foi associado ao repositório... 13:13:41,961 INFO [STDOUT] logA(): Eu sou a versao 1 da classe A 13:13:41,962 INFO [STDOUT] logA(): ContextClassLoader - org.jboss.mx.loading.UnifiedClassLoader3@6196fc{ url=file:/C:/java/tools/jbdevstudio/jboss-eap/jboss-as/server/default/deploy/App1.ear/ ,addedOrder=36} antes de invocar o EJB de APP1.ear : com.mycompany.mylibs.ClassA Information Repository cache version: com.mycompany.mylibs.ClassA(1bb6976). ClassLoader=org.jboss.mx.loading.UnifiedClassLoader3@efae3b{ url=file:/C:/java/tools/jbdevstudio/jboss-eap/jboss-as/server/default/deploy/App2.ear/ ,addedOrder=37 } depois de invocar o EJB de APP1.ear : ® Rafael Torres 2008 Neste cenário apenas App2.ear contem a ClasseA v2. Chamaremos o EJB de App1 que não possui/carrega ClasseA. O UCL solicitado foi o de App1.ear, porém que retornou ClasseA foi o UCL de App2.ear Podemos concluir com isso que mesmo empacotando duas APPs em EAR separados as classes são compartilhadas em um mesmo espaço no AS. A menos que se isole o ClassLoader das duas Apps. Nesse caso este último teste retornaria ClassNotfoundException.

Cenário 4:

2 EARs (App1 e APP2)

com.mycompany.mylibs.ClassA v1 (lib.jar) removido de App1.ear

App1.ear com escopo de classe!

com.mycompany.mylibs.ClassA v2 (lib.jar) em App2.ear

App2.ear sem escopo de classe.

displayClassInfo() JMX Mbean Operation :

De qual UCL a classe será retornada?

Observe a ordem em que o UCL foi associado ao repositório...

antes de invocar o EJB de APP1.ear :

depois de invocar o EJB de APP1.ear :

Alguns testes... Cenário 5 - o mais complexo 2 EARs (App1 e APP2) ambos com EJBs Statless Session Bean Interface remota/local em EJBTestClient.jar: sever/default/deploy/EJBTestClient.jar - class loader compartilhado... com.mycompany.mylibs.ClassA (lib.jar) no class path do EAR: App1.ear/lib/lib.jar App2.ear/lib/lib.jar Ambos com escopo de classe duas opções: alterar ear-deployer.xml: atrbuto Isolated true definir o class loader em jboss-app.xml como visto anteriormente Dois comportamentos distintos e estranhos Chamada remota (call-by-value) com o ônus da serialização Chamada local (call-by-reference) na mesma JVM ® Rafael Torres 2008

Cenário 5 - o mais complexo

2 EARs (App1 e APP2) ambos com EJBs Statless Session Bean

Interface remota/local em EJBTestClient.jar:

sever/default/deploy/EJBTestClient.jar - class loader compartilhado...

com.mycompany.mylibs.ClassA (lib.jar) no class path do EAR:

App1.ear/lib/lib.jar

App2.ear/lib/lib.jar

Ambos com escopo de classe

duas opções:

alterar ear-deployer.xml: atrbuto Isolated true

definir o class loader em jboss-app.xml como visto anteriormente

Dois comportamentos distintos e estranhos

Chamada remota (call-by-value) com o ônus da serialização

Chamada local (call-by-reference) na mesma JVM

Call-by-value X Call-by-reference no JBoss Naming Service: server/default/conf/jboss-service.xml ... <mbean code=&quot;org.jboss.naming.NamingService&quot; name=&quot;jboss:service=Naming&quot; xmbean-dd=&quot;resource:xmdesc/NamingService-xmbean.xml&quot;> <!-- The call by value mode. true if all lookups are unmarshalled using the caller's TCL, false if in VM lookups return the value by reference. --> <attribute name=&quot;CallByValue&quot;>false</attribute> EAR Deployer Service: server/default/deploy/ear-deployer.xml <!-- EAR deployer, remove if you are not using ear deployments --> <mbean code=&quot;org.jboss.deployment.EARDeployer&quot; name=&quot;jboss.j2ee:service=EARDeployer&quot;> <!-- A flag indicating if ear deployments should have their own scoped class loader to isolate their classes from other deployments. --> <attribute name=&quot;Isolated&quot;>false</attribute> <!-- A flag indicating if the ear components should have in VM call optimization disabled. --> <attribute name=&quot;CallByValue&quot;>false</attribute> ® Rafael Torres 2008

Naming Service: server/default/conf/jboss-service.xml

EAR Deployer Service: server/default/deploy/ear-deployer.xml

No JBoss... Cenário 5 com a configuração padrão do JBoss: Chamada remota ERROR [STDERR] java.lang.ClassCastException: $Proxy65... O JBoss tenta otimizar os lookups feitos dentro da mesma VM: call-by-reference Workaround : alterar Call-By-Value true em Naming Service (conf/jboss-service.xml) Isso faz com que todo lookup seja serializado (call-by-value) Após alteração: Tudo funciona! ® Rafael Torres 2008

Cenário 5 com a configuração padrão do JBoss:

Chamada remota

ERROR [STDERR] java.lang.ClassCastException: $Proxy65...

O JBoss tenta otimizar os lookups feitos dentro da mesma VM: call-by-reference

Workaround :

alterar Call-By-Value true em Naming Service (conf/jboss-service.xml)

Isso faz com que todo lookup seja serializado (call-by-value)

Após alteração:

Tudo funciona!

No JBoss... ® Rafael Torres 2008

Leitura recomendada: Dynamic Class Loading in the Java™ virtual Machine http://www.cs.purdue.edu/homes/jv/smc/pubs/liang-oopsla98.pdf Understanding the Java Classloading Mechanism http://java.sys-con.com/node/37659/print Java SE 6 API http://java.sun.com/javase/6/docs/api/java/lang/ClassLoader.html Classloading e o porquê você deveria ao menos saber como isso funciona http://nullability.org/?p=95 Classloader hell http://www.kumpera.net/blog/index.php/2007/05/09/classloader-hell/ JBossClassLoadingUseCases : https://www.jboss.org/community/docs/DOC-10290 ClassLoadingConfiguration http://www.jboss.org/community/docs/DOC-9288 Class loaders e aplicações isoladas no JBoss http://www.mouseoverstudio.com/blog/2008/06/24/classloaders-e-aplicacoes-isoladas-no-jboss/ ® Rafael Torres 2008

Dynamic Class Loading in the Java™ virtual Machine

http://www.cs.purdue.edu/homes/jv/smc/pubs/liang-oopsla98.pdf

Understanding the Java Classloading Mechanism

http://java.sys-con.com/node/37659/print

Java SE 6 API

http://java.sun.com/javase/6/docs/api/java/lang/ClassLoader.html

Classloading e o porquê você deveria ao menos saber como isso funciona

http://nullability.org/?p=95

Classloader hell

http://www.kumpera.net/blog/index.php/2007/05/09/classloader-hell/

JBossClassLoadingUseCases :

https://www.jboss.org/community/docs/DOC-10290

ClassLoadingConfiguration

http://www.jboss.org/community/docs/DOC-9288

Class loaders e aplicações isoladas no JBoss

http://www.mouseoverstudio.com/blog/2008/06/24/classloaders-e-aplicacoes-isoladas-no-jboss/

Referências [1] http://docs.jboss.org/jbossas/jboss4guide/r4/html/ch2.chapter.html#ch2.loadarch.fig [2] JBossClassLoadingUseCases https://www.jboss.org/community/docs/DOC-10290 [3] JMAE Javide, PETER Johnson. JBoss in Action. 2008 Manning. pag. 53 [4] http://www.middleware.vt.edu/doku.php?id=middleware:jboss:classloading ® Rafael Torres 2008

[1] http://docs.jboss.org/jbossas/jboss4guide/r4/html/ch2.chapter.html#ch2.loadarch.fig

[2] JBossClassLoadingUseCases https://www.jboss.org/community/docs/DOC-10290

[3] JMAE Javide, PETER Johnson. JBoss in Action. 2008 Manning. pag. 53

[4] http://www.middleware.vt.edu/doku.php?id=middleware:jboss:classloading

Add a comment

Related presentations

Presentación que realice en el Evento Nacional de Gobierno Abierto, realizado los ...

In this presentation we will describe our experience developing with a highly dyna...

Presentation to the LITA Forum 7th November 2014 Albuquerque, NM

Un recorrido por los cambios que nos generará el wearabletech en el futuro

Um paralelo entre as novidades & mercado em Wearable Computing e Tecnologias Assis...

Microsoft finally joins the smartwatch and fitness tracker game by introducing the...

Related pages

JBoss ClassLoader History | JBoss Developer

JBoss ClassLoader History This document describes the evolution of the JBoss ClassLoader, including some motivation for the changes and provides some
Read more

JBossClassLoadingUseCases | JBoss Developer

Advanced JBoss Class Loading Introduction One of the main concerns of a developer writing hot re-deployable JBoss applications is to understand how
Read more

JBoss Web - Class Loader HOW-TO - Dashboard - JBoss.org ...

Class Loader HOW-TO Overview. Like many server applications, JBoss Web installs a variety of class loaders (that is, classes that implement java.lang ...
Read more

jboss - JBoss6 Classloading logging - Stack Overflow

JBoss6 Classloading logging. up vote 3 down vote favorite. 1. ... I think that you can try to monitor classes in package org.jboss.classloader.
Read more

JBoss ClassLoader - JBoss Issue Tracker

JBoss OSGi style ClassLoading Previous releases can be in the Microcontainer project under "General"
Read more

jboss-classloader 下载 jar包_jar fire

下载 jboss-classloader jar 包. 本站下载镜像: jboss-classloader-2.0.4.GA.jar.zip; jboss-classloader-2.0.6.GA.jar.zip
Read more

[JBAS-6327] Servlet hangs in classloader - JBoss Issue Tracker

Servlet hangs in classloader. Agile Board; Export. XML; Word; Printable; Details. Type: Bug Status: ...
Read more

jboss 5.1.0.GA class loading, parent last | JBoss Developer

That tells JBoss classloader to behave as a classic webapp classloader: your WEB-INF goes first, and later the system classloader. Now ...
Read more

Maven Repository: org.jboss.cl » jboss-classloader » 2.2 ...

org.jboss.classloader.spi.translator: org.jboss.classloader.test.support: Web site developed by @frodriguez. Popular Tags [All Tags]
Read more