Java 以跨平台方式引用tools.jar的正确方法

Java 以跨平台方式引用tools.jar的正确方法,java,jvm,tooling,Java,Jvm,Tooling,我正在构建一个JVM诊断工具,并使用JMX连接到JVM,我在这里面临的问题是,我需要能够以一种兼容整个Unix和windows的方式加载tools.jar,目前,我正在使用gradle生成的运行脚本将tools.jar加载到类路径,但这种方法似乎依赖于太多的因素 有人知道推荐的或优雅的方法,可以让这个jar在类路径上可用,而不必盲目猜测它在哪里吗 这将返回知道tools.jar的ClassLoader实例。 如果您想要确切的路径,请使用 ((URLClassLoader) ToolPro

我正在构建一个JVM诊断工具,并使用JMX连接到JVM,我在这里面临的问题是,我需要能够以一种兼容整个Unix和windows的方式加载tools.jar,目前,我正在使用gradle生成的运行脚本将tools.jar加载到类路径,但这种方法似乎依赖于太多的因素

有人知道推荐的或优雅的方法,可以让这个jar在类路径上可用,而不必盲目猜测它在哪里吗

这将返回知道tools.jar的ClassLoader实例。 如果您想要确切的路径,请使用

    ((URLClassLoader) ToolProvider.getSystemToolClassLoader()).getURLs()
这将返回知道tools.jar的ClassLoader实例。 如果您想要确切的路径,请使用

    ((URLClassLoader) ToolProvider.getSystemToolClassLoader()).getURLs()

谢谢,有没有命令行开关可以让这些类在类路径中已经加载?@JuanAlbertoLópezcavalotti我不确定问题出在哪里。为什么不简单地将$JAVA_HOME/lib/tools.jar附加到运行脚本中的-classpath?或者,如果您需要在运行时加载它,请使用ToolProvider。根据所使用的安装,它可能位于不同的位置,也就是说,如果JAVA_HOME设置为JDK_HOME/jre,这是一个有效的配置,那么tools.jar将位于$JAVA_HOME/./lib/tools.jar中,因此我试图避免在类路径上有许多指向不同位置的条目。尽管如此,您知道JDK默认情况下不会在应用程序类加载器中加载这些的原因吗?@JuanAlbertoLópezcavalotti这就是ToolProvider的工作方式。如果它发现JAVA_HOME以/jre结尾,则加载../lib/tools.jar,否则加载lib/tools.jar。您可以在运行脚本中实现类似的逻辑。为了减少JRE下载量,JRE中没有包含工具。可以通过允许按需加载模块来改变情况。谢谢你,有没有命令行开关可以让这些类在类路径中已经加载?@JuanAlbertoLópezcavalotti我不确定问题出在哪里。为什么不简单地将$JAVA_HOME/lib/tools.jar附加到运行脚本中的-classpath?或者,如果您需要在运行时加载它,请使用ToolProvider。根据所使用的安装,它可能位于不同的位置,也就是说,如果JAVA_HOME设置为JDK_HOME/jre,这是一个有效的配置,那么tools.jar将位于$JAVA_HOME/./lib/tools.jar中,因此我试图避免在类路径上有许多指向不同位置的条目。尽管如此,您知道JDK默认情况下不会在应用程序类加载器中加载这些的原因吗?@JuanAlbertoLópezcavalotti这就是ToolProvider的工作方式。如果它发现JAVA_HOME以/jre结尾,则加载../lib/tools.jar,否则加载lib/tools.jar。您可以在运行脚本中实现类似的逻辑。为了减少JRE下载量,JRE中没有包含工具。可以通过允许按需加载模块来更改内容。