2015-04-23 2 views
4

Я просто хотел попробовать себя с javassist и начал редактировать тело метода библиотеки. Чтобы подключиться к библиотеке, я присоединяю агента с помощью инструмента tools.jar, расположенного в '% JAVA_HOME% .. \ lib \'.Attach java agent from all-in-one-jar

Но мне не нравится идея каждого компьютера я использую это на том, JDK установлен только для tools.jar

не Есть еще один способ, как извлечение входа банки в мою последнюю банку?
Я сделал это с Javassist и, кажется, работает нормально (IntelliJ так и сделал. Он имеет хорошую функцию для этого http://puu.sh/hoiCo/bf19853b12.png)
Но делать это с tools.jar заканчивается в программе бросать исключения

Скриншот исключение http://puu.sh/hoiGd/844567bca2.png

public static void main(String[] args){ 
    if(args.length < 1){ 
     log("No ProcessID set"); 
     return; 
    } 
    String pid = args[0]; 
    VirtualMachine vm = null; 
    try{ 
     vm = VirtualMachine.attach(pid); 
     String filePath = AgentMain.class.getProtectionDomain().getCodeSource().getLocation().getPath(); 
     filePath = URLDecoder.decode(filePath, "UTF-8"); 
     if(filePath.startsWith("/")){ 
      filePath = filePath.substring(1); 
     } 
     log("Loading Agent... [" + filePath + "]"); 
     vm.loadAgent(filePath); 
    }catch(Exception ex){ 
     log("VM connection error [" + pid + "]"); 
     ex.printStackTrace(); 
    }finally{ 
     try{ 
      if(vm != null) vm.detach(); 
     }catch(Exception ex){} 
    } 
} 

Это мой код, используемый для инжекции агента.

Было бы здорово, если бы кто-то мог помочь.
Я надеюсь, вы понимаете :)

ответ

1

Этого проект может помочь вам: orbit/agent-loader

public class HelloAgent 
{ 
    public static void agentmain(String agentArgs, Instrumentation inst) 
    { 
     System.out.println(agentArgs); 
     System.out.println("Hi from the agent!"); 
     System.out.println("I've got instrumentation!: " + inst); 
    } 
} 

public static void main(String[] args) 
{ 
    AgentLoader.loadAgentClass(HelloAgent.class.getName(), "Hello!"); 
} 

Он связывает классы виртуальной машины внутри него, так что вам не нужен инструменты баночки, чтобы прикрепить агент во время выполнения.

Это на maven:

<dependency> 
    <groupId>com.ea.orbit</groupId> 
    <artifactId>orbit-agent-loader</artifactId> 
    <version>0.5.2</version> 
</dependency> 

Должна быть предусмотрена возможность связать его с приложением в одном банке.


Из ваших комментариев это не ясно, если вы это знаете, но вы также можете запустить программу с опцией VM: -javaagent:your-agent.jar

На стороне записки: В Intellij вы можете установить пусковые установки по умолчанию для java и модульные тесты, чтобы по умолчанию использовать -javaagent: something.jar. Интересно, что банку не нужно иметь действительные классы агентов, она просто нуждается в правильном manifest entries. (При условии, что ваши классы агентов находятся где-то в пути к классам проекта/модуля, который вы используете).

+0

Выглядит круто, но на самом деле я уже нашел решение. Я хотел, чтобы моя программа была «инъекционной», как DLL, поэтому опция -javaagent vm для меня не является решением. Но спасибо за другое решение :) – MexSource

Смежные вопросы