尝试使用Java代理获取对象大小时出现“未能加载Premain-Class清单属性”的错误

23

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

你收到了以下错误信息...还有什么问题吗?(你没有提出问题。) - JasCav
size.jar 的源代码在哪里?我猜我们需要它们。 - rochb
我们需要你的 ObjectSizeFetcher 类的源代码。 - rochb
4
我解决了这个问题。manifest.mf文件中在Premain-Class之前有一个不必要的空格。 - java_geek
9
我遇到了JaCoCo的这个问题。原因是它的Maven jar包内包含jacocoagent.jar。所以我需要执行dependency:unpack操作将其解压到临时目录中,然后从那里使用。 - Ondra Žižka
显示剩余2条评论
4个回答

10

请确保您已经给出了包含 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

最后一行是由于回车符造成的。


3
在这段代码中看不到,但是在文件末尾加入新行确实是必要的。 - Juraj Misur

6
您需要在MANIFEST.MF文件中添加以下内容:Premain-Class: org.your.package.ObjectSizeFetcher,请将其替换为原有的代码:Premain-Class: ObjectSizeFetcher

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

我只是登录来点赞这个答案,因为 cfm(特别是 m)正是解决我的问题的关键。其他答案中声称必须在清单文件中使用“新行”的说法是完全错误的。 - GJ.

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接