`
qq_25086121
  • 浏览: 20209 次
社区版块
存档分类
最新评论

Java 从Jar文件中动态加载类

    博客分类:
  • java
阅读更多

前言

JMX即Java Managemen Extensions,是一个为应用程序植入管理功能的框架。一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。

常常在编程的过程中有一些配置信息需要动态的进行改变,我以往会有如下几种做法:

  1. 写死在Java code中,环境发生变化的时候修改Java code

  2. 写在名为*.properties的配置文件里,使用Java读取配置文件

然而今天我们将引入一种高级的方式来进行配置信息的管理,那便是JMX的引入。

 

如何使用JMX

JMX做为一份规范,JDK中提供了JMX接口,因此安装了JDK后就可以开发基于JMX的代码了。

JMX具有两层结构,各层的组件如下

工具层

  1. Mbeans

  2. 通知模型:Notification、NotificationListener

  3. Mbeans与数据类:Attribute、Operator

代理层

  1. MBean Server

  2. 代理服务

 

下面学习下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里的一段截图.

JConsole screenshot of the MBeans tab

 

可视化客户端

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标签页的界面

JConsole screenshot of the StatusLogger display

 

远程编辑log4j配置信息

这个GUI工具也包含了简单的编辑器用于编辑log4j配置信息。如下图所示

JConsole screenshot of the configuration file editor

 

 

当作独立的应用运行

执行下面的命令

%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

下面则是相关的两个示例图片:

JMX GUI screenshot of StatusLogger display

JMX GUI screenshot of configuration editor

 

 

获取【下载地址】

 

3
13
分享到:
评论

相关推荐

    Java 动态加载jar文件示例

    在Java编程语言中,动态加载jar文件是一种关键的特性,它允许程序在运行时加载新的类库或组件,而不是在编译时静态地链接。这种技术对于实现插件式开发或者模块化系统至关重要,因为它提供了灵活性和可扩展性。下面...

    Java 自动加载JAR文件并运行其中的类方法

    在Java编程中,有时我们需要动态地加载外部JAR文件,并执行其中特定的类方法,这在插件系统、模块化应用或动态扩展性需求中尤为常见。本篇将详细讲解如何实现这一目标。 首先,理解JAR(Java Archive)文件是Java...

    动态加载jar包

    默认情况下,JVM会使用系统类加载器来查找和加载类,但我们可以自定义类加载器来实现特定的加载逻辑,比如从特定的jar文件中加载类。 以下是动态加载jar包的基本步骤: 1. **创建自定义类加载器**:首先,我们需要...

    springboot+java类热加载

    在Java中,类加载器负责查找并加载类到Java虚拟机中。我们可以通过自定义类加载器来实现热加载。例如,`MemoryClassLoader.java`可能就是一个自定义类加载器的实现,它可以在内存中动态加载或更新类。 **JarinJAR**...

    Java实现从jar包中读取指定文件的方法

    在Java编程中,有时我们需要从已经打包的JAR文件中读取特定的资源文件,例如配置文件、图片或库。本篇文章将详细讲解如何在Java中实现从JAR包中读取指定文件的方法。 首先,Java提供了`java.util.jar`包,其中包含...

    java 类从哪个jar包加载的

    Java类是从JAR(Java Archive)包中加载的,JAR文件是Java平台特有的归档格式,用于收集多个类文件、相关的元数据和其他资源(如图像文件或配置文件)到一个单一的文件中,方便分发和运行。 首先,我们来理解一下...

    java 动态加载jar包

    在Java编程语言中,动态加载jar包是一种常见的需求,它允许程序在运行时根据需要加载新的功能或更新现有的模块,增强了软件的灵活性和可扩展性。动态加载jar包技术主要涉及Java的反射机制、类加载器和插件系统。下面...

    java动态编译指定java文件且将java文件生成jar

    结合以上两个部分,我们可以在运行时动态编译Java源代码并生成JAR文件。这在实现某些动态加载或插件系统时非常有用。不过,实际应用中,我们还需要处理更复杂的情况,例如错误处理、资源清理以及编译多个源文件等。...

    java调用外部jar文件

    2. 创建自定义类加载器,重写`findClass()`方法,从jar文件中读取并加载类。 3. 使用加载的类进行实例化和方法调用。 4. 考虑处理外部jar的依赖关系。 在实际开发中,这种动态加载外部jar文件的能力对于构建可扩展...

    JAVA动态加载JAR zip包

    - 使用`java.util.zip`包中的`ZipFile`类来打开和读取ZIP或JAR文件。通过`ZipFile.entries()`获取所有条目,然后遍历这些条目,寻找`.class`文件。 - 对于每个`.class`文件,将其读入字节数组,准备调用`...

    Java URLClassLoader动态加载jar包1

    Java URLClassLoader 是Java标准库中的一个类加载器,它允许我们动态地从指定的URL位置加载类和资源。这个功能在开发插件系统、热部署或者处理多种版本库的场景中非常有用。从JDK 1.2开始,`java.net.URLClassLoader...

    Java加载。jar包

    所有 `ClassLoader` 的最终父级是**系统 ClassLoader**,它默认从本地文件系统加载类。 #### 二、深入理解ClassLoader `java.lang` 包中的 `ClassLoader` 类是Java类加载的核心组件。它的主要职责是在接收到类请求...

    Spring bean 动态注册,jar包热替换

    Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class...测试示例中是spring boot 的部分代码,动态加载的内容为接口实现类,且初始化时加载本地的实现类,动态加载后改为非程序加载目录中的jar实现类。

    java打包jar文件实例

    在开发过程中,JAR文件也有助于减少网络传输的时间,因为它们可以被压缩,同时还可以提高程序的加载速度。此外,JAR文件还支持签名,这对于确保代码的安全性和防止篡改至关重要。 在CSDN上发布的文章...

    在可执行jar中载入第三方jar的几个解决方法

    这要求JAR文件的结构支持直接从外部JAR加载类,可能需要将依赖项的类合并到主JAR中。 4. **使用`java.util.ServiceLoader`**:对于依赖于服务提供者接口(SPI)的情况,可以利用`ServiceLoader`来加载第三方JAR提供...

    java 读取jar包文件

    在Java编程中,读取jar包内的文件是一个常见的需求,特别是在运行时动态加载资源或类文件时。Java提供了一种内置的方式,通过`java.util.jar`包中的`JarFile`和`JarInputStream`类来实现这个功能。下面将详细介绍...

    动态加载jar包的实现

    类加载器是Java虚拟机(JVM)的一部分,负责查找并加载类的字节码到内存中。Java默认提供了几个内置的类加载器,如Bootstrap ClassLoader、Extension ClassLoader和AppClassLoaer。然而,为了实现动态加载,我们需要...

    android动态加载jar

    在Android开发中,动态加载JAR(Java Archive)文件是一种常见的技术,它允许应用程序在运行时加载和执行不在原始APK文件中的代码。这种技术有多种应用场景,例如更新功能、热修复、插件化框架等。下面将详细介绍...

    android动态加载jar文件

    然后,通过ClassLoader的loadClass()方法,我们可以动态地加载和执行.jar文件中的类。 总的来说,这个资源提供了一个Android应用动态加载外部jar文件的实践案例,对于想要学习这一技术的开发者来说非常有价值。通过...

    JAR文件包及jar命令详解

    总结来说,JAR文件是Java开发中不可或缺的一部分,无论是为了打包应用程序,还是为了实现库的分发,都提供了极大的便利。了解并掌握如何创建和使用可执行的JAR文件,对Java开发者来说至关重要。通过正确的配置和使用...

Global site tag (gtag.js) - Google Analytics