`
zhaonjtu
  • 浏览: 131128 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

WAS上部署Jmx应用中包冲突解决过程

阅读更多

 WAS上部署Jmx应用中包冲突解决过程

近日,在was6.0上面部署基于JMX的一个应用,出现一个JMX类的JMXConnectorFactory.resolveClassLoader()MethodNotFound的错误,但是明明JMX的类也就是jmx-remote.jar包里面的类有该类的方法,如图: 

 

  在开发机器上的tomcat上跑没有错,为什么布署在was上就有问题,肯定是环境出了问题,幸好有点was部署经验,出现此类java ERROR级别的错误,绝大多数是jar包冲突的的问题,于是打开was控制台,利用was的类装入器查看器发现在was的一个名为management.jar包里面也有同为JMXConnectorFactory的类,于是抓下来一看究竟。



 

 果然不出所料,没有resolveClassLoader方法,然而management的类加载层次肯定是比jmx-remote.jar的层次高,默认的类加载策略是先加载父类,理说当然,jmx-remote.jar包中的类不可能被加载。

   说起为什么冲突,还得说说历史。Jmxjdk1.4时代是作为sun的一个扩展包存在的,并不是标准的jdk的包,于是乎ibm也有他的jmx的实现,而且包名和sun的一样,要是不一样就不会有冲突了。

  好吧,能不能不使用基于JMX的包里面的实现,用management里面的实现呢,结果很失望,managementRmiConnectorServer根本没有实现。自己照着jmx-remote.jar里面的实现重写?实践了才发现不可能,重写一个得重写几十个类,还不能保证运行正常。

  由于jmxjar包在was上面部署的时候是采用共享包的方式部署的,我首先考虑的是能否考虑这个共享库的加载方式,改成后加载父类。为了便于理解

我们假设javaboot classloader叫做Awas的系统jarclassloader叫做B

共享库的classloader加载C,应用程序的classLoader叫做D。他们的层次如图:



 

其中C加载器加载jmx-remote.jar,如果能改变C的加载策略,改变为后加载父类,那么就可以避免加载management里面的类了。

 解决方案有两种:

  • 基于jvm层次的,在jvm上新建一个classloader,该classloader加载jmx共享库,方式为后加载父类。
  •   基于应用层次的,把jmx相关的包和应用程序放一起,放到/WEB-INF/lib下,改变web模块的加载为后加载父类。(由于该应用还有其他的共享包,如果是改变应用程序的加载顺序的话改变的是共享库的加载策略),不明白的话可以用was试试,然后看看类装入器就一目了然了。

 

  还有一种可能想到的解决方案,就是能不能在AB之间有一个classload E,让E去加载jmx相关的类。这样要找的肯定是E加载器中的jmx相关的类了。理想是好了,而且我们确实可以把E加载器放在AB之间。

  可以设置-Djava.ext.dirs变量或者设置-Djava.class.path变量,多个目录用”:”隔开,这种设置的前提是要知道变量的值是多少,否则就破坏系统的设置了。

一切看起来完美,布署运行,出现以下错误:

 

Caused by: java.lang.LinkageError: Class javax/management/remote/JMXServiceURL violates loader constraints:  parent and child already loaded different classes

         at java.lang.ClassLoader.defineClass0(Native Method)

         at java.lang.ClassLoader.defineClass(ClassLoader.java(Compiled Code))

         at java.security.SecureClassLoader.defineClass(SecureClassLoader.java(Compiled Code))

         at java.net.URLClassLoader.defineClass(URLClassLoader.java(Compiled Code))

         at java.net.URLClassLoader.access$500(URLClassLoader.java(Inlined Compiled Code))

         at java.net.URLClassLoader$ClassFinder.run(URLClassLoader.java(Compiled Code))

         at java.security.AccessController.doPrivileged1(Native Method)

         at java.security.AccessController.doPrivileged(AccessController.java(Compiled Code))

         at java.net.URLClassLoader.findClass(URLClassLoader.java(Compiled Code))

         at java.lang.ClassLoader.loadClass(ClassLoader.java(Compiled Code))

         at java.lang.ClassLoader.loadClass(ClassLoader.java(Compiled Code))

         at javax.management.remote.JMXConnectorServerFactory.newJMXConnectorServer(JMXConnectorServerFactory.java:275)

 

灰常底层的错误啊!googlebaidu之。原因是这样的

Classloader D 调用一个方法JMXConnectorServerFactory. newJMXConnectorServer(JMXServiceURL serviceURL,Map environment,

                MBeanServer mbeanServer)来新建一个ConnectorServer

这个方法可以从spring的源码中看到。先看看目前的类加载器:

 



 

D会去找JMXConnectorServerFactory类,由于B中没有所以找到了E中的JMXConnectorServerFactory,同时也会去找JMXServiceURL,找到B的时候,这里是关键,由于Classloader B (WAS引导程序扩展类装入器)出于保护was类的原因,其策略是后加载父类(parent_last),所以找到了B中的JMXServiceURL。然而实际上,JMXConnectorServerFactory.newJMXConnectorServer方法需要的是E中的JMXServiceURL类,并且E中的JMXServiceURLB中的JMXServiceURL字节码不一样,所以会出现violates loader constraints:  parent and child already loaded different classes这种错误,也就是类装入器约束违反。

如果还不清楚的话,可以参考:

 

写道
http://www.ibm.com/developerworks/cn/java/j-dclp4/

 

既然绕不过B,还是只能有上述两种解决方案了。两种比较而言方案二更安全点,毕竟jvm上面跑的不只是这一个应用,动配置的事情能影响小就影响小点吧。

 

 

 

 

  • 大小: 81.2 KB
  • 大小: 67.8 KB
  • 大小: 3.1 KB
  • 大小: 5.2 KB
0
0
分享到:
评论

相关推荐

    jmx相关jar包

    总的来说,`jmxri.jar` 和 `jmxremote.jar` 是开发和部署JMX解决方案的关键组成部分,它们为Java开发者提供了强大的工具来管理和监控他们的应用程序和服务。通过熟练掌握JMX,你可以提高系统的可观察性和可维护性,...

    使用jmx所需的jar包

    在Java应用中使用JMX通常涉及到引入特定的JAR包来支持其功能。 标题中提到的“使用jmx所需的jar包”是指在进行JMX开发时必要的类库文件。通常,这些JAR包包含了JMX API和实现,它们使得开发者能够构建MBeans...

    JMX一步一步来,快速学会开发JMX应用

    JMX(Java Management Extensions)是一个用于在Java应用程序中添加管理和监控功能的框架。它提供了一套标准的接口和服务,使得开发者能够轻松地在Java应用中集成管理和监控的能力。JMX的核心概念包括MBeans...

    JMX 在GlassFish中的应用

    AMX在保留JMX原有的优势基础上,增加了更多的面向对象特性和简化了MBean的开发过程,使得在GlassFish环境中管理和监控应用变得更加直观和高效。 #### JMX的基本概念 - **MBeans**:这是JMX的核心组成部分,用来...

    jmx中包含的主要API

    Java Management Extensions (JMX) 是 Java 平台中用于管理和监控应用程序、系统和服务的一个标准框架。JMX API 提供了一套接口和类,使得开发者能够创建管理工具、服务和组件,以便于监视和控制运行时的环境。在这...

    jmxri.jar包

    Java Management Extensions (JMX) 是Java平台上的一个标准技术,用于管理和监控应用程序、服务和硬件。JMX 提供了一种灵活的框架,可以创建、配置和管理Java应用程序中的各种资源。`jmxri.jar` 文件是Java运行时...

    在jboss上部署web应用

    总结,JBoss作为一款强大的Java应用服务器,提供了丰富的J2EE服务和高级特性,其安装、配置和部署过程相对简单,适合开发和部署各种企业级应用。通过理解和掌握这些基础知识,开发者能够更有效地利用JBoss来构建和...

    jmx需要的jar包

    Java Management Extensions(JMX)是Java平台上的一个标准技术,用于管理和监控应用程序、操作系统和网络设备。它提供了一种统一的方式来创建、配置、查询和控制管理对象,使得开发者可以轻松地将管理功能集成到...

    jmx所需jar包

    Java Management Extensions(JMX)是Java平台上的一个标准技术,用于管理和监控应用程序、系统和服务。JMX提供了一种灵活的框架,使得开发者可以创建管理工具,以及让运行时的组件暴露其管理特性。在Java应用中,...

    论文研究-JMX技术在网络监控中的应用.pdf

    综上所述,JMX技术在网络监控中的应用,有效地解决了传统网络监控中存在的问题。通过JMX的模块化设计,使得网络监控更加灵活,可扩展性更强,而且可以通过多种渠道接收和发送管理信息。借助JBoss等应用服务器的支持...

    jmx监控tomcat测试包

    catalina-jmx-remote.jar放到tomcat/lib目录下 如果是windows版本,编辑TOMCAT_HOME/bin/catalina.bat,在开头加入下面几行: set CATALINA_OPTS=%CATALINA_OPTS% -Djava.rmi.server.hostname=JMX_HOST set CATALINA...

    jmxri-1.2.1.jar+jmxtools-1.2.1.jar

    Java Management Extensions (JMX) 是Java平台上的一个标准技术,用于管理和监控应用程序、操作系统和网络设备。`jmxri-1.2.1.jar` 和 `jmxtools-1.2.1.jar` 是与JMX相关的两个核心库文件,它们在Java应用程序中扮演...

    JMX实战 JMX开发

    书中不仅有对于基础知识的介绍,还有对于JMX开发中重大的体系架构问题的深入探讨,总结了大量JMX开发中的设计模式,并讨论了框架、安全性与性能等等。书中提供了几个典型的例子,兼顾各种开发平台,这些例子的代码...

    jmx测试包用于检查zabbix的监控项是否正常

    标题中的"jmx测试包用于检查zabbix的监控项是否正常",意味着这个测试包是为了解决一个特定的问题:确保Zabbix通过JMX接口正确地收集和显示了目标系统的监控数据。Zabbix是一款开源的网络监控工具,它可以监控各种...

    jmx工具包tools

    Java Management Extensions(JMX)是Java平台上的一个标准技术,用于管理和监控应用程序、系统和服务。JMX提供了一种灵活的框架,使得开发者可以创建管理接口,以便对运行时的组件进行监控和管理。在这个场景中,...

    jmxri-1.2.1

    JMXri(JMX Remote Interface)是JMX的一部分,实现了JMX规范中的远程访问功能,使得管理者能够远程控制和监控Java应用,无论是本地还是分布在不同网络上的应用。 【压缩包子文件的文件名称列表】中的`jmxri-1.2.1....

    JMX实例与应用模型下载

    JMX应用实例与实现,通过一个简单的JavaWeb应用来验证JMX在应用中的植入管理和应用

    JBoss JMX实现架构

    在JBoss这样的应用服务器中,理解这些异常及其原因至关重要,因为它们可以帮助诊断和解决动态部署过程中可能出现的问题。通过优化类加载器的策略和管理,可以提高系统的稳定性和可扩展性。 总之,JBoss JMX的实现...

Global site tag (gtag.js) - Google Analytics