【发布时间】:2019-07-03 00:44:46
【问题描述】:
我正在尝试检测基于 Jetty 构建的 Oracle Rest Data Service (ORDS)。方面应该跟踪 JDBC 调用。我没有看到编织发生。
我在另一个使用 JDBC 的独立应用程序中尝试了 AspectJ,并且还在独立 Jetty 中运行的应用程序中分析了 Servlet 调用,所有这些都对我有用。但在这种情况下,有一个例外,看起来并没有编织正在发生。应用程序本身在应用了所有 AspectJ 配置后按预期工作。
尝试了两个选项:
- aspect 类和 aop 配置文件被放入 jar 中,这个 jar 被放置在 WEB-INF/lib 中。 aspectjrt.jar 也被复制到此目录中。
- 方面类和方面配置已复制到 WEB-INF/classes 像这样
├── WEB-INF
│ ├── beans.xml
│ ├── classes
│ │ ├── META-INF
│ │ │ ├── MANIFEST.MF
│ │ │ └── aop-ajc.xml
│ │ └── WhereTheStatementTimeGo.class
在这两种情况下都有如下异常。
这里是命令行和异常:
$JAVA_HOME/bin/java -javaagent:/DATA/PROJECTS/ASPECTJ19/lib/aspectjweaver.jar -Dorg.aspectj.tracing.enabled=true -Dorg.aspectj.tracing.factory=defaug.aspectj.tracing.messages=true -jar ords.war standalone
[JarClassLoader@17f052a3] warning parse definitions failed -- (IllegalStateException) sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$AppClassLoader@18b4aac2
java.lang.IllegalStateException: sun.misc.Launcher$AppClassLoader@18b4aac2
at oracle.dbtools.jarcl.NestedResourceHandler.jarClassLoader(NestedResourceHandler.java:36)
at oracle.dbtools.jarcl.NestedResourceHandler.openConnection(NestedResourceHandler.java:23)
at java.net.URL.openConnection(URL.java:979)
at java.net.URL.openStream(URL.java:1045)
at org.aspectj.weaver.loadtime.definition.DocumentParser.saxParsing(DocumentParser.java:157)
at org.aspectj.weaver.loadtime.definition.DocumentParser.parse(DocumentParser.java:123)
at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.parseDefinitions(ClassLoaderWeavingAdaptor.java:290)
at org.aspectj.weaver.loadtime.DefaultWeavingContext.getDefinitions(DefaultWeavingContext.java:130)
at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.initialize(ClassLoaderWeavingAdaptor.java:174)
at org.aspectj.weaver.loadtime.Aj$ExplicitlyInitializedClassLoaderWeavingAdaptor.initialize(Aj.java:337)
at org.aspectj.weaver.loadtime.Aj$ExplicitlyInitializedClassLoaderWeavingAdaptor.getWeavingAdaptor(Aj.java:342)
at org.aspectj.weaver.loadtime.Aj$WeaverContainer.getWeaver(Aj.java:316)
at org.aspectj.weaver.loadtime.Aj.preProcess(Aj.java:108)
at org.aspectj.weaver.loadtime.ClassPreProcessorAgentAdapter.transform(ClassPreProcessorAgentAdapter.java:51)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.lang.ClassLoader.defineClass(ClassLoader.java:642)
at oracle.dbtools.jarcl.JarClassLoader.findClass(JarClassLoader.java:77)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at oracle.dbtools.jarcl.Entrypoint.invoke(Entrypoint.java:50)
at oracle.dbtools.jarcl.Entrypoint.main(Entrypoint.java:77)
2019-07-02 16:47:29.822:INFO::main: Logging initialized @3375ms to org.eclipse.jetty.util.log.StdErrLog
Jul 02, 2019 4:47:29 PM
INFO: HTTP and HTTP/2 cleartext listening on port: 8080
Jul 02, 2019 4:47:29 PM
INFO: Disabling document root because the specified folder does not exist: /Users/slinetsk/Downloads/ORDS/ords/standalone/doc_root
2019-07-02 16:47:30.632:INFO:oejs.Server:main: jetty-9.4.z-SNAPSHOT; built: 2019-02-20T15:50:58.683Z; git: 3285c4dd4bb00caddcded77f8e44e72c61b9ab72; jvm 1.8.0_211-b12
2019-07-02 16:47:30.693:INFO:oejs.session:main: DefaultSessionIdManager workerName=node0
2019-07-02 16:47:30.693:INFO:oejs.session:main: No SessionScavenger set, using defaults
2019-07-02 16:47:30.694:INFO:oejs.session:main: node0 Scavenging every 600000ms
输出中没有任何 AspectJ 跟踪相关信息
【问题讨论】:
-
欢迎来到 SO,谢尔盖。这就是它在这里的工作方式:首先你了解MCVE 是什么,然后你提供一个,或者在你的问题中内联(单击“编辑”),或者你可以添加一个指向包含 MCVE 的 GitHub 存储库的链接(删除版权-首先是受保护的东西,然后留出足够的空间让我构建和运行应用程序,例如通过 Maven,然后重现问题)。仅错误日志不足以让我回答您的问题。
-
谢谢。我确实有一个例子,但它不符合 MCVE 的条件。它是 VirtualBox 的虚拟机,里面有 Oracle DB 和 ORDS。问题是 VM 映像的大小为 26GB。我希望 Jar 类加载器的问题是已知的。
-
我确信一个简单的 Jetty 设置也可以在容器外运行。也许这个问题也可以通过另一个不需要 Oracle DB 在后台的第 3 方库重现。即使它确实需要一个 Oracle 库,也可能在进行真正的数据库访问之前发生错误,堆栈跟踪建议类加载时间。那应该是可重现的。你需要帮助吗?帮助您的潜在帮手!通过创建 MCVE,您通常甚至可以更多地了解您自己的问题。
-
Jetty 本身一切正常,我将尝试访问 ORDS 的源代码以查看 oracle.dbtools.jarcl 的使用方式(部分 oracle.dbtools.jarcl.JarClassLoader.findClass (JarClassLoader.java:77在调用栈)创建MCVE
-
其实我下载了ORDS,可以重现错误。看起来 Oracle 的自定义 JAR 类加载器做了一些 AspectJ 编织代理不喜欢但没有准备好的解决方案。我尝试通过
-Daj.weaving.loadersToSkip=oracle.dbtools.jarcl.JarClassLoader排除类加载器。这行得通,但是编织器将不再在库 JAR 中编织任何东西。您可以创建一个自定义 WAR,并在其中解压缩感兴趣的库。丑陋,但至少编织者会找到目标类。