我正在尝试使用Java使用Java命令jar文件夹中的所有文件,如下所示,
jar -cvf /Abhishek/logs.jar my_directory/logs/*.logs*
我正在使用Java来执行此操作。
String cmd[] = {"jar", "-cvf", "/Abhishek/logs.jar", "my_directory/logs/*.logs*"};
pb = Runtime.getRuntime().exec(cmd);
但只有清单存放在罐子里。
added manifest
当我提取jar文件时,我收到了清单文件。所以我对此表示怀疑
*log.*
是否允许使用这种语法?因为它在终端中工作正常。
有人会对此有所了解吗?
谢谢。
在Linux上,文件通配由shell完成。因此,当您在终端输入*.log
时,shell会将其扩展为匹配文件列表。然后将其传递给该程序。
如果直接执行程序,则必须自己扩展模式。或者你可以让shell使用类似的命令执行它
String cmd[] = {"sh", "-c", "jar -cvf /Abhishek/logs.jar my_directory/logs/*.logs*"};
您可能只想在jar命令使用的java.util.jar package中使用相同的类。这将避免第二个Java进程,并将避免依赖shell扩展:
try (JarOutputStream jar = new JarOutputStream(
new BufferedOutputStream(
Files.newOutputStream(
Paths.get("/Abhishek/logs.jar"))));
DirectoryStream<Path> dir = Files.newDirectoryStream(
Paths.get("my_directory/logs"), "*.logs*")) {
for (Path file : dir) {
BasicFileAttributes attr =
Files.readAttributes(file, BasicFileAttributes.class);
String name = file.toString();
if (attr.isDirectory()) {
name = name + "/";
}
JarEntry entry = new JarEntry(name);
entry.setLastModifiedTime(attr.lastModifiedTime());
entry.setLastAccessTime(attr.lastAccessTime());
entry.setCreationTime(attr.creationTime());
entry.setSize(attr.size());
jar.putNextEntry(entry);
Files.copy(file, jar);
}
}