java - 如何仅将选定文件夹内的内容添加到 jar 中

标签 java jar

所以我有一个java程序,当我们给出内容的路径时,它会生成一个jar文件。但问题是它会在 jar 文件内生成更多目录。例如,假设相关内容位于目录 /home/user/Desktop/sample/bin/tmp 中。当我创建 jar 文件时,它里面有所有这些目录,这意味着在主目录中有 user 目录,在它里面有 Desktop 目录,依此类推,直到tmp 文件夹内的内容已添加。但我想要的是,将这个 tmp 文件夹中的内容直接添加到 jar 中,而不添加那些额外的目录。这是我使用的代码,我想修改它或完全重写它。有什么想法吗...?

    private static void createJar(File source, JarOutputStream target) throws IOException
        {
            BufferedInputStream in = null;
            try
            {
                if (source.isDirectory())
                {
                    String name = source.getPath().replace("\\", "/");
                    if (!name.isEmpty())
                    {
                        if (!name.endsWith("/"))
                            name += "/";
                        JarEntry entry = new JarEntry(name);
                        entry.setTime(source.lastModified());
                        target.putNextEntry(entry);
                        target.closeEntry();
                    }
                    for (File nestedFile: source.listFiles())
                        createJar(nestedFile, target);
                    return;
                }

                JarEntry entry = new JarEntry(source.getPath().replace("\\", "/"));
                entry.setTime(source.lastModified());
                target.putNextEntry(entry);
                in = new BufferedInputStream(new FileInputStream(source));

                byte[] buffer = new byte[1024];
                while (true)
                {
                    int count = in.read(buffer);
                    if (count == -1)
                        break;
                    target.write(buffer, 0, count);
                }
                target.closeEntry();
            }
            finally
            {
                if (in != null)
                    in.close();
            }
        }

请注意,source 是目录,target 是我要创建的 jar 文件。

最佳答案

我找到了答案。希望有人会像我一样需要它。

 private static void createJar(File source, JarOutputStream target) {
        createJar(source, source, target);
    }



 private static void createJar(File source, File baseDir, JarOutputStream target) {
        BufferedInputStream in = null;

        try {
            if (!source.exists()){
                throw new IOException("Source directory is empty");
            }
            if (source.isDirectory()) {
                // For Jar entries, all path separates should be '/'(OS independent)
                String name = source.getPath().replace("\\", "/");
                if (!name.isEmpty()) {
                    if (!name.endsWith("/")) {
                        name += "/";
                    }
                    JarEntry entry = new JarEntry(name);
                    entry.setTime(source.lastModified());
                    target.putNextEntry(entry);
                    target.closeEntry();
                }
                for (File nestedFile : source.listFiles()) {
                    createJar(nestedFile, baseDir, target);
                }
                return;
            }

            String entryName = baseDir.toPath().relativize(source.toPath()).toFile().getPath().replace("\\", "/");
            JarEntry entry = new JarEntry(entryName);
            entry.setTime(source.lastModified());
            target.putNextEntry(entry);
            in = new BufferedInputStream(new FileInputStream(source));

            byte[] buffer = new byte[1024];
            while (true) {
                int count = in.read(buffer);
                if (count == -1)
                    break;
                target.write(buffer, 0, count);
            }
            target.closeEntry();
        } catch (Exception ignored) {

        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (Exception ignored) {
                    throw new RuntimeException(ignored);
                }
            }
        }
    }

关于java - 如何仅将选定文件夹内的内容添加到 jar 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59317365/

相关文章:

java - 无法使用 Selenium 获取 WebElement 标签名称

java - Java 库最佳实践中的抛出异常

java - System.out 究竟是什么?

java - Zip/Jar 文件中的二进制差异

java - java Netbeans JTL 中的 ClassDefNotFound 和 ClassNotFoundException

java - 为什么 TimerTask 不能与新的 Timer 对象重用?

java - 在我的 Gradle Java 项目中使用本地 jar 作为依赖项

php - CCAvenue 交易 - 整合

java - Maven 在使用 javax 时寻找 Jersey 依赖(调用接口(interface))

java - 在 Eclipse 中使用 SWT Bot Generator 时出现空指针异常