无法运行JDI跟踪示例:错误:无法找到或加载主类

时间:2013-02-02 10:52:46

标签: java jdi

我在命令行中运行以下程序作为示例应用程序:

  

java -cp“D:\ projects \ PDFJavaFX \ lib \ PDFRenderer-0.9.1.jar”   COM /太阳/ pdfview / PDF查看器

然后我在命令行中运行JDI trace示例:

  

java -cp“C:\ Program   文件\爪哇\ jdk1.7.0_13 \ lib中\ tools.jar中; d:\项目\ JDI_Trace \罐\ trace.jar;的 d:\项目\ PDFJavaFX \ lib中\ PDFRenderer-0.9.1.jar ”   com / sun / tools / example / trace / Trace com / sun / pdfview / PDFViewer

我收到此错误:

Error: Could not find or load main class com.sun.pdfview.PDFViewer
 -- VM Started --
 -- The application exited --

示例应用程序正确运行,它包含在类路径中。 这是什么原因? 我错过了什么?

由于

2 个答案:

答案 0 :(得分:1)

编辑:看起来它与类路径有关。

我确实让它工作了(好吧,它弹出了GUI但很快就崩溃了)。我使用了classpath环境变量而不是-cp

C:\cos126\dev\debug>set CLASSPATH=%CLASSPATH%;c:\tmp\PDFRenderer-0.9.1.jar;c:\tmp\debug

所以,不漂亮,但它确实有效。因此看起来新创建的VM不会自动继承-cp。我很乐观,但不确定,在启动新VM时可能会有一个选项可以为您执行此操作。要查看VM启动选项的“文档”,您可以添加一些代码,如

for (Map.Entry<String, Connector.Argument> arg : arguments.entrySet()) {
   System.out.println(arg.getValue().name()+" "+arg.getValue().description());
}

到Trace.java。当我这样做时,它打印出来

home Home directory of the SDK or runtime environment used to launch the application
options Launched VM options
main Main class and arguments, or if -jar is an option, the main jar file and arguments
suspend All threads will be suspended before execution of main
quote Character used to combine space-delimited text into a single command line argument
vmexec Name of the Java VM launcher

所以也许其中一个是有用的?祝你好运!

顺便说一下,这就是我使用JDI的原因:

http://cscircles.cemc.uwaterloo.ca/java-visualize/

我正在使源可共享,如果你想看到它(虽然我不是100%肯定它会有用)。

答案 1 :(得分:0)

您的命令: java -cp&#34; C:\ Program Files \ Java \ jdk1.7.0_13 \ lib \ tools.jar; d:\ PROJECTS \ JDI_Trace \罐子\ trace.jar; D:\projects\PDFJavaFX\lib\PDFRenderer-0.9.1.jar&#34; com / sun / tools / example / trace / Trace com / sun / pdfview / PDFViewer

说明: Trace创建的新VM具有不同的类路径。主要类PDFViewer位于PDFRenderer**.jar,但新VM并不知道jar,因此无法找到主类。我使用Eclipse时也遇到了这个问题。通过更改工作目录,我可以成功运行它。

实际上,Trace类使用JDI来启动新VM,但它只设置主选项并丢弃vm选项。下面的代码引自Thrace类源文件,我添加了一些行来打印选项。

Map<String, Connector.Argument> connectorArguments(LaunchingConnector connector, String mainArgs) {
    Map<String, Connector.Argument> arguments = connector.defaultArguments();
    Connector.Argument mainArg =
                 (Connector.Argument)arguments.get("main");
    //added by me: begin
    java.util.Set<String> argsString = arguments.keySet();
    System.out.println("connector args size is :" + argsString.size());
    for (String arg : argsString) {
        System.out.println(arg + "=="+ arguments.get(arg).description()+"=="+arguments.get(arg).value()) ;
    //added by me: end
    }
    if (mainArg == null) {
        throw new Error("Bad launching connector");
    }
    mainArg.setValue(mainArgs);

参数大小的输出为6,它们是&#34; home,options,main,suspend,quote和vmexec&#34;。如果我们要配置新的VM选项,我们可以设置&#34;选项&#34;通过setValue方法,如设置&#34; main&#34;。