로더 내부에있는 Java 에이전트 JAR로드

Nov 15 2020

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

로부터 가상 머신 # loadAgent (java.lang.String의) 사양, I는 상기 제 파라미터와 제를 함유 JAR 경로를 제공해야한다.

사용하는 경우 그러나, Main.class.getResource("/agent.jar").getPath()나는 받고 있어요 AgentLoadException: Agent JAR not found or no Agent-Class attribute. 이를 수행하는 올바른 방법은 무엇입니까?

답변

1 davidvera Nov 15 2020 at 01:44

나는 이미 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이 없거나 에이전트 클래스 속성이 없습니다.

1 user7401478 Nov 15 2020 at 17:39

로드 할 에이전트 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);