Java Can';t运行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\PDFRenderer-0.9.1.jar” com/sun/tools/example/trace/trace com/sun/pdfview/PDFViewer 我得到这个错误: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
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);