2

我的 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. 这样做的正确方法是什么?

4

2 回答 2

1

我已经在 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 或 找不到代理 JAR 或没有代理类属性

于 2020-11-14T18:44:15.053 回答
1

看起来要加载的代理 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);
于 2020-11-15T10:39:50.057 回答