Не удается запустить пример трассировки JDI: ошибка: не удалось найти или загрузить основной класс

Я запускаю в командной строке следующую программу в качестве примера приложения:

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

Затем я запускаю в командной строке JDI < пример href="http://docs.oracle.com/javase/7/docs/technotes/guides/jpda/trace.html" rel="nofollow">trace:

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 --

Пример приложения работает правильно и включен в путь к классам. В чем причина этого? Что мне не хватает?

Спасибо


person Spiff    schedule 02.02.2013    source источник


Ответы (2)


Изменить: похоже, что это связано с classpath.

Я заставил это работать (ну, это выскочило с графическим интерфейсом, но затем довольно быстро разбилось). Я использовал переменную окружения classpath вместо -cp:

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

Итак, не красиво, но потом это сработало. Таким образом, похоже, что вновь созданная виртуальная машина не наследует автоматически -cp. Я настроен оптимистично, но не уверен, что при запуске новой виртуальной машины можно изменить параметр, который сделает это за вас. Чтобы увидеть «документацию» для параметров запуска виртуальной машины, вы можете добавить код, например

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%, что он будет полезен).

person daveagp    schedule 04.06.2013
comment
Но я не использую IDE. Я запускаю java-программу из командной строки, а затем пытаюсь ее отследить, интересно, возможно ли это технически. У вас есть ссылка с рабочим примером? Спасибо - person Spiff; 05.06.2013

Ваша команда: 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

Объяснение : Новая виртуальная машина, созданная трассировкой, имеет другой путь к классу. основной класс PDFViewer находится в PDFRenderer**.jar, но новая виртуальная машина не знает банку, поэтому не может найти основной класс. Я также столкнулся с этой проблемой, когда использовал Eclipse. И, изменив рабочий каталог, я могу успешно запустить его.

На самом деле класс Trace использует JDI для запуска новой виртуальной машины, но он устанавливает только основной параметр и отбрасывает параметры виртуальной машины. Приведенный ниже код взят из исходного файла класса 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». Если мы хотим настроить новые параметры виртуальной машины, мы можем установить «параметры» с помощью метода setValue, например, настроив «основной».

person ridox    schedule 23.09.2014