【问题标题】:JavaAgent on Java 9Java 9 上的 Java 代理
【发布时间】:2017-07-04 12:55:46
【问题描述】:

在java 9之前,监控JavaAgentboostrapClassloader加载到JVM中,以便被监控的应用程序可以访问它们

在 Java 9 模块化架构中,只有 java.base module 被加载到 Bootstrap 类加载器中,所以 Java 代理只能访问 java.base 中的类? 它默认不能访问java.base之外的任何东西?

需要在javaAgent 中进行哪些更改才能访问其他模块,例如 java.sql?

【问题讨论】:

  • 您有与此相关的异常或错误吗?您可以将其添加到问题中吗?

标签: java java-9 java-platform-module-system


【解决方案1】:

我刚刚在最新版本和使用时验证了这一点

Instrumentation::appendToBootstrapClassLoaderSearch

该类被添加到引导加载程序(null)并加载到此加载程序的unnamed module。 Java 9 ea-176 也是如此。

【讨论】:

  • 您是否建议使用以下 API
  • 您只能附加您自己的 jar 文件,然后在引导类加载器上运行。您不能以这种方式添加模块。您是否尝试在应用程序启动后添加 sql 模块?使用 Java 代理无法做到这一点。
  • Java 代理被加载到系统类加载器的未命名模块中。这允许它读取系统类加载器可见的任何模块的任何导出类型。 Instrumentation API 也进行了更改,如果您想阅读此模块的其他包,则允许添加导出。
  • Java 代理从未被引导加载程序加载。它们总是以系统类路径结束。
  • 也许您将相同的类添加到您的代理和引导类 jar 中,或者甚至将代理 jar 引用为引导 jar?后者在 Java 9 中不起作用,因为引导和系统类加载器的未命名模块是不同的,它们不能共享包。不过,它也可能会在 Java 8 上引起问题。创建两个不同的罐子!无论如何,您的代理都可以使用 boor jar。
【解决方案2】:

这里是 JDK 9 EA 版本中 java.lang.instrument 包描述的链接:

http://download.java.net/java/jdk9/docs/api/java/lang/instrument/package-summary.html

“加载代理类和代理类可用的模块/类”部分应该有助于此处的讨论。

关于 java.sql 模块,它是几个不再定义给引导加载程序的“非核心”模块之一。将这些模块移动到平台类加载器意味着它们可以在减少权限的情况下运行,因此有助于平台的整体安全性。这对于类路径上的应用程序和库应该是完全透明的,并且只应通过以下代码引起注意:(a) 使用 -Xbootclasspath/a 运行,(b) 创建一个以 null 作为父级的自定义类,以及 (c) 代理支持使用 Boot-Class-Path 属性或 appendToBootstrapClassLoaderSearch API 添加到引导类加载器搜索的类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多