로더 내부에있는 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);