Java не может открыть pdf с помощью Runtime

Мне нужно открыть PDF-файл при нажатии JMenuItem. Я могу открыть PDF-файл, щелкнув пункт меню, если я запускаю свою программу из netbeans. Но когда я запускаю файл jar, он не открывается. Я очищаю и строю свой проект. Но никаких изменений. Запускается при запуске из netbeans, но не из файла jar. Мне нужно добавить некоторую библиотеку.

Мои коды следующие

m_aboutItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            Runtime rt = Runtime.getRuntime();
           //System.out.println(Menubar1.getDefaultLocale());
                URL link2=Menubar1.class.getResource("/newpkg/Documentation.pdf");
                String link=link2.toString();
                link=link.substring(6);
                System.out.println(link);
                System.out.println(link2);
                String link3="F:/new/build/classes/newpkg/Documentation.pdf";
                try {
                Process proc = rt.exec("rundll32.exe url.dll,FileProtocolHandler " + link2);
            } catch (IOException ex) {
                Logger.getLogger(Menubar1.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    });

Пробовал и это, но получаю то же самое. Я могу открыть pdf из пункта меню, когда запускаю из netbeans, но не из приложения jar.

m_aboutItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (Desktop.isDesktopSupported()) {
            Desktop desktop = Desktop.getDesktop();
            URL link2=Menubar1.class.getResource("/newpkg/Documentation.pdf");
                String link=link2.toString();
                link=link.substring(6);
                System.out.println(link); 
            File file=new File(link);
            System.out.println(file);
                try {
                    desktop.open(file);
                } catch (IOException ex) {
                    Logger.getLogger(Menubar1.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

        }
    });

Вывод для всех system.out.println() выглядит следующим образом при запуске из netbeans для этого второго кода.

run:

F:/new/build/classes/newpkg/Documentation.pdf F:\new\build\classes\newpkg\Documentation.pdf СБОРКА УСПЕШНА (общее время: 5 секунд)


person Gaurav    schedule 05.07.2011    source источник


Ответы (3)


rundll32.exe не может работать с ресурсом, который сейчас находится внутри Jar. Проверьте URL-адрес, возвращенный getResource(String).

..но все равно не работает..

Проблема в том, что rundll32 было, по крайней мере, для PDF-файлов, только для File экземпляров. Инструменты, которые используют (например, отображают) PDF-файлы, обычно не предназначены для приема аргументов командной строки. представляющий URL. Если окажется, что URL указывает на File, процесс может быть продолжен. Но как только PDF-файл находится в банке, это просто запись в банке. Или, другими словами, это не File.

Если это рассуждение верно, один из способов отобразить PDF-файл в программном обеспечении по умолчанию:

  1. Получите URL в PDF, как сейчас.
  2. Check if the URL points to a Jar (it will contain a '!'). If it does..
    1. Extract the PDF from the Jar to a (temporary) File on disk.
  3. Отображение (возможно временное) File.
person Andrew Thompson    schedule 05.07.2011
comment
Спасибо ! Да, это работает, но нам нужно распространять это программное обеспечение, поэтому мы не можем жестко указать путь к файлу. Я попробовал следующее, но все еще не работает String link=link2.toString(); Sopln(link) был: file:/F:/new/classes/build/newpkg/Documentation.pdf Итак, я извлек путь только по ссылке=link.substring(6); Sopnl (ссылка) теперь: F:/new/classes/build/newpkg/Documentation.pdf, если я снова напишу getResource (ссылка), то же самое произойдет. Если я прямо напишу link=F:/new/classes/build/newpkg/Documentation.pdf;. Он работает, как вы сказали, как в netbeans, так и в банке. Есть ли способ сделать путь не жестко закодированным - person Gaurav; 05.07.2011
comment
Большое спасибо за столь быстрый ответ. И я попытался напечатать переменную link2. Вывод был следующим: file:/F:/new/build/classes/newpkg/Documentation.pdf только Sry, я поменял местами сборку и классы в приведенном выше комментарии. Хорошо... не могли бы вы дать еще несколько подробностей, как это сделать... я имею в виду любой URL-адрес или учебник, который я могу пройти для этого... - person Gaurav; 05.07.2011
comment
Выход был: только file:/F:/new/build/classes/newpkg/Documentation.pdf Вы уверены, что это вывод, когда вы «запускаете из файла Jar» - т.е. когда он не работает? Я удивлен, что вы вставили этот URL, так как он не содержит ! и должен работать (согласно моим лучшим теориям). - person Andrew Thompson; 05.07.2011
comment
Я тоже удивлен. Посмотрите на код... я его отредактировал. Печать как link2, так и link Вывод в окне netbeans запускается:‹break› F:/new/build/classes/newpkg/Documentation.pdf‹break› file:/F:/ new/build/classes/newpkg/Documentation.pdf СБОРКА УСПЕШНА (общее время: 8 секунд) Когда я использую link3 в команде exec... все работает. Хотя link3 совпадает с link. ‹break› просто символизирует смену строки - person Gaurav; 05.07.2011
comment
Два дня назад он работал только с link2. Я изменил несколько кодов, но ничего не изменил в этом меню... теперь оно перестает работать... понятия не имею, почему... я подумал... может быть, мне нужно связать несколько библиотек - person Gaurav; 05.07.2011
comment
И я только что скопировал и вставил вывод Sopln из окна вывода netbeans.. вот и все.. - person Gaurav; 05.07.2011
comment
из окна вывода netbeans.. Не оставите ли вы свою bl00dy IDE на минуту? Меня интересует не вывод, в котором он работает в среде IDE, а вывод, в котором он не работает. - person Andrew Thompson; 05.07.2011

Можете ли вы использовать Java 6 и API Desktop? ?

а при запуске можно экспортировать или скачать файл на диск?

person l_39217_l    schedule 05.07.2011
comment
Не для ресурса в файле JAR. Каждый из методов Desktop.open(File)/.edit(File) ожидает File. Ресурсы в банках доступны только URL. (И Desktop.browse(URI) передает URI браузеру, который также вряд ли сможет загружать ресурсы из архивов.) - person Andrew Thompson; 05.07.2011
comment
Пробовал и это.. Это тоже работает, но из netbeans, а не из jar.. я отредактировал и добавил коды для этого, как и все... здесь также я попробовал Sopln() для помощи.. все написано выше.. я не знаю что теперь делать .. и да, я очищаю и создаю свой проект, прежде чем открывать файл jar и открывать только правильный файл jar .. - person Gaurav; 05.07.2011

person    schedule
comment
у меня это работает Удача должна быть на вашей стороне, возможно, вам стоит купить лотерейный билет. Просмотрите Когда Runtime.exec() не будет и включите совет в свои (код и) будущие ответы. - person Andrew Thompson; 05.07.2011
comment
Спасибо, это работает, но путь довольно жестко запрограммирован. - person Gaurav; 05.07.2011