加载位于加载程序内的 Java 代理 JAR
Load a Java agent JAR located inside the loader
我的 IDE 中有两个单独的项目,用于代理和用于查找目标 VM 并加载代理 JAR 的加载程序。
- 构建代理项目时,将生成的代理 JAR 工件复制到加载程序的资源文件夹中。
- 构建加载器项目时,加载器 JAR 包含加载器代码和其中的
agent.jar
。
生成的可运行加载程序结构如下所示:
loader.jar
├── META-INF
│ └── MANIFEST.MF
├── me.domain.loader
│ └── Main.class
└── agent.jar
├── META-INF
│ └── MANIFEST.MF
└── me.domain.agent
└── Agent.class
根据 VirtualMachine#loadAgent(java.lang.String) 规范,我需要提供包含代理的 JAR 的路径作为第一个参数。
但是,当使用 Main.class.getResource("/agent.jar").getPath()
时,我得到一个 AgentLoadException: Agent JAR not found or no Agent-Class attribute
。正确的做法是什么?
我在一个maven项目中已经遇到过这样的问题。
无论如何,您可能需要在 META-INF/MANIFEST.MF:
中有一个清单文件
Manifest-Version: 1.0
Agent-Class: com.package.AgentLoader.agentNameHere
Permissions: all-permissions
您在这里有更多详细信息:
https://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html
要么
Agent JAR not found or no Agent-Class attribute
看起来要加载的代理 JAR 必须存在于磁盘上。我通过将嵌入式 JAR 资源复制到临时文件中解决了这个问题:
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();
}
然后我使用这个临时路径加载代理:
String tempAgentPath = getTemporaryResource("/agent.jar");
VirtualMachine targetVM = VirtualMachine.attach("1337");
targetVM.loadAgent(tempAgentPath);
我的 IDE 中有两个单独的项目,用于代理和用于查找目标 VM 并加载代理 JAR 的加载程序。
- 构建代理项目时,将生成的代理 JAR 工件复制到加载程序的资源文件夹中。
- 构建加载器项目时,加载器 JAR 包含加载器代码和其中的
agent.jar
。
生成的可运行加载程序结构如下所示:
loader.jar
├── META-INF
│ └── MANIFEST.MF
├── me.domain.loader
│ └── Main.class
└── agent.jar
├── META-INF
│ └── MANIFEST.MF
└── me.domain.agent
└── Agent.class
根据 VirtualMachine#loadAgent(java.lang.String) 规范,我需要提供包含代理的 JAR 的路径作为第一个参数。
但是,当使用 Main.class.getResource("/agent.jar").getPath()
时,我得到一个 AgentLoadException: Agent JAR not found or no Agent-Class attribute
。正确的做法是什么?
我在一个maven项目中已经遇到过这样的问题。 无论如何,您可能需要在 META-INF/MANIFEST.MF:
中有一个清单文件Manifest-Version: 1.0
Agent-Class: com.package.AgentLoader.agentNameHere
Permissions: all-permissions
您在这里有更多详细信息: https://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html 要么 Agent JAR not found or no Agent-Class attribute
看起来要加载的代理 JAR 必须存在于磁盘上。我通过将嵌入式 JAR 资源复制到临时文件中解决了这个问题:
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();
}
然后我使用这个临时路径加载代理:
String tempAgentPath = getTemporaryResource("/agent.jar");
VirtualMachine targetVM = VirtualMachine.attach("1337");
targetVM.loadAgent(tempAgentPath);