2012-02-15 39 views
1

我在Java中生成一个.jar文件,但是.jar包含它在系统中的绝对路径名(/ tmp/tempXXX/foo而不是/ foo)。 树是这样的:如何在Java中创建一个不包含绝对路径名的Zip/Jar

. 
|-- META-INF 
|-|- .... 
|-- tmp 
|-|- tempXXX 
|-|-|- foo 
|-|-|- bar 

取而代之的是:

. 
|-- META-INF 
|-|- .... 
|-- foo 
|-- bar 

是否有可能解决这一问题?这是它的功能:

public static void add(File source, JarOutputStream target, String removeme) 
     throws IOException 
{ 
    BufferedInputStream in = null; 
    try 
    { 
     File source2 = source; 
     if (source.isDirectory()) 
     { 
      String name = source2.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()) 
       add(nestedFile, target, removeme); 
      return; 
     } 

     JarEntry entry = new JarEntry(source2.getPath().replace("\\", "/")); 
     entry.setTime(source.lastModified()); 
     target.putNextEntry(entry); 
     in = new BufferedInputStream(new FileInputStream(source)); 

     byte[] buffer = new byte[2048]; 
     while (true) 
     { 
      int count = in.read(buffer); 
      if (count == -1) 
       break; 
      target.write(buffer, 0, count); 
     } 
     target.closeEntry(); 
    } 
    finally 
    { 
     if (in != null) 
      in.close(); 
    } 
} 

source2变量是修改路径,但修改时,它给了一个“无效的.jar文件”错误。 修改是这样的:

File source2 = new File(source.getPath().replaceAll("^" + removeme, "")); 

编辑:它现在有效。这里是新代码,如果有人感兴趣:

public static void add(File source, JarOutputStream target, String removeme) 
     throws IOException 
{ 
    BufferedInputStream in = null; 
    try 
    { 
     File parentDir = new File(removeme); 
     File source2 = new File(source.getCanonicalPath().substring(
       parentDir.getCanonicalPath().length() + 1, 
       source.getCanonicalPath().length())); 
     if (source.isDirectory()) 
     { 
      String name = source2.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()) 
       add(nestedFile, target, removeme); 
      return; 
     } 

     JarEntry entry = new JarEntry(source2.getPath().replace("\\", "/")); 
     entry.setTime(source.lastModified()); 
     target.putNextEntry(entry); 
     in = new BufferedInputStream(new FileInputStream(source)); 

     byte[] buffer = new byte[2048]; 
     while (true) 
     { 
      int count = in.read(buffer); 
      if (count == -1) 
       break; 
      target.write(buffer, 0, count); 
     } 
     target.closeEntry(); 
    } 
    finally 
    { 
     if (in != null) 
      in.close(); 
    } 
} 

回答

2

要获得相对路径,你必须提供一个相对路径,当调用JarEntry(名称)。尝试删除到父目录的部分路径。所以那会是这样的,

File parentDir = "src";//dir from which you want the relative path 

String relPath = source.getCanonicalPath() 
        .substring(parentDir.getCanonicalPath().length() + 1, 
          source.getCanonicalPath().length()); 

JarEntry entry = new JarEntry(relPath.replace(("\\", "/")); 
... 
+0

非常感谢你,它的工作原理! – MiJyn 2012-02-15 19:15:07

相关问题