24

以前に他のファイルから抽出された(すでに実行された)一連のファイルをjarに追加したいと思います。これらのファイルは、JAR内のファイルを上書きします。それを行うための最も効率的な方法は何ですか?私はそれが速い必要があります。ありがとうございました!

4

9 に答える 9

21
jar -u file.jar file1 file2 file3 ...
于 2012-09-02T21:09:07.950 に答える
20
jar -uf my.jar file1 file2...
jar -uf my.jar dir/

または混合

jar -uf my.jar file dir/
于 2017-06-23T16:08:35.030 に答える
10

JARファイルはZIPファイルです。覚えておいてください。

いくつかのZIPライブラリを使用するだけです。

于 2012-09-02T21:10:46.870 に答える
4

既存の回答に追加するために、少なくとも1つの特殊なケースがあります。いわゆる実行可能JARファイルです。別のJARファイルを依存関係として追加すると(jarまたはzipのどちらを使用する場合でも)、埋め込まれたファイルが圧縮されていると文句を言います。

Caused by: java.lang.IllegalStateException: Unable to open nested entry 'BOOT-INF/lib/file.jar'. It has been compressed and nested jar files must be stored without compression. Please check the mechanism used to create your executable jar file

0これに対する解決策は、jarオプションを使用することです。

jar uvf0 myfile.jar BOOT-INF/lib/file.jar

通常のクラスファイルにはこれは必要ありません。

于 2020-04-03T09:51:24.293 に答える
3
 zip file.jar file1 file2 file3 

MacOs10.7.5で動作します

于 2013-04-12T21:42:02.730 に答える
2
//Add a file in jar in a particular folder
jar uvf <jar file name> <file to be added> <folder name inside jar>
于 2019-07-31T07:30:03.347 に答える
1

既存の回答を拡張すると、jarオプションは、独自のフォルダーにあるファイルを追加するときに非常に便利であり、パスをフラット化することができます。-C

$ jar uf jar-file -C /path/to/my_jars/ this_useful.jar

最終的には、JARのルートにthis_useful.jarが含まれることになります。

$ jar tf jar-file | grep this_useful.jar
this_useful.jar
于 2018-10-22T14:55:59.657 に答える
1

誰かがプログラムで答える必要があるなら、ここにあります。

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);
            }
        }
    }
}
于 2019-12-16T06:56:45.887 に答える
-1
String cmd = "jar uvf " + "jarName" + " " + "Filename";
System.out.println(cmd);
try {
Process p = Runtime.getRuntime().exec(cmd);
}
catch (Exception ex) {
}
于 2019-07-31T06:16:26.443 に答える