gpt4 book ai didi

java - 代理 JAR 已加载但代理无法初始化

转载 作者:行者123 更新时间:2023-11-30 07:53:14 25 4
gpt4 key购买 nike

我正在尝试使用代理“注入(inject)”一个 jar,现在 Java 版本都是 1.8,工具来 self 的 JDK lib 文件夹,所以我认为这也没有任何问题

这是我的加载类

public static void main(final String[] args) throws Exception {
final File jarFile = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
System.out.println("Starting Lizard...");
try {
Class.forName("com.sun.tools.attach.VirtualMachine");
}
catch (ClassNotFoundException e2) {
System.out.println("ERROR: Couldn't load VirtualMachine class, is tools.jar present?");
return;
}
System.out.println("Loading attach library...");
extractLibrary(jarFile);
try {
System.loadLibrary("attach");
}
catch (Exception e3) {
System.out.println("ERROR: Couldn't load attach libary!");
return;
}

System.out.println("Attach library loaded.");
System.out.println("Searching for Minecraft JVM...");
for (final VirtualMachineDescriptor descriptor : VirtualMachine.list()) {
if (descriptor.displayName().startsWith("net.minecraft.launchwrapper.Launch")) {
System.out.println("Minecraft found, attaching...");
System.out.println(descriptor.id());
final VirtualMachine vm = VirtualMachine.attach(descriptor.id());
final String vmJavaVersion = vm.getSystemProperties().getProperty("java.version");
final String clientJavaVersion = System.getProperty("java.version");
System.out.println("vmJava: " + vmJavaVersion);
System.out.println("ClientJava: " + clientJavaVersion);
if (!vmJavaVersion.equals(clientJavaVersion)) {
System.out.println("WARN: Lizard and Minecraft Java version do not match, agent might fail!");
}
System.out.println("Loading agent...");
try {
vm.loadAgent(jarFile.getAbsolutePath());
}
catch (Exception e) {
System.out.println("ERROR: Agent failed to load (" + e.getMessage() + ")!");
System.out.println("1: "+ e);
e.printStackTrace();
return;
}
System.out.println("Agent successfully loaded, detaching...");
vm.detach();
System.out.println("Lizard started successfully.");
System.exit(0);
return;
}
}
System.out.println("Minecraft not found, exiting.");
JOptionPane.showMessageDialog(null, "No Minecraft JVM found.", "Lizard", 0);
}

这是我的agentmain

public static void agentmain(String args, Instrumentation instrumentation) {
try {
@SuppressWarnings("rawtypes")
Class[] arrclass = instrumentation.getAllLoadedClasses();
int n = arrclass.length;
int n2 = 0;
while (n2 < n) {
Class<?> clazz = arrclass[n2];
if (clazz.getName().equals("net.minecraft.client.Minecraft")) {
LaunchClassLoader classLoader = (LaunchClassLoader)clazz.getClassLoader();
classLoader.addURL(Agent.class.getProtectionDomain().getCodeSource().getLocation());
Class<?> spookyNan = classLoader.loadClass(gorilla.Gorilla.class.getName());
spookyNan.newInstance();
return;
}
++n2;
}
}


catch (Exception e) {
JOptionPane.showMessageDialog(null, e.toString());
JOptionPane.showMessageDialog(null, e.getStackTrace());
}
}

现在我得到的堆栈跟踪是:

com.sun.tools.attach.AgentInitializationException: Agent JAR loaded but agent failed to initialize
at sun.tools.attach.HotSpotVirtualMachine.loadAgent(HotSpotVirtualMachine.java:121)
at com.sun.tools.attach.VirtualMachine.loadAgent(VirtualMachine.java:540)
at gorilla.Main.main(Main.java:47)

Line47 就是这条线

vm.loadAgent(jarFile.getAbsolutePath());

最佳答案

AgentInitializationException: Agent JAR loaded but agent failed to initialize 意味着 agentmain 方法抛出了一个未捕获的异常。检查控制台或目标 Java 应用程序 (Minecraft) 的日志以查看原因。

注意:一旦您将代理加载到目标应用程序中,您将无法加载同一代理的修改版本。这尤其意味着,如果您的代理曾经因异常而失败,即使您修复了错误并尝试再次加载正确的类,代理仍然会因相同的错误而失败。

为了加载更新的代理,您必须重命名代理类并将其打包到不同 JAR 文件中。

关于java - 代理 JAR 已加载但代理无法初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44987359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com