我正在開發一個監控應用程序,該應用程序使用Sigar進行監控以監控不同類型的應用程序。 Sigar的一個問題是,當監視Java應用程序(JVM)的堆使用情況時,我只能獲取最大堆大小,而不能獲取JVM的實際使用堆大小。 因此,我擴展了監視應用程序以使用JMX連接到JVM,並檢索CPU以及堆使用情況。到目前爲止,這工作正常,但 我想盡可能地自動化所有內容,並且我不希望在啓用JMX的情況下啓動所有受監視的應用程序,但需要時使用以下代碼動態激活它:檢查tools.jar是否可用並在運行時動態加載
private void connectToJVM(final String pid) throws IOException, AgentLoadException, AgentInitializationException {
List<VirtualMachineDescriptor> vms = VirtualMachine.list();
for (VirtualMachineDescriptor desc : vms) {
if (!desc.id().equals(pid)) {
continue;
}
VirtualMachine vm;
try {
vm = VirtualMachine.attach(desc);
} catch (AttachNotSupportedException e) {
continue;
}
Properties props = vm.getAgentProperties();
String connectorAddress = props.getProperty(CONNECTOR_ADDRESS);
if (connectorAddress == null) {
String agent = vm.getSystemProperties().getProperty("java.home") + File.separator + "lib"
+ File.separator + "management-agent.jar";
vm.loadAgent(agent);
// agent is started, get the connector address
connectorAddress = vm.getAgentProperties().getProperty(CONNECTOR_ADDRESS);
}
vm.detach();
JMXServiceURL url = new JMXServiceURL(connectorAddress);
this.jmxConnector = JMXConnectorFactory.connect(url);
}
}
目前爲止工作正常,但問題是我現在依賴於來自JDK的tools.jar
。 我的問題是現在我可以在運行時檢查tools.jar
是否在JAVA_HOME
路徑中可用,並在它是否加載時加載它?因爲如果它不可用,我只想用Sigar進行正常監視,但如果可用,我想使用JMX監視Java應用程序。 我的項目是一個maven項目,我正在使用maven-shade-plugin
來創建一個可執行的jar文件,其中包含所有的依賴關係。
目前我使用的是互聯網中發現的骯髒的黑客,它使用反射將tools.jar
動態添加到系統類路徑(如果存在)。但我想知道是否有可能以不同的方式做到這一點? 預先感謝您的支持。
這是一個壞主意,不是因爲這個JAR在Java 9中消失了。你應該使用Compiler API來訪問'javac'。 –