我写了一个可以远程调试Web应用程序的javaagent。它在很多框架中都能很好地工作,比如Tomcat,Jetty,甚至Scala Play。由于Groovy也运行在JVM上,我想知道它是否可以用于Grails。
在描述我的尝试之前,我应该解释一下我的代理。它启动了一个嵌入式Jetty服务器,并提供调试接口。我还编写了一个自定义类加载器来加载我的代理使用的所有类。
因此,我首先确保代理在groovy本地应用程序上工作正常。然后,我将javaagent参数添加到JAVA_OPTS中,并启动Grails应用程序。在premain阶段,jetty服务器成功启动,但当我向调试接口发送请求时,它没有返回任何内容,并且在控制台中可以找到一条关于类加载的警告消息。
我严格地按照JVM规范设计了我的javaagent(我认为),由于它可以在其他框架中使用,我想知道Grails的类加载有什么特别之处吗?
我的经纪人:https://github.com/uniquetruth/remote-debug-agent/tree/grail_research
你可以在README中简单地了解如何使用它。你也可以直接使用这个发行版,但是需要在jar文件中更改jetty的日志级别。在分支代码中,我已经打开了Jetty的日志,并为Jetty服务器添加了join(),这样我就可以阻止premain阶段,调试得更快。
Java版本:1.8
Groovy版本:4.0.2
Grails版本:5.1.8
Web应用程序:Grails的默认helloworld演示就可以了。
应用程序启动后,将此请求发送到调试接口http://localhost:8098/trace/
期望值:返回一些文本
目前情况:未返回任何内容,并且在控制台中发现警告:
接受失败
java.lang.NoClassDefFoundError:无法初始化类org.eclipse.jetty.server.HttpOutput
甚至没有堆栈跟踪。
1条答案
按热度按时间qf9go6mv1#
我想我自己已经弄明白了。这不是关于类加载的,Grails以分叉模式启动应用程序,如果我在shell中设置JAVA_OPTS,Grails CLI会接受它,而不是真正的应用程序。
在forked模式下将JAVA_OPTS添加到Grails应用程序的正确方法是编辑build.gradle文件中的bootRun配置。