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

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

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

Затем я запускаю в командной строке пример трассировки JDI:

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. В чем причина этого? Что мне не хватает?

Спасибо

2 ответа

Решение

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

Я заставил это работать (хорошо, это выскочило GUI, но затем разбилось довольно быстро). Я использовал переменную окружения 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%, что он будет полезен).

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

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

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

Другие вопросы по тегам