首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字节Buddy -带有HotSwap的ByteBuddyAgent

字节Buddy -带有HotSwap的ByteBuddyAgent
EN

Stack Overflow用户
提问于 2015-04-09 11:54:35
回答 1查看 1.6K关注 0票数 2

我正在尝试使用字节伙伴的HotSwap特性。不幸的是我收到了一些错误。我已经阅读了官方网站上的文档,并且我知道只有当程序使用Java时,它才能工作。我尝试将-javaagent参数放在Java虚拟机的启动上,如下所示:

-javaagent:C:\lib\字节-巴迪-代理-0.5.6.jar

这将在启动我的应用程序时产生以下错误:

代码语言:javascript
复制
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参数来解决这个问题。但是这会抛出以下错误,这依赖于我认为相同的问题:

代码语言:javascript
复制
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

有人知道问题出在哪里吗?还是我误解了教程中的一些内容?顺便说一句,我在jdk1.7.0_55和jdk1.8.0_40中尝试过,并使用neatbean作为ide。我使用的字节伙伴版本是v0.5.6。谢谢你的帮助。

编辑:

-javaagent参数的错误似乎是当前版本中的一个错误,感谢拉斐尔温特的快速响应。

我还发现了ByteBuddyAgent.installOnOpenJDK()方法的问题所在。对我来说这是个愚蠢的错误。我的netbeans似乎使用一个较旧的java版本作为jdk1.8.0_40,因此我在netbeans的etc文件夹中更改了netbeans.conf文件中的netbeans_jdkhome变量。现在,我的netbeans使用了与我的项目相同的java版本,即使在JavaFX应用程序中,它似乎也很有魅力。唯一奇怪的是,这个错误只发生在JavaFX应用程序中,而在普通的Java应用程序中,我从来没有遇到过这个问题。FYI:下面是我的JavaFX应用程序的代码示例:

代码语言:javascript
复制
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");

    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-11 10:22:13

直接使用代理的问题是Buddy中的一个bug,在这里,我用net.bytebuddy.agent.ByteBuddyAgent.Installer而不是net.bytebuddy.agent.ByteBuddyAgent$Installer引用代理的主类,因为它是正确的。这将被修正为Buddy 0.5.7,它应该在4月底/ Mai的初发布。

对于第二个错误,您似乎使用了捆绑的JDK,它不允许代理的编程附件。很难在类似的错误消息中看到这个结果。但是,程序附件可能出错,因此很难提供关于实际原因的更详细的信息。很好你搞清楚了。

这个答案已经在评论中解决了,这应该作为未来潜在读者的一个概述。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29537813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档