Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';t运行JDI跟踪示例:错误:无法找到或加载主类_Java_Jdi - Fatal编程技术网

Java Can';t运行JDI跟踪示例:错误:无法找到或加载主类

Java Can';t运行JDI跟踪示例:错误:无法找到或加载主类,java,jdi,Java,Jdi,我在命令行中运行以下程序作为示例应用程序: java-cp“D:\projects\PDFJavaFX\lib\PDFRenderer-0.9.1.jar” com/sun/pdfview/PDFViewer 然后在命令行中运行示例: java-cp“C:\Program Files\Java\jdk1.7.0\u 13\lib\tools.jar;D:\projects\JDI\u Trace\jar\Trace.jar;D:\projects\PDFJavaFX\lib\PDFRendere

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

java-cp“D:\projects\PDFJavaFX\lib\PDFRenderer-0.9.1.jar” com/sun/pdfview/PDFViewer

然后在命令行中运行示例:

java-cp“C:\Program Files\Java\jdk1.7.0\u 13\lib\tools.jar;D:\projects\JDI\u Trace\jar\Trace.jar;D:\projects\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 --
示例应用程序运行正常,并且包含在类路径中。 这是什么原因? 我错过了什么


谢谢编辑:看起来它与类路径相关

我确实做到了(它弹出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());
}
也许其中一个是有用的?祝你好运

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


如果您想查看,我正在使源代码可共享(尽管我不能100%确定它是否有用)。

您的命令: java-cp“C:\ProgramFiles\java\jdk1.7.0\u 13\lib\tools.jar; D:\projects\JDI\u Trace\jar\Trace.jar;
D:\projects\PDFJavaFX\lib\PDFRenderer-0.9.1.jar
“ com/sun/tools/example/trace/trace com/sun/pdfview/PDFViewer

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

事实上,Trace类使用JDI来启动新的VM,但它只设置main选项并放弃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);
映射连接器参数(启动连接器连接器,字符串主参数){
映射参数=connector.defaultArguments();
连接器参数mainArg=
(Connector.Argument)arguments.get(“main”);
//由我补充:开始
java.util.Set argsString=arguments.keySet();
System.out.println(“连接器参数大小为:”+argsString.size());
for(字符串arg:argsString){
System.out.println(arg+“=”+参数.get(arg.description()+“=”+参数.get(arg.value());
//由我补充:结束
}
if(mainArg==null){
抛出新错误(“错误的启动连接器”);
}
mainArg.setValue(mainArgs);

参数大小的输出是6,它们是“home、options、main、suspend、quote和vmexec”。如果我们想要配置新的VM选项,我们可以通过setValue方法设置“options”,比如设置“main”.

但我不使用IDE。我从命令行运行java程序,然后尝试跟踪它,我想知道这在技术上是否可行。你有一个工作示例的链接吗?谢谢
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);