是否可以在java -javaagent:myagent.jar some.package.Main没有将代理包装到罐子的情况下运行?就像是java agent.MyAgent some.package.Main
我有一个代理的源代码,并希望能够调试它,然后更改它,因此根本不需要使用它-javaagent,而是选择some.package.Main通过GUI执行.
BTrace能够使用PID连接到正在运行的进程或使用连接到进程-javaagent.我正在寻找类似于第一种方法(使用PID)的东西,但我也可以从头开始一个过程.
目前可以使用代理运行JVM:
-javaagent:somejar.jar
Run Code Online (Sandbox Code Playgroud)
这种方式为了运行我写的Java代理,我必须将它放入jar中.因此它在调试方面受到限制.是否有一种在IDE中调试Java代理并将其附加到JVM的技术?
我在Java中有一个缓存应用程序,我需要在缓存中放置不同大小的对象.问题是我真的不知道如何计算自定义对象的大小,我找到了解决方案 - 使用该库:http://mvnrepository.com/artifact/com.googlecode.sizeofag/sizeofag/ 1.0.0.要使用库运行程序,我需要指定命令行参数-javaagent.那么,如果我使用maven怎么办?
该计划很简单:
protected static Boolean b;
public static void main( String[] args )
{
System.out.println(SizeOfAgent.sizeOf(b));
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
0
Can not access instrumentation environment.
Please check if jar file containing SizeOfAgent class is
specified in the java's "-javaagent" command line argument.
Run Code Online (Sandbox Code Playgroud)
PS我知道,这样的问题已经存在,但它没有正确的答案.
目前我正在尝试修改驻留在JVM已经加载的类中的方法体.我知道JVM实际上不允许更改已经加载的类的定义.但是我的研究使我得到了像JRebel或Java Instrumentation API这样的实现,两者都使用了基于代理的方法.我知道如何在代表Javassist加载类之前做到这一点.但是考虑到在应用程序启动时加载类定义的EJB环境中的JRebel,不应该在加载JVM的类上进行字节码修改吗?
我试图修改几个类的字节码,这些类的打包 jar 文件不在类路径中 - 它们ClassLoader在运行时由自定义加载给定 URL。我试图使用java agentwithClassFileTransformer希望拦截这些类,但失败了。类加载器是遗留项目的一部分,因此我无法直接对其进行更改。
代理在 AppClassLoader “本地”加载的类上工作正常,但只是忽略自定义类加载器加载的类。
自定义类加载器:
public class CustomClassLoader extends URLClassLoader {
public CustomClassLoader(URL[] urls) {
super(urls, CustomClassLoader.class.getClassLoader());
}
// violates parent-delegation pattern
@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
synchronized (getClassLoadingLock(name)) {
Class<?> clazz = findLoadedClass(name);
if (clazz == null) {
try {
clazz = findClass(name);
} catch (ClassNotFoundException e) {
}
if (clazz == null) {
clazz = getParent().loadClass(name);
}
}
if …Run Code Online (Sandbox Code Playgroud) 我觉得这是我应该知道的,但是java代理(用-javaagent指定)是否在一个单独的线程中运行?我已经读过Java代理是一个可嵌入的库,它运行嵌入在JVM中并拦截了类加载过程,但我想确定:它是否真的拦截它们(这听起来像是在另一个线程中运行并监视类加载)或者它是否由JVM通知(JVM调用它来解析类加载;它没有单独的线程)?
再一次,我觉得我应该能够弄明白,但对我好,我工作太辛苦了,我的大脑有点油炸:P
谢谢!
要使用spring AOP,我必须将-javaagent:C:/spring-agent-2.5.6.jar配置为JVM参数.但是有一个已经配置好的 jar,即-javaagent:C:/other.jar
现在我如何使用-javaagent配置两个罐子,以便两个罐子都能正常工作?
在Windows和Linux环境中,可能还有不同的方法可以使用-javaagent配置多个jar.请为两种环境建议解决方案.
我有一个简单的Java Maven项目,并希望使用Jolokia的JVM代理来获取JMX值.当我手动下载jolokia-jvm-1.1.5-agent.jar并添加java参数的绝对路径时,它可以工作-javaagent:/absolute/path/to/jolokia-jvm-1.1.5-agent.jar.
由于Jolokia下载页面还列出了maven依赖项(jolokia-core),我想知道是否可以直接将其包含在我的Maven构建中,而无需手动下载JVM代理程序?如何使用此javaagent运行我的程序?
我正在使用Java代理和Javassist为一些JDK类添加一些日志记录.本质上,当系统加载一些TLS类时,Javassist将为它们添加一些额外的字节码,以帮助我调试一些连接问题.
这是问题,因为这个类包含在代理jar中:
package com.something.myagent;
public class MyAgentPrinter {
public static final void sayHello() {
System.out.println("Hello!");
}
}
Run Code Online (Sandbox Code Playgroud)
在我的代理的转换方法中,假设我试图使用javassist调用该类:
// this is only called for sun.security.ssl.Handshaker
ClassPool cp = getClassPool(classfileBuffer, className);
CtClass cc = cp.get(className);
CtMethod declaredMethod = cc.getDeclaredMethod("calculateKeys");
declaredMethod.insertAfter("com.something.myagent.MyAgentPrinter.sayHello();");
cc.freeze();
return cc.toBytecode();
Run Code Online (Sandbox Code Playgroud)
你认为这会有效,但我得到了这个:
java.lang.NoClassDefFoundError: com/something/myagent/MyAgentPrinter
at sun.security.ssl.Handshaker.printLogLine(Handshaker.java)
at sun.security.ssl.Handshaker.calculateKeys(Handshaker.java:1160)
at sun.security.ssl.ServerHandshaker.processMessage(ServerHandshaker.java:292)
Run Code Online (Sandbox Code Playgroud)
有没有办法将该类[ MyAgentPrinter] 添加到应用程序的类路径?
我正在开发一个名为“Cloudnet-v3”的开源项目。我在本地计算机上使用符号链接 /data 到 IntelliJProjects-Folder 中的数据点。
我得到以下启动命令:
[java, -XX:+UseG1GC, -XX:MaxGCPauseMillis=50, -XX:-UseAdaptiveSizePolicy, -XX:CompileThreshold=100, -XX:+UnlockExperimentalVMOptions, -XX:+UseCompressedOops, -Dcom.mojang.eula.agree=true, -Djline.terminal=jline.UnsupportedTerminal, -Dfile.encoding=UTF-8, -Dio.netty.noPreferDirect=true, -Dclient.encoding.override=UTF-8, -Dio.netty.maxDirectMemory=0, -Dio.netty.leakDetectionLevel=DISABLED, -Dio.netty.recycler.maxCapacity=0, -Dio.netty.recycler.maxCapacity.default=0, -DIReallyKnowWhatIAmDoingISwear=true, -Dcloudnet.wrapper.receivedMessages.language=english, -Xmx372M, -javaagent: "/data/temp/caches/wrapper.jar", -cp, "/data/launcher/libs/io/kubernetes/client-java/4.0.0/client-java-4.0.0.jar:/data/launcher/libs/io/netty/netty-codec-http/4.1.36.Final/netty-codec-http-4.1.36.Final.jar:/data/launcher/libs/io/netty/netty-handler/4.1.36.Final/netty-handler-4.1.36.Final.jar:/data/launcher/libs/io/netty/netty-transport-native-epoll/4.1.36.Final/netty-transport-native-epoll-4.1.36.Final-linux-x86_64.jar:/data/launcher/libs/io/netty/netty-transport-native-kqueue/4.1.36.Final/netty-transport-native-kqueue-4.1.36.Final-osx-x86_64.jar:/data/launcher/libs/io/kubernetes/client-java-api/4.0.0/client-java-api-4.0.0.jar:/data/launcher/libs/io/kubernetes/client-java-proto/4.0.0/client-java-proto-4.0.0.jar:/data/launcher/libs/org/yaml/snakeyaml/1.19/snakeyaml-1.19.jar:/data/launcher/libs/commons-codec/commons-codec/1.11/commons-codec-1.11.jar:/data/launcher/libs/org/apache/commons/commons-compress/1.18/commons-compress-1.18.jar:/data/launcher/libs/org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.jar:/data/launcher/libs/com/squareup/okhttp/okhttp-ws/2.7.5/okhttp-ws-2.7.5.jar:/data/launcher/libs/com/google/guava/guava/25.1-jre/guava-25.1-jre.jar:/data/launcher/libs/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar:/data/launcher/libs/org/bouncycastle/bcprov-ext-jdk15on/1.59/bcprov-ext-jdk15on-1.59.jar:/data/launcher/libs/org/bouncycastle/bcpkix-jdk15on/1.59/bcpkix-jdk15on-1.59.jar:/data/launcher/libs/com/google/protobuf/protobuf-java/3.4.0/protobuf-java-3.4.0.jar:/data/launcher/libs/com/google/code/gson/gson/2.8.2/gson-2.8.2.jar:/data/launcher/libs/io/netty/netty-codec/4.1.36.Final/netty-codec-4.1.36.Final.jar:/data/launcher/libs/io/netty/netty-transport-native-unix-common/4.1.36.Final/netty-transport-native-unix-common-4.1.36.Final.jar:/data/launcher/libs/io/netty/netty-transport/4.1.36.Final/netty-transport-4.1.36.Final.jar:/data/launcher/libs/io/netty/netty-buffer/4.1.36.Final/netty-buffer-4.1.36.Final.jar:/data/launcher/libs/io/netty/netty-resolver/4.1.36.Final/netty-resolver-4.1.36.Final.jar:/data/launcher/libs/io/netty/netty-common/4.1.36.Final/netty-common-4.1.36.Final.jar:/data/launcher/libs/io/sundr/builder-annotations/0.9.2/builder-annotations-0.9.2.jar:/data/launcher/libs/io/swagger/swagger-annotations/1.5.12/swagger-annotations-1.5.12.jar:/data/launcher/libs/com/squareup/okhttp/logging-interceptor/2.7.5/logging-interceptor-2.7.5.jar:/data/launcher/libs/com/squareup/okhttp/okhttp/2.7.5/okhttp-2.7.5.jar:/data/launcher/libs/joda-time/joda-time/2.9.3/joda-time-2.9.3.jar:/data/launcher/libs/org/joda/joda-convert/1.2/joda-convert-1.2.jar:/data/launcher/libs/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar:/data/launcher/libs/org/checkerframework/checker-qual/2.0.0/checker-qual-2.0.0.jar:/data/launcher/libs/com/google/errorprone/error_prone_annotations/2.1.3/error_prone_annotations-2.1.3.jar:/data/launcher/libs/com/google/j2objc/j2objc-annotations/1.1/j2objc-annotations-1.1.jar:/data/launcher/libs/org/codehaus/mojo/animal-sniffer-annotations/1.14/animal-sniffer-annotations-1.14.jar:/data/launcher/libs/org/bouncycastle/bcprov-jdk15on/1.59/bcprov-jdk15on-1.59.jar:/data/launcher/libs/io/sundr/sundr-core/0.9.2/sundr-core-0.9.2.jar:/data/launcher/libs/io/sundr/sundr-codegen/0.9.2/sundr-codegen-0.9.2.jar:/data/launcher/libs/io/sundr/resourcecify-annotations/0.9.2/resourcecify-annotations-0.9.2.jar:/data/launcher/libs/com/squareup/okio/okio/1.6.0/okio-1.6.0.jar:/data/launcher/versions/3.0.0-RELEASE-e48128a/driver.jar:/data/temp/caches/wrapper.jar", de.dytanic.cloudnet.wrapper.Main, nogui]
Run Code Online (Sandbox Code Playgroud)
我当前的工作目录是:/data/temp/services/Lobby-1#4a517311-09e6-4f77-89a5-64b4bc15399a
因此,每当我在工作目录中并执行给定的命令时,它都会失败并出现以下错误:Error opening zip file or JAR manifest missing :
Error occurred during initialization of VM
agent library failed to init: instrument 完整日志
现在我想知道,因为它在自动环境中工作,但主分支源没有更改,例如更改了 /data/launcher 的路径而不是启动器 ( System.getProperty("cloudnet.launcher.dir", "/data/launcher"))[ https://github.com/CloudNetService/CloudNet- v3/blob/master/cloudnet-launcher/src/main/java/de/dytanic/cloudnet/launcher/Constants.java]。
简短的查找:ls -laR /Users/.../Documents/IdeaProjects/cloudnet-parent/data