我想将之前从其他文件(已经完成)中提取的一系列文件添加到jar中。这些文件将覆盖JAR中的文件。最有效的方法是什么? 我需要快速。 谢谢!
答案 0 :(得分:17)
jar -u file.jar file1 file2 file3 ...
答案 1 :(得分:7)
JAR文件是ZIP文件,请记住。
只需使用一些ZIP库。
答案 2 :(得分:3)
jar -uf my.jar file1 file2...
jar -uf my.jar dir/
或混合
jar -uf my.jar file dir/
答案 3 :(得分:2)
zip file.jar file1 file2 file3
适用于Mac Os 10.7.5
答案 4 :(得分:1)
扩展现有答案,我发现 -C
jar 选项在添加位于其自己文件夹中的文件并且将其路径展平时非常有用。
$ 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
答案 5 :(得分: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
普通班级文件不需要此内容。
答案 6 :(得分:0)
$ markdown-doctest
x..
Failed - README.md:32:17
evalmachine.<anonymous>:7
console.log(a + c);
^
ReferenceError: c is not defined
答案 7 :(得分:0)
//Add a file in jar in a particular folder
jar uvf <jar file name> <file to be added> <folder name inside jar>
答案 8 :(得分:0)
如果有人需要程序性答案,就在这里。
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);
}
}
}
}