如何在JAR中捆绑一个pdf文件,以便在从eclipse运行时和打包到jar中时可以平等地访问它?

mlnl4t2r  于 2023-10-18  发布在  Eclipse
关注(0)|答案(1)|浏览(126)

我的项目有多个图像和一个PDF文件。Project的Linux需要在我们多个城市的不同办公室的各种具有Linux或Windows的PC上使用。这就是为什么我希望所有的资源都是同一个JAR文件的一部分,以实现简单且无错误的可移植性。
我已经成功地访问我的图像/图标作为资源使用:
public static final ImageIcon CopyIcon = new ImageIcon(Global.class.getResource("/cct/resources/copy.png"));
但是当我使用类似的代码访问用户手册(pdf)文件时:
File userManual = new File(Global.class.getResource("/cct/resources/manual.pdf").toURI());Desktop.getDesktop().open(userManual);
.用户手册在eclipse中运行时打开正常,但从使用Export => Runnable JAR file => 'Extract/Package required libraries into generated JAR'选项创建的jar文件访问时没有响应。所有其他选项都可以无缝工作。
我已经尝试了许多解决方案在这里找到的SO,但没有工程,因为他们中的大多数是其他文件类型,例如. txt或excel或图像。

5uzkadbs

5uzkadbs1#

感谢@howlger提到的答案,我修改了我的代码,如下所示,使我的pdf可以从eclipse和JAR访问。

public static void openUserManual() {
        File userManual;
        try {
            userManual = new File(Global.class.getResource("/cct/resources/manual.pdf").toURI());
            Desktop.getDesktop().open(userManual); // works when run from eclipse
        }
        catch (Exception ex) {
            try {
                userManual = getResourceAsFile(Global.class.getResource("/cct/resources/manual.pdf").getPath());
                if (userManual != null)
                    Desktop.getDesktop().open(userManual); // works when run from JAR
                else
                    JOptionPane.showMessageDialog(null, "User Manual couldn't be accessed.");
            }
            catch (Exception exp) { exp.printStackTrace(); }
        }
    }
    
    private static File getResourceAsFile(String resourcePath) {
        try (InputStream in = Global.class.getResourceAsStream(resourcePath)) {
            if (in == null)
                return null;

            File tempFile = File.createTempFile(String.valueOf(in.hashCode()), ".tmp");
            tempFile.deleteOnExit();

            try (FileOutputStream out = new FileOutputStream(tempFile)) {
                //copy stream
                byte[] buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = in.read(buffer)) != -1)
                    out.write(buffer, 0, bytesRead);
            }
            return tempFile;
        } catch (IOException exp) { exp.printStackTrace(); return null; }
    }

相关问题