【问题标题】:Can't Retrieve Resources from External Jar File无法从外部 Jar 文件中检索资源
【发布时间】:2012-06-19 11:22:30
【问题描述】:

注意:这是我的问题here.


我有一个程序,它获取目录的内容并将所有内容捆绑到 JAR 文件中。我用来执行此操作的代码在这里:

    try
    {
        FileOutputStream stream = new FileOutputStream(target);
        JarOutputStream jOS = new JarOutputStream(stream);

        LinkedList<File> fileList = new LinkedList<File>();
        buildList(directory, fileList);

        JarEntry jarAdd;

        String basePath = directory.getAbsolutePath();
        byte[] buffer = new byte[4096];
        for(File file : fileList)
        {
            String path = file.getPath().substring(basePath.length() + 1);
            path.replaceAll("\\\\", "/");
            jarAdd = new JarEntry(path);
            jarAdd.setTime(file.lastModified());
            jOS.putNextEntry(jarAdd);

            FileInputStream in = new FileInputStream(file);
            while(true)
            {
                int nRead = in.read(buffer, 0, buffer.length);
                if(nRead <= 0)
                    break;
                jOS.write(buffer, 0, nRead);
            }
            in.close();
        }
        jOS.close();
        stream.close();

所以,一切都很好,并且创建了 jar,当我使用 7-zip 浏览它的内容时,它包含了我需要的所有文件。但是,当我尝试通过 URLClassLoader 访问 Jar 的内容时(该 jar 不在类路径上,我不打算这样做),我得到空指针异常。

奇怪的是,当我使用从 Eclipse 导出的 Jar 时,我可以以我想要的方式访问它的内容。这让我相信我在某种程度上没有正确创建 Jar,并且遗漏了一些东西。上面的方法有什么遗漏吗?

【问题讨论】:

  • 您可能会发现How to use JarOutputStream to create a JAR file 很有用。
  • 您是否尝试将清单文件添加到 jar 中??
  • @Max 谢谢,这正是我所需要的。问题是反斜杠;我没有正确使用 String.replaceAll。
  • @SathishJayapal 实际上,您不需要包含清单文件即可将 jar 用作简单存档。

标签: java jar classloader archive embedded-resource


【解决方案1】:

我是根据this question 弄清楚的——问题是我没有正确处理反斜杠。

固定代码在这里:

        FileOutputStream stream = new FileOutputStream(target);
        JarOutputStream jOS = new JarOutputStream(stream);

        LinkedList<File> fileList = new LinkedList<File>();
        buildList(directory, fileList);

        JarEntry entry;

        String basePath = directory.getAbsolutePath();
        byte[] buffer = new byte[4096];
        for(File file : fileList)
        {
            String path = file.getPath().substring(basePath.length() + 1);
            path = path.replace("\\", "/");
            entry = new JarEntry(path);
            entry.setTime(file.lastModified());
            jOS.putNextEntry(entry);
            FileInputStream in = new FileInputStream(file);
            while(true)
            {
                int nRead = in.read(buffer, 0, buffer.length);
                if(nRead <= 0)
                    break;
                jOS.write(buffer, 0, nRead);
            }
            in.close();
            jOS.closeEntry();
        }
        jOS.close();
        stream.close();

【讨论】:

  • 您应该将此标记为已接受的答案。通知其他人此问题已解决。
  • 它说我需要等一天。
猜你喜欢
  • 1970-01-01
  • 2013-12-08
  • 2019-09-03
  • 2014-06-07
  • 2014-10-11
  • 1970-01-01
  • 2019-09-28
  • 2012-04-27
相关资源
最近更新 更多