`
zhaonjtu
  • 浏览: 131295 次
  • 性别: 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中包含的主要API

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

    springboot应用打包成war包部署

    Spring Boot 应用打包成 WAR 包部署是将 Spring Boot 应用程序打包成 WAR 文件,以便于部署到外部 servlet 容器中。在本文中,我们将详细介绍如何将 Spring Boot 应用程序打包成 WAR 包,并部署到外部 servlet 容器...

    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