2013-02-02 46 views
4

我在命令行中運行以下程序作爲示例應用程序:無法運行JDI跟蹤示例:錯誤:無法找到或加載主類

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

然後我在命令行中JDItrace例如運行:

java -cp "C:\Program Files\Java\jdk1.7.0_13\lib\tools.jar;D:\projects\JDI_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 -- 

該示例應用的聯合運行正確地,它包含在classpath中。 這是什麼原因? 我錯過了什麼?

謝謝

回答

1

編輯:它看起來像是類路徑相關。

我確實得到了這個工作(好吧,它彈出了GUI,但後來很快崩潰)。我用CLASSPATH環境變量,而不是-cp

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

所以,不漂亮,但後來它的工作。所以它看起來像新創建的虛擬機不會自動繼承-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%確定它會被使用)。

+0

但我不使用IDE。我從命令行運行一個java程序,然後嘗試追蹤它,我想知道它在技術上是否可行。你有沒有與工作示例的鏈接?謝謝 – Spiff

0

你的命令: java命令 「C:\ Program Files文件\的Java \ jdk1.7.0_13 \ LIB \ tools.jar中; d:\項目\ JDI_Trace \罐子\ trace.jar; D:\projects\PDFJavaFX\lib\PDFRenderer-0.9.1.jar」 COM /陽光/工具/例子/跟蹤/跟蹤COM /陽光/ pdfview/PDF查看器

說明: 新的虛擬機是由跟蹤創造了不同的類路徑。主類PDFViewerPDFRenderer**.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,它們是「home,options,main,suspend,quote和vmexec」。如果我們要配置新的VM選項,我們可以通過setValue方法(如設置「main」)設置「選項」。

相關問題