在JAVA中提取JAR时文件命名的问题

时间:2018-05-17 16:06:56

标签: java jar filesystems zip compression

我的mac上有一个由gradle生成的jar(更具体的阴影jar)。

当我列出jar内容时:

... 
license 
LICENSE/licence.txt 
...

我正在使用ZipInputStream来查看jar的内容并将其解压缩到某个文件夹(我遍历流的条目)。

当我遇到LICENSE / licence.txt条目时,我收到一个错误,因为Java尝试使用小写字母而不是大写字母创建一个目录,并且已经存在一个小写字母的文件,因此操作失败(因为目录已经存在)。

我认为它与文件系统规范有某种关系,但我希望在机器上生成Jar时我会尝试将其提取到正确的行为。

这是我的解压缩功能 -

public void unZipIt(String zipFile, String outputFolder){

 byte[] buffer = new byte[1024];

 try{

    //create output directory is not exists
    File folder = new File(OUTPUT_FOLDER);
    if(!folder.exists()){
        folder.mkdir();
    }

    //get the zip file content
    ZipInputStream zis = 
        new ZipInputStream(new FileInputStream(zipFile));
    //get the zipped file list entry
    ZipEntry ze = zis.getNextEntry();

    while(ze!=null){

       String fileName = ze.getName();
       File newFile = new File(outputFolder + File.separator + fileName);

       System.out.println("file unzip : "+ newFile.getAbsoluteFile());

        //create all non exists folders
        //else you will hit FileNotFoundException for compressed folder
        new File(newFile.getParent()).mkdirs();

        FileOutputStream fos = new FileOutputStream(newFile);             

        int len;
        while ((len = zis.read(buffer)) > 0) {
           fos.write(buffer, 0, len);
        }

        fos.close();   
        ze = zis.getNextEntry();
    }

    zis.closeEntry();
    zis.close();

    System.out.println("Done");

}catch(IOException ex){
   ex.printStackTrace(); 
}}

我得到以下例外

java.io.FileNotFoundException: /var/folders/4f/9d6qh2cs3rgdmt26ntvs551h006dg0/T/BABU7239734928498030055/META-INF/MANIFEST.MF (Not a directory)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:162)
    at com.waze.bi.emr.jobs.jobcopier.Util.unZipIt(Util.java:170)
    at com.waze.bi.emr.jobs.jobcopier.Util.main(Util.java:196)

1 个答案:

答案 0 :(得分:0)

尝试将maven-toolchain依赖项添加到pom.xml中。它对我有用。

<dependency>
    <groupId>org.apache.maven</groupId>
    <artifactId>maven-toolchain</artifactId>
    <version>2.0.9</version>
</dependency>