前言
JMX即Java Managemen Extensions,是一个为应用程序植入管理功能的框架。一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。
常常在编程的过程中有一些配置信息需要动态的进行改变,我以往会有如下几种做法:
-
写死在Java code中,环境发生变化的时候修改Java code
-
写在名为*.properties的配置文件里,使用Java读取配置文件
然而今天我们将引入一种高级的方式来进行配置信息的管理,那便是JMX的引入。
如何使用JMX
JMX做为一份规范,JDK中提供了JMX接口,因此安装了JDK后就可以开发基于JMX的代码了。
JMX具有两层结构,各层的组件如下
工具层
-
Mbeans
-
通知模型:Notification、NotificationListener
-
Mbeans与数据类:Attribute、Operator
代理层
-
MBean Server
-
代理服务
下面学习下log4j2对JMX的支持
JMX-log4j2
Log4j 2 开始支持 JMX. StatusLogger, ContextSelector, 和所有的 LoggerContexts, LoggerConfigs 以及 Appenders 使用了MBeans并且可以被远程检测和控制.
使JMX生效
默认情况下JMX是生效的。当log4j初始化的时候StatusLogger, ContextSelector, 以及所有的LoggerContexts, LoggerConfigs 和Appenders 使用了 MBeans. 当启动JVM时如果想禁用掉JMX则需要在系统配置文件中添加 log4j2.disable.jmx=true .
本地监视
本地监视不需要修改任何系统配置文件。使用Java里自带的JConsole工具即可监视你的应用,当安装完JDK之后并配置了环境变量,只需要在终端执行以下命令即可打开可视化的监视界面。
1
|
jconsole |
远程监视应用
要使远程监视应用有效则需要在启动JVM之前在系统配置文件中添加一下配置.
com.sun.management.jmxremote.port=portNum
其中portNum即指远程应用的端口。
Log4j2 检测组件
下面则是Log4j Mbeans在jconsole里的一段截图.
可视化客户端
Log4j包含了基本的可视化组件,可以监视 StatusLogger 输出以及远程修改Log4j 配置.该客户端可以被当作单独的应用运行,也可以作为JConsole的插件使用。
当作JConsole插件
使用下面的命令启动jconsole
%JAVA_HOME%\bin\jconsole -pluginpath \path\to\log4j-api-2.1.jar;\path\to\log4j-core-2.1.jar;\path\to\log4j-jmx-gui-2.1.jar
执行完上述命令后你将可以看到下面包含log4j2标签页的界面
远程编辑log4j配置信息
这个GUI工具也包含了简单的编辑器用于编辑log4j配置信息。如下图所示
当作独立的应用运行
执行下面的命令
%JAVA_HOME%\bin\java -cp \path\to\log4j-api-2.1.jar;\path\to\log4j-core-2.1.jar;\path\to\log4j-jmx-gui-2.1.jar org.apache.logging.log4j.jmx.gui.ClientGui <options>
上面的options可以为下面三项中的一项
-
<host>:<port>
-
service:jmx:rmi:///jndi/rmi://<host>:<port>/jmxrmi
-
service:jmx:rmi://<host>:<port>/jndi/rmi://<host>:<port>/jmxrmi
此处不得不注意端口号必须与启动应用时所指定的JMX端口号一致
例如在启动应用的时候指定JVM参数信息如下:
com.sun.management.jmxremote.port=33445 com.sun.management.jmxremote.authenticate=false com.sun.management.jmxremote.ssl=false
紧接着执行下面的命令:
%JAVA_HOME%\bin\java -cp \path\to\log4j-api-2.1.jar;\path\to\log4j-core-2.1.jar;\path\to\log4j-jmx-gui-2.1.jar org.apache.logging.log4j.jmx.gui.ClientGui localhost:33445
下面则是相关的两个示例图片:
相关推荐
在Java编程语言中,动态加载jar文件是一种关键的特性,它允许程序在运行时加载新的类库或组件,而不是在编译时静态地链接。这种技术对于实现插件式开发或者模块化系统至关重要,因为它提供了灵活性和可扩展性。下面...
在Java编程中,有时我们需要动态地加载外部JAR文件,并执行其中特定的类方法,这在插件系统、模块化应用或动态扩展性需求中尤为常见。本篇将详细讲解如何实现这一目标。 首先,理解JAR(Java Archive)文件是Java...
默认情况下,JVM会使用系统类加载器来查找和加载类,但我们可以自定义类加载器来实现特定的加载逻辑,比如从特定的jar文件中加载类。 以下是动态加载jar包的基本步骤: 1. **创建自定义类加载器**:首先,我们需要...
在Java中,类加载器负责查找并加载类到Java虚拟机中。我们可以通过自定义类加载器来实现热加载。例如,`MemoryClassLoader.java`可能就是一个自定义类加载器的实现,它可以在内存中动态加载或更新类。 **JarinJAR**...
在Java编程中,有时我们需要从已经打包的JAR文件中读取特定的资源文件,例如配置文件、图片或库。本篇文章将详细讲解如何在Java中实现从JAR包中读取指定文件的方法。 首先,Java提供了`java.util.jar`包,其中包含...
Java类是从JAR(Java Archive)包中加载的,JAR文件是Java平台特有的归档格式,用于收集多个类文件、相关的元数据和其他资源(如图像文件或配置文件)到一个单一的文件中,方便分发和运行。 首先,我们来理解一下...
在Java编程语言中,动态加载jar包是一种常见的需求,它允许程序在运行时根据需要加载新的功能或更新现有的模块,增强了软件的灵活性和可扩展性。动态加载jar包技术主要涉及Java的反射机制、类加载器和插件系统。下面...
结合以上两个部分,我们可以在运行时动态编译Java源代码并生成JAR文件。这在实现某些动态加载或插件系统时非常有用。不过,实际应用中,我们还需要处理更复杂的情况,例如错误处理、资源清理以及编译多个源文件等。...
2. 创建自定义类加载器,重写`findClass()`方法,从jar文件中读取并加载类。 3. 使用加载的类进行实例化和方法调用。 4. 考虑处理外部jar的依赖关系。 在实际开发中,这种动态加载外部jar文件的能力对于构建可扩展...
- 使用`java.util.zip`包中的`ZipFile`类来打开和读取ZIP或JAR文件。通过`ZipFile.entries()`获取所有条目,然后遍历这些条目,寻找`.class`文件。 - 对于每个`.class`文件,将其读入字节数组,准备调用`...
Java URLClassLoader 是Java标准库中的一个类加载器,它允许我们动态地从指定的URL位置加载类和资源。这个功能在开发插件系统、热部署或者处理多种版本库的场景中非常有用。从JDK 1.2开始,`java.net.URLClassLoader...
Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class...测试示例中是spring boot 的部分代码,动态加载的内容为接口实现类,且初始化时加载本地的实现类,动态加载后改为非程序加载目录中的jar实现类。
所有 `ClassLoader` 的最终父级是**系统 ClassLoader**,它默认从本地文件系统加载类。 #### 二、深入理解ClassLoader `java.lang` 包中的 `ClassLoader` 类是Java类加载的核心组件。它的主要职责是在接收到类请求...
在开发过程中,JAR文件也有助于减少网络传输的时间,因为它们可以被压缩,同时还可以提高程序的加载速度。此外,JAR文件还支持签名,这对于确保代码的安全性和防止篡改至关重要。 在CSDN上发布的文章...
这要求JAR文件的结构支持直接从外部JAR加载类,可能需要将依赖项的类合并到主JAR中。 4. **使用`java.util.ServiceLoader`**:对于依赖于服务提供者接口(SPI)的情况,可以利用`ServiceLoader`来加载第三方JAR提供...
在Java编程中,读取jar包内的文件是一个常见的需求,特别是在运行时动态加载资源或类文件时。Java提供了一种内置的方式,通过`java.util.jar`包中的`JarFile`和`JarInputStream`类来实现这个功能。下面将详细介绍...
类加载器是Java虚拟机(JVM)的一部分,负责查找并加载类的字节码到内存中。Java默认提供了几个内置的类加载器,如Bootstrap ClassLoader、Extension ClassLoader和AppClassLoaer。然而,为了实现动态加载,我们需要...
在Android开发中,动态加载JAR(Java Archive)文件是一种常见的技术,它允许应用程序在运行时加载和执行不在原始APK文件中的代码。这种技术有多种应用场景,例如更新功能、热修复、插件化框架等。下面将详细介绍...
然后,通过ClassLoader的loadClass()方法,我们可以动态地加载和执行.jar文件中的类。 总的来说,这个资源提供了一个Android应用动态加载外部jar文件的实践案例,对于想要学习这一技术的开发者来说非常有价值。通过...
总结来说,JAR文件是Java开发中不可或缺的一部分,无论是为了打包应用程序,还是为了实现库的分发,都提供了极大的便利。了解并掌握如何创建和使用可执行的JAR文件,对Java开发者来说至关重要。通过正确的配置和使用...