我正在编写一个打开.jar文件的简短应用程序,对其内容运行一些转换,然后再将其包装为.jar文件。我正在使用How to use JarOutputStream to create a JAR file?中的方法来创建新的jar文件,它正在处理它在新jar文件中创建文件层次结构的异常,该文件层次结构一直延伸到我的计算机根目录。
这是正确的,因为我将目标目录作为来自计算机根目录的路径传递给流程。我找不到的是任何其他方式来传达流程需要能够找到我的目标文件夹的上下文。如何设置我想要创建.jar文件的上下文?
澄清:
我已经重写了上面链接的解决方案的Run方法来接受两个参数:一个字符串定义输出jar文件的名称和位置,一个字符串定义我想要压缩的文件夹的位置,如下所示:
public void run(String output, String inputDirectory) throws IOException
{
JarOutputStream target = new JarOutputStream(new FileOutputStream(output));
add(new File(inputDirectory), target, inputDirectory.length());
target.close();
}
我交给该方法的两个样本值是:C:/temp/964ca469-5f7b-4c56-8b5a-72b4c1c851e0/help.jar和C:/ temp / 964ca469-5f7b-4c56-8b5a-72b4c1c851e0 /出/
我希望我的.jar文件的结构在“out”之后的正斜杠上有根,但是.jar文件的层次结构是:
C:
|-Temp
|-964ca469-5f7b-4c56-8b5a-72b4c1c851e0
|-out
|-{content}
我已经尝试将实际内容之前的字符串长度传递给Add方法并在添加JarEntry之前将其删除,但这只是让我失去索引错误,这非常有意义,因为我只是frikkin'groping。
必须有一种方法可以在添加文件之前将JarEntry类设置为文件夹层次结构中的特定点,或者执行相同操作的其他方法,但我到目前为止还能找到它。
感谢。
答案 0 :(得分:0)
JAR文件中没有“根上下文”。文件和路径的内容完全取决于您放入JarEntries的名称。
答案 1 :(得分:0)
从未弄清楚如何使用Jar文件创建,但正如fge建议zip文件系统提供程序确实更容易使用。我在我的主要方法中使用了这个:
CreateJarPackage zipper = new CreateJarPackage();
System.out.println(baseline + unique_directory + "/" + out_jar_file);
System.out.println(baseline + unique_directory + "/out/");
System.out.println(baseline.length() + unique_directory.length() + 5);
try {
zipper.addZipFiles(baseline + unique_directory + "/" + out_jar_file, baseline + unique_directory + "/out/", baseline.length() + unique_directory.length() + 5);
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
File folder = new File(baseline + unique_directory + "/out/");
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
if (listOfFiles[i].isDirectory()) {
try {
zipper.addZipFiles(baseline + unique_directory + "/" + out_jar_file, listOfFiles[i].toString(), baseline.length() + unique_directory.length() + 5);
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
打电话给:
import java.io.File;
import java.net.URI;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.HashMap;
import java.util.Map;
public class FinalZipCreator {
public static void processList(URI uri, Map<String, String> env, String path)
throws Throwable {
try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) {
File folder = new File(path);
File[] listOfFiles = folder.listFiles();
int index = path.length();
for (int i = 0; i < listOfFiles.length; i++) {
if (listOfFiles[i].isFile()) {
Path externalTxtFile =Paths.get(listOfFiles[i].toString());
Path pathInZipfile = zipfs.getPath(listOfFiles[i]
.toString().substring(index));
// copy a file into the zip file
Files.copy(externalTxtFile, pathInZipfile,
StandardCopyOption.REPLACE_EXISTING);
} else if (listOfFiles[i].isDirectory()) {
Path externalTxtFile = Paths.get(listOfFiles[i].toString());
Path pathInZipfile = zipfs.getPath(listOfFiles[i]
.toString().substring(index));
// copy a file into the zip file
Files.copy(externalTxtFile, pathInZipfile,
StandardCopyOption.REPLACE_EXISTING);
File folder2 = new File(listOfFiles[i].toString());
File[] listOfFiles2 = folder2.listFiles();
int index2 = listOfFiles[i].toString().length();
for (int e = 0; e < listOfFiles2.length; e++) {
if (listOfFiles2[i].isFile()) {
Path externalTxtFile2 = Paths.get(listOfFiles2[e].toString());
Path pathInZipfile2 = zipfs.getPath(listOfFiles2[e]
.toString().substring(index2));
// copy a file into the zip file
Files.copy(externalTxtFile2, pathInZipfile2,
StandardCopyOption.REPLACE_EXISTING);
}
}
}
}}
}
}
可能有更好的方法,但它有效。谢谢你的帮助。
作为旁注,它相当于&#34; pathInZipFile&#34;我永远无法在Jar创建者中找到的功能。