Java 在Jar中访问PDF

Java 在Jar中访问PDF,java,netbeans,menu,document,Java,Netbeans,Menu,Document,我正在使用Netbeans创建一个Java应用程序。从“帮助”菜单项,我需要打开一个PDF文件。当我通过Netbeans运行应用程序时,文档会打开,但通过jar文件打开时,它不会打开。有什么可以做的吗 m_aboutItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Runtime rt = Runtime.getRuntime(

我正在使用Netbeans创建一个Java应用程序。从“帮助”菜单项,我需要打开一个PDF文件。当我通过Netbeans运行应用程序时,文档会打开,但通过jar文件打开时,它不会打开。有什么可以做的吗

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

        }
    });
这两项产出如下:

E:/new/build/classes/newpkg/Documentation.pdf
file:/E:/new/build/classes/newpkg/Documentation.pdf

考虑上面的代码片段。在打印“link”时,我们可以看到它与硬编码的“link3”完全相同。使用硬编码的“link3”时,将从jar应用程序打开PDF文件。但当我们使用link时,虽然它与link3完全相同,但PDF不会打开

这很可能与不正确的PDF资源加载有关。在IDE中,PDF文件要么作为项目结构的一部分,要么具有直接指定的相对路径。当打包的应用程序运行时,它看不到资源

编辑: 正如我所描述的,您的代码揭示了这个问题。可以使用以下方法正确标识资源路径

public static URL getURL(final String pathAndFileName) {
    return Thread.currentThread().getContextClassLoader().getResource(pathAndFileName);
}
请参考问题,该问题可能会提供更多信息。

尝试以下方法:

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);
            }
        }

    }
});

可以做的第一件事就是发布一些代码可能的重复事实上,我认为OP要么复制了相同的(损坏的)代码,要么是重复线程的OP。解压缩jar并确保pdf在其中,默认情况下没有任何内容。java在正常编译过程中不会访问jar。“默认情况下,没有任何内容。java不会访问jar”我很确定
.class
文件会进入Jar。@Andrew Thompson是的,它是关于同一个应用程序的。我想问题现在已经很清楚了,那么您有解决方案吗?它最初是在打包的应用程序中工作的。但是在我们向项目中添加了一些文件之后,它就不再打开了。因此,资源加载过程必须正常,否则它最初不会从应用程序打开。@R.S.Mukunth您可以在执行命令之前通过记录路径来检查。@R.S.Mukunth这是因为传入的路径不可访问。@R.S.Mukunth我应该澄清,提供的方法用于确定应用程序jar中资源的URL。