我在命令行中运行以下程序作为示例应用程序:
java -cp“D:\ projects \ PDFJavaFX \ lib \ PDFRenderer-0.9.1.jar” COM /太阳/ pdfview / PDF查看器
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 --
示例应用程序正确运行,它包含在类路径中。 这是什么原因? 我错过了什么?
由于
答案 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;。