Java 运行时设置JMX的JVM参数

Java 运行时设置JMX的JVM参数,java,jvm,jmx,jvm-arguments,Java,Jvm,Jmx,Jvm Arguments,我有一些代码连接到JMX并按名称获取mBean。现在我正在用JUnit为它编写测试。我已经做了一些未经身份验证的测试,使用如下方式: private static void startJmxServer()引发异常{ MBeanServer mbs=ManagementFactory.getPlatformMBeanServer(); LocateRegistry.createRegistry(端口); JMXServiceURL=newjmxserviceurl(“服务:jmx:rmi:///

我有一些代码连接到JMX并按名称获取mBean。现在我正在用JUnit为它编写测试。我已经做了一些未经身份验证的测试,使用如下方式:

private static void startJmxServer()引发异常{
MBeanServer mbs=ManagementFactory.getPlatformMBeanServer();
LocateRegistry.createRegistry(端口);
JMXServiceURL=newjmxserviceurl(“服务:jmx:rmi:///jndi/rmi://“+HOST+”:“+PORT+”/jmxrmi”);
JMXConnectorServer connectorServer=JMXConnectorServerFactory.newJMXConnectorServer(url,null,mbs);
示例exampleMBean=新示例();
ObjectName exampleName=新的ObjectName(MBEAN_名称);
registerMBean(exampleMBean,exampleName);
connectorServer.start();
} 
现在我想做一些验证测试。因此,我需要指定下一个JVM属性:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.access.file=/somepath/jmxremote.access
-Dcom.sun.management.jmxremote.password.file=/somepath/jmxremote.password
我已经尝试在
JMXConnectorServer
环境变量中传递此属性。我还尝试了
System.setProperty
。但已失败,因为连接在没有任何凭据的情况下可用。 唯一可行的方法是:

private static void startJmxServer()引发异常{
字符串名称=ManagementFactory.getRuntimeMXBean().getName();
VirtualMachine vm=VirtualMachine.attach(name.substring(0,name.indexOf('@'));
字符串lca=vm.getAgentProperties().getProperty(“com.sun.management.jmxremote.localConnectorAddress”);
如果(lca==null){
Path p=Path.get(System.getProperty(“java.home”).normalize();
if(!“jre”.equals(p.getName(p.getNameCount()-1).toString()
.toLowerCase()){
p=p.resolve(“jre”);
}
文件f=p.resolve(“lib”).resolve(“management agent.jar”).toFile();
如果(!f.exists()){
抛出新IOException(“未找到管理代理”);
}
String options=String.format(“com.sun.management.jmxremote.port=%d,”+
com.sun.management.jmxremote.authenticate=true+
com.sun.management.jmxremote.ssl=false+
com.sun.management.jmxremote.access.file=/somepath/jmxremote.access+
“com.sun.management.jmxremote.password.file=/somepath/jmxremote.password”,端口);
loadAgent(f.getCanonicalPath(),选项);
}
vm.detach();
MBeanServer mbs=ManagementFactory.getPlatformMBeanServer();
示例exampleMBean=新示例();
ObjectName exampleName=新的ObjectName(MBEAN_名称);
registerMBean(exampleMBean,exampleName);
}

但在加载代理时,我无法更改VM属性以在没有身份验证的情况下运行测试。此外,我希望避免此类事情,因为需要手动定义tools.jar,并且希望使用常见的JMX工具。您知道如何管理吗?

身份验证配置在
环境中传递,这是到的第二个参数

HashMap env=newhashmap();
put(“jmx.remote.x.password.file”,“/somepath/jmxremote.password”);
put(“jmx.remote.x.access.file”,“/somepath/jmxremote.access”);
JMXConnectorServer连接器服务器=
newJMXConnectorServer(url、env、mbs);
请注意,此处的属性名称与属性名称不同


请咨询JDK源代码,了解默认JMXConnectorServer是如何初始化的。

非常感谢!你让我高兴极了!我试图在环境属性中使用相同的属性名。但现在一切都正常了。
    HashMap<String, Object> env = new HashMap<>();
    env.put("jmx.remote.x.password.file", "/somepath/jmxremote.password");
    env.put("jmx.remote.x.access.file", "/somepath/jmxremote.access");

    JMXConnectorServer connectorServer =
        JMXConnectorServerFactory.newJMXConnectorServer(url, env, mbs);