尝试使用java代理获取对象的大小时“无法加载Premain-Class清单属性”

当我尝试运行java程序( java -javaagent:size.jar ObjectSizeTest )时,我收到以下错误:

 Failed to load Premain-Class manifest attribute from D:\workspace\ObjectSizeTest\size.jar Error occurred during initialization of VM agent library failed to init: instrument 

这是ObjectSizeTest的代码:

 public class ObjectSizeTest { public static void main(String[] args) { String s = new String("sai"); System.out.println(ObjectSizeFetcher.getObjectSize(s)); } } 

MANIFEST.MF(适用于size.jar):

 Manifest-Version: 1.0 Created-By: 1.5.0_18 (Sun Microsystems Inc.) Premain-Class: ObjectSizeFetcher 

这是ObjectSizeFetcher的代码:

 import java.lang.instrument.Instrumentation; public class ObjectSizeFetcher { private static Instrumentation instrumentation; public static void premain(String args, Instrumentation inst) { instrumentation = inst; } public static long getObjectSize(Object o) { return instrumentation.getObjectSize(o); } } 

确保您已提供包含pre-main方法的类的完整java路径。 例如像org.eclipse.anotherpckg.ObjectSizeFetcher。 其次,名称和运输结束前必须有一个空格。 例如

 Manifest-Version: 1.0 Created-By: 1.5.0_18 (Sun Microsystems Inc.) Premain-Class: org.eclipse.package.ObjectSizeFetcher 

最后一行是由于回车。

你应该添加MANIFEST.MF:

Premain-Class: org.your.package.ObjectSizeFetcher + new line

insted的

Premain-Class: ObjectSizeFetcher

这是jar命令本身的一个问题。 jar命令必须与cfm属性一起使用,以包含自定义的MANIFEST.MF,否则jar将创建一个文件并插入自己的内容,这些内容不包括我们在自定义manifest.mf文件中提到的PreMain-Class属性。