Tengo dos proyectos separados en mi IDE para el agente y para el cargador que encuentra una máquina virtual de destino y carga el JAR del agente.
agent.jar .La estructura del cargador ejecutable resultante se ve así:
loader.jar ├── META-INF │ └── MANIFEST.MF ├── me.domain.loader │ └── Main.class └── agent.jar ├── META-INF │ └── MANIFEST.MF └── me.domain.agent └── Agent.classDe la especificación VirtualMachine#loadAgent(java.lang.String) , necesito proporcionar una ruta al JAR que contiene el agente como primer parámetro.
Sin embargo, cuando uso Main.class.getResource("/agent.jar").getPath() obtengo una AgentLoadException: Agent JAR not found or no Agent-Class attribute . ¿Cuál es la forma correcta de hacer eso?
Ya tuve ese problema en un proyecto maven. De todos modos, es posible que necesite tener un archivo de manifiesto aquí en META-INF/MANIFEST.MF:
Manifest-Version: 1.0 Agent-Class: com.package.AgentLoader.agentNameHere Permissions: all-permissionsTiene más detalles aquí: https://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html o Agente JAR no encontrado o sin atributo de clase de agente
Parece que el JAR del agente que se va a cargar debe existir en el disco. Resolví este problema copiando el recurso JAR incrustado en un archivo temporal:
private static String getTemporaryResource(String resourceName) { // Read embedded resource from this JAR InputStream resourceStream = Main.class.getResourceAsStream(resourceName); if (resourceStream == null) { throw new Exception("Resource not found in the JAR"); } // Create a temporary file in %TEMP%/resource5513111026806316867.tmp File temporaryFile = File.createTempFile("resource", null); temporaryFile.deleteOnExit(); // Copy the resource data into the temporary file Files.copy(resourceStream, temporaryFile.toPath(), StandardCopyOption.REPLACE_EXISTING); // Return the path to temporary file return temporaryFile.getAbsolutePath(); }Luego estoy usando esta ruta temporal para cargar el agente:
String tempAgentPath = getTemporaryResource("/agent.jar"); VirtualMachine targetVM = VirtualMachine.attach("1337"); targetVM.loadAgent(tempAgentPath);