2016-08-19 17 views
2

내 프로젝트에 ALPN 지원을 추가하기 위해 jetty-alpn-agent을 사용하고 있지만, 찾을 수있는 것은 .m2 폴더에서 실행하는 방법에 대한 지침입니다. 따라서 내 하나의 uber-jar 대신 두 개의 jar를 배포해야합니다. 덜 휴대 가능합니다.'fat jar'안에 자바 에이전트를 지정 하시겠습니까?

병 내부의 위치를 ​​-javaagent 스위치로 지정할 수 있습니까?

나는 java -javaagent:my.jar!/javaagents/jetty-alpn-agent-2.0.0.jar -jar myjar.jar과 같은 것을 찾고 있는데, 그게 효과가없는 것 같습니다.

답변

1

java.lang.instrumentation 설명서에 따라 가능할 수 있습니다.

구현시 허용되는 경우 jetty-alpn-agent.jar은 시스템 클래스 경로에 속해야합니다. 따라서 다른 응용 프로그램 라이브러리처럼 my.jar에 포함시켜야합니다.

시작 에이전트 VM 시작

구현 후 VM이 시작된 후 언젠가 에이전트를 시작 메커니즘을 제공 할 수 있습니다. 이것이 어떻게 시작되는지에 대한 세부 사항은 구현 특정이지만 일반적으로 응용 프로그램이 이미 시작되었으며 주 메소드가 이미 호출되었습니다. VM이 시작된 후 구현이 에이전트 시작을 지원하는 경우 다음이 적용됩니다.

에이전트 JAR의 매니페스트는 에이전트 클래스 속성을 포함해야합니다. 이 속성의 값은 에이전트 클래스의 이름입니다.

에이전트 클래스는 public static agentmain 메소드를 구현해야합니다.

시스템 클래스 로더 (ClassLoader.getSystemClassLoader)는 에이전트 JAR 파일을 시스템 클래스 경로에 추가하는 메커니즘을 지원해야합니다.

에이전트 JAR이 시스템 클래스 경로에 추가됩니다. 이것은 일반적으로 응용 프로그램 주 방법을 포함하는 클래스를로드하는 클래스 로더입니다. 에이전트 클래스가로드되고 JVM이 agentmain 메소드를 호출하려고 시도합니다. 또한

public static void agentmain(String agentArgs); 

에이전트 클래스를 할 수 있습니다 : 다음 JVM은 호출을 시도합니다 에이전트 클래스는이 메소드를 구현하지 않는 경우

public static void agentmain(String agentArgs, Instrumentation inst); 

: JVM은 먼저 에이전트 클래스에서 다음 메소드를 호출하려고 시도 명령 줄 옵션을 사용하여 에이전트를 시작한 경우 사전 방법을 사용하십시오. VM 시작 후 에이전트가 시작되면 premain 메소드가 호출되지 않습니다.

에이전트에는 agentArgs 매개 변수를 통해 해당 에이전트 옵션이 전달됩니다. 에이전트 옵션은 단일 문자열로 전달되며 추가 구문 분석은 에이전트 자체에서 수행해야합니다.

agentmain 메서드는 에이전트를 시작하는 데 필요한 초기화를 수행해야합니다. 시작이 완료되면 메소드가 리턴되어야합니다. 에이전트 클래스를로드 할 수 없거나 에이전트 클래스에 일치하는 agentmain 메소드가 없기 때문에 에이전트를 시작할 수없는 경우 JVM이 중단되지 않습니다. agentmain 메소드가 캐치되지 않은 예외를 throw하면 무시됩니다.

추신 : 나는 결코 이것을 시도한 적이 없습니다. 작동하는지 여부를 알려주세요.

+0

감사합니다. 더 간단한 '에이전트 jar'에 대한 옵션이 될 수 있지만이 특정 jar는 내부에 jar가 있습니다. 또한 'agentmain()'메소드를 구현하는 래퍼 클래스를 만들어야합니다. 클래스 경로가로드하려고 할 때 문제가 발생합니다. 글 머리 기호를 물고'agents' 디렉토리에 추가하고 시작 스크립트에 추가 할 것입니다. 장기간에 마이그레이션 할 플랫폼은 배치시 자동으로이 에이전트 jar를 감지하므로 임시 솔루션으로이 에이전트를 사용할 수 있습니다. –

+0

런타임 첨부는 클래스가 첨부시로드되지 않는다고 보장하지 않습니다. 그러나로드 된 클래스는 다른 모양을 허용하지 않고 다른 메소드 구현을 제공하기 위해서만 변경할 수 있습니다. –

0

fatain jar의 매니페스트에 premain 클래스를 작성하여 이전 에이전트를 에뮬레이트 할 수 있습니다. 그런 다음 javaagentjar 인수를 통해 팻 항아리를 간단히 추가하십시오.

계측 API가 매우 강력하고 공격의 진입 점을 제공 할 보안 관리자를 피할 수 있으므로이 문제를 피할 수 없습니다. 그러나 JDK 또는 Java 9 VM에서 자체 부착 할 수 있습니다. 바이트 - 버디 에이전트 라이브러리는이를 위해 미리 만들어진 종속성을 제공합니다. 이렇게하면 계측 인스턴스를 확보 한 후 수동으로 premain 메소드를 호출 할 수 있습니다.