我目前正在编写一个attacher,它将代理附加到JVM进程,我一直遇到这个问题。下面是我的代码的简化版本:
import com.sun.tools.attach.VirtualMachine;
public class AgentAttacher {
public static void main(String[] args) {
try {
String pid = "some-pid-determined-elsewhere";
final VirtualMachine vm = VirtualMachine.attach(pid);
vm.loadAgent("agent.jar");
vm.detach();
} catch (Exception e) {
e.printStackTrace();
}
}
}
当运行java -jar AgentAttacher.jar
时,我得到以下错误:
java.util.ServiceConfigurationError: com.sun.tools.attach.spi.AttachProvider: Provider sun.tools.attach.WindowsAttachProvider could not be instantiated
我试过将tools.jar
从JDK的lib
目录添加到CLASSPATH
环境变量中,将其包含在MANIFEST.MF
的Class-Path
中,并在运行JAR时使用-cp
直接指定它。我相当肯定tools.jar
正在被加载,因为它在丢失时会给出不同的错误:
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/attach/VirtualMachine
我也得到了WindowsAttachProvider could not be instantiated
错误,而只使用VirtualMachine.list()
,所以我不认为这是有关使用attach()
与不正确的PID。
我尝试使用Class.forName()
加载类:
public class AgentAttacher {
public static void main(String[] args) {
try {
Class.forName("sun.tools.attach.WindowsAttachProvider");
} catch (Exception e) {
e.printStackTrace();
}
}
}
我得到了下面的堆栈跟踪:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no attach in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at sun.tools.attach.WindowsAttachProvider.<clinit>(WindowsAttachProvider.java:175)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at JavaAttacker.main(JavaAttacker.java:4)
如果我没有在类路径中包含tools.jar
,我会在这里得到一个不同的堆栈跟踪,所以我确信它正在被加载:
java.lang.ClassNotFoundException: sun.tools.attach.WindowsAttachProvider
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at JavaAttacker.main(JavaAttacker.java:4)
我的环境是VirtualBox上的Windows 10 Pro(1809)VM,使用JDK和JRE 1.8.0_212。
3条答案
按热度按时间wvmv3b1j1#
问题似乎是
attach.dll
无法从%JAVA_HOME%\jre\bin
加载。将jar运行为:
似乎已经工作了,只要在我的jar清单中在
Class-Path
下指定了tools.jar
。zvokhttg2#
在Java 8中,attach API是JVM默认不加载的单独jar的一部分。您必须将其显式包含在类路径中。通常,它位于JDK主目录的
\lib
文件夹中:htrmnn0y3#
我遇到了同样的问题,并以这种方式解决:
使用jdk 11构建源码,找不到
tools.jar
或tools.jar是windows这是我的pom.xml
然后: