2015-04-09 2 views
2

Я пытаюсь использовать функцию HotSwap для байтового приятеля. К сожалению, я получаю некоторые ошибки. Я прочитал документацию на official website, и я знаю, что она работает только тогда, когда программа использует Java-агент. Я пытался поставить -javaagent параметр на старте виртуальной машины Java, которая выглядит следующим образом:Byte Buddy - HotSwap с ByteBuddyAgent

-javaagent: C: \ Lib \ байт-Buddy-агент-0.5.6.jar

Это производит следующее сообщение об ошибке при запуске моего приложения:

java.lang.ClassNotFoundException: 
    net.bytebuddy.agent.ByteBuddyAgent.Installer 

FATAL ERROR in native method: processing of -javaagent failed 

    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at 
    java.lang.ClassLoader.loadClass(ClassLoader.java:424) at 
    sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at 
    java.lang.ClassLoader.loadClass(ClassLoader.java:357) at 
    sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:304) 
    at 
    sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401) 
    Exception in thread "main" Java Result: 1 

тем не менее я попытался использовать ByteBuddyAgent.installOnOpenJDK() метод вместо -javaagent параметра в надежде, что будет решить эту проблему. Но это бросает следующие ошибки, которая опирается на одной и той же проблемы, я думаю:

java.lang.ClassNotFoundException: net.bytebuddy.agent.ByteBuddyAgent$Installer 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:304) 
    at sun.instrument.InstrumentationImpl.loadClassAndCallAgentmain(InstrumentationImpl.java:411) 
Apr 09, 2015 1:35:01 PM net.bytebuddy.agent.ByteBuddyAgent doInstall 
INFORMATION: Cannot delete temporary file: C:\Users\Flo\AppData\Local\Temp\byteBuddyAgent4745240427430305215.jar 
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1770) 
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1653) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
    ... 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    ... 
Caused by: java.lang.IllegalStateException: The programmatic installation of the Byte Buddy agent is only possible on the OpenJDK and JDKs with a compatible 'tools.jar' 
    at net.bytebuddy.agent.ByteBuddyAgent.installOnOpenJDK(ByteBuddyAgent.java:176) 
    at hotswapping.FXMLDocumentController.handleByteBuddyButton(FXMLDocumentController.java:90) 
    ... 60 more 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at net.bytebuddy.agent.ByteBuddyAgent.doInstall(ByteBuddyAgent.java:199) 
    at net.bytebuddy.agent.ByteBuddyAgent.installOnOpenJDK(ByteBuddyAgent.java:174) 
    ... 61 more 
Caused by: com.sun.tools.attach.AgentInitializationException: Agent JAR loaded but agent failed to initialize 
    at sun.tools.attach.HotSpotVirtualMachine.loadAgent(HotSpotVirtualMachine.java:121) 
    ... 67 more 

Кто-нибудь знает, что это проблема, или я неправильно что-то из учебника? Btw Я попробовал его с jdk1.7.0_55 и jdk1.8.0_40 и использовал neatbeans как ide. Версия байта, который я использую, v0.5.6. Спасибо за помощь.

EDIT:

кажется, что ошибка с -javaagent параметром является ошибка в текущей версии, благодаря Rafael Winterhalter для быстрого реагирования.

Я также выяснил, что было проблемой с методом ByteBuddyAgent.installOnOpenJDK(). Это была действительно глупая ошибка с моей стороны. Кажется, мои netbeans используют более старую версию java как jdk1.8.0_40, поэтому я изменил переменную netbeans_jdkhome в файле netbeans.conf в папке etc netbeans. Теперь, когда мои netbeans используют ту же версию java, что и мои проекты, кажется, что она работает как шарм даже с приложениями JavaFX. Странно, что эта ошибка произошла только в приложениях JavaFX, в обычных Java-приложениях у меня никогда не было таких проблем. FYI: Вот пример кода моего приложения JavaFX:

package testbytebuddy; 

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 
import net.bytebuddy.agent.ByteBuddyAgent; 

public class TestByteBuddy extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     Button btn = new Button(); 
     btn.setText("Say 'Hello World'"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       System.out.println("Hello World!"); 
      } 
     }); 

     StackPane root = new StackPane(); 
     root.getChildren().add(btn); 

     Scene scene = new Scene(root, 300, 250); 

     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     System.out.println("Start application"); 
     ByteBuddyAgent.installOnOpenJDK(); 
     launch(args); 
     System.out.println("End application"); 

    } 

} 
+0

Первый из-за ошибки из-за ошибки, последняя точка должна быть знаком доллара. Извините за это, он будет исправлен для следующего выпуска. Вы пытались запустить установку на открытом методе jdk самостоятельно в основном методе на вашей виртуальной машине? Интересно, есть ли путаница загрузчика класса. Кроме того, вы запускаете Mac? Их jvms иногда различаются, и я тестирую только Linux и Windows. –

+0

Прежде всего, спасибо за быстрый ответ. Я использую машину Windows 8.1. Что именно вы подразумеваете под «последней точкой должен быть знак доллара»? Да Я запускаю установку на открытом методе jdk в основном методе. Это приложение javaFx, и в этот момент он всегда терпит неудачу. Для целей тестирования я попробовал установку на открытом jdk-методе в обычном java-приложении. Кажется, он работает там, потому что я не получаю никаких ошибок. Может быть, он полагается на приложение javaFX? – grill2010

+0

Примерно $, я имею в виду, что я случайно ссылаюсь на класс установщика как на пакет с именем ByteBuddyAgent, а не как внутренний класс. Вы пытались установить агент за пределами JavaFX? Вы можете позже получить его, вызвав метод getInstrumentation. В любом случае, я хочу посмотреть на него. Не могли бы вы создать пример минимального кода, который воспроизводит ошибку? Помогло бы тонну! –

ответ

2

Проблема с использованием агента непосредственно является ошибка в байте Бадди, где я ссылаться на основной класс агента с net.bytebuddy.agent.ByteBuddyAgent.Installer и не с net.bytebuddy.agent.ByteBuddyAgent$Installer, как было бы правильно , Это будет исправлено для Byte Buddy 0.5.7, которое должно быть выпущено в конце апреля/начале Май.

Для второй ошибки кажется, что вы использовали связанный JDK, который не позволяет программную привязку агента. Было трудно увидеть, как этот результат в аналогичном сообщении об ошибке. Программная привязанность - это то, что может пойти не так, поэтому сложно предоставить более подробную информацию о фактической причине. Хорошо, что вы это поняли.

Этот ответ уже был решен в комментариях, это должно служить обзором для потенциальных будущих читателей.

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