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

Posted

技术标签:

【中文标题】尝试使用 java 代理获取对象的大小时“无法加载 Premain-Class 清单属性”【英文标题】:"Failed to load Premain-Class manifest attribute" while trying to get the size of an object using java agent 【发布时间】:2011-01-17 00:21:25 【问题描述】:

当我尝试运行 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);
    

【问题讨论】:

您收到以下错误...并且...? (你没有问问题。) size.jar 的来源在哪里?我想我们需要这些。 你能发布 Manifest 文件吗,我认为你在 manifest 文件中的 Premain-Class 不完全合格或者找不到那个类。 我解决了这个问题。 manifest.mf 文件在 Premain-Class 之前有一个空格,这不是必需的 我和 JaCoCo 有过这个。原因是它的 Maven jar 里面有 jacocoagent.jar。所以我需要做依赖:解压到一个 tmp 目录并从那里使用。 【参考方案1】:

确保您已提供包含 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

最后一行是由于回车。

【讨论】:

在这个sn-p中是看不到的,但是文件末尾的新行确实是必要的。【参考方案2】:

您应该在 MANIFEST.MF 中添加:

Premain-Class: org.your.package.ObjectSizeFetcher + 换行

插入

Premain-Class: ObjectSizeFetcher

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

只需运行java size.jar ObjectSizeTest 问题是由 java 代理引起的,它有一个转换器类。

【讨论】:

以上是关于尝试使用 java 代理获取对象的大小时“无法加载 Premain-Class 清单属性”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 java 中使用代理获取 URL 连接?

Java动态代理

Java面试时,面试官常问的问题

Java反射以及动态代理(上)

java.io.file对象中获取文件长度时 调用length方法 返回的是文件占用空间大小.如何获取文件自身的大小呢?

从doctrine2中的代理对象获取“true”对象