Прикрепить Java-агент из "все в одном"

Я просто хотел попробовать себя с javassist и начал редактировать тело метода библиотеки. Чтобы подключиться к библиотеке, я присоединяю агента с помощью tools.jar, расположенного в "%JAVA_HOME%..\lib\".

Но мне не нравится идея каждого компьютера, который я использую, при установке 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!");
}

Он объединяет классы VirtualMachine внутри него, поэтому вам не нужен jar инструментов для подключения агента во время выполнения.

Это на 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. Интересно, что банке не нужны фактические классы агентов, просто нужны соответствующие записи манифеста. (При условии, что ваши классы агентов находятся где-то в пути к классам проекта / модуля, который вы запускаете).

Другие вопросы по тегам