如何编写一个可以提取JAR文件并将其数据存储在指定目录(位置)的Java程序?

我创build了一个JAR文件。 现在,我创build了另一个Java程序。 我想解压那个JAR文件在其他目录下,这意味着我想要做一些像解压缩一样的东西。

如果我运行jar -xf filename.jar这会导致一些错误:

 Exception in thread "main" java.io.IOException: Cannot run program "jar": java.io.IOException: error=2, No such file or directory at java.lang.ProcessBuilder.start(ProcessBuilder.java:459) at java.lang.Runtime.exec(Runtime.java:593)` 

修改此示例: 如何从JAR和zip归档文件中提取Java资源

或者试试这个代码:

以编程方式提取ZIP / JAR文件的内容

假设jarFile是要提取的jar / zip文件。 destDir是将被提取的path:

 java.util.jar.JarFile jar = new java.util.jar.JarFile(jarFile); java.util.Enumeration enumEntries = jar.entries(); while (enumEntries.hasMoreElements()) { java.util.jar.JarEntry file = (java.util.jar.JarEntry) enumEntries.nextElement(); java.io.File f = new java.io.File(destDir + java.io.File.separator + file.getName()); if (file.isDirectory()) { // if its a directory, create it f.mkdir(); continue; } java.io.InputStream is = jar.getInputStream(file); // get the input stream java.io.FileOutputStream fos = new java.io.FileOutputStream(f); while (is.available() > 0) { // write contents of 'is' to 'fos' fos.write(is.read()); } fos.close(); is.close(); } jar.close(); 

来源 : http : //www.devx.com/tips/Tip/22124

您可以使用此代码片段作为参考来完成您的任务。它几乎与上面的@JuanZe代码片段相同,除了那些得到FileNotFoundException的人,我已经添加了一个小的代码片段,将检查文件确实存在,如果不存在,那么它将随文件一起创build父文件夹,并将在指定的目标文件夹内提取jar文件的内容。

代码片段:

 public class JarDemo { public static void main(String[] args) throws java.io.IOException { java.util.jar.JarFile jarfile = new java.util.jar.JarFile(new java.io.File("E:/sqljdbc4.jar")); //jar file path(here sqljdbc4.jar) java.util.Enumeration<java.util.jar.JarEntry> enu= jarfile.entries(); while(enu.hasMoreElements()) { String destdir = "E:/abc/"; //abc is my destination directory java.util.jar.JarEntry je = enu.nextElement(); System.out.println(je.getName()); java.io.File fl = new java.io.File(destdir, je.getName()); if(!fl.exists()) { fl.getParentFile().mkdirs(); fl = new java.io.File(destdir, je.getName()); } if(je.isDirectory()) { continue; } java.io.InputStream is = jarfile.getInputStream(je); java.io.FileOutputStream fo = new java.io.FileOutputStream(fl); while(is.available()>0) { fo.write(is.read()); } fo.close(); is.close(); } } } 

JarFile类。

 JarFile file = new JarFile("file.jar"); for (Enumeration<JarEntry> enum = file.entries(); enum.hasMoreElements();) { JarEntry entry = enum.next(); System.out.println(entry.getName()); } 

这是我会做我从我的jar中提取我的整个“资源”文件夹。 使用BufferedReader和BufferedWriter的方式会更快。

  public static boolean extractResourcesToTempFolder() { try { //If folder exist, delete it. String destPath = getTempDir() + File.separator + "JToolkit" + File.separator; deleteDirectoryRecursive(new File(destPath)); JarFile jarFile = new JarFile(JToolkit.class.getProtectionDomain().getCodeSource().getLocation().getPath()); Enumeration<JarEntry> enums = jarFile.entries(); while (enums.hasMoreElements()) { JarEntry entry = enums.nextElement(); if (entry.getName().startsWith("resources")) { File toWrite = new File(destPath + entry.getName()); if (entry.isDirectory()) { toWrite.mkdirs(); continue; } InputStream in = new BufferedInputStream(jarFile.getInputStream(entry)); OutputStream out = new BufferedOutputStream(new FileOutputStream(toWrite)); byte[] buffer = new byte[2048]; for (;;) { int nBytes = in.read(buffer); if (nBytes <= 0) { break; } out.write(buffer, 0, nBytes); } out.flush(); out.close(); in.close(); } System.out.println(entry.getName()); } } catch (IOException ex) { Logger.getLogger(Methods.class.getName()).log(Level.SEVERE, null, ex); return false; } return true; } 

你的标题似乎并不符合这个问题,但如果你真的想“写一个Java程序提取一个jar文件”,你只需要JarFile类 。

您可以使用这个非常简单的库打包/解压缩jar文件

JarManager

很简单

 import java.io.File; import java.util.List; import fr.stevecohen.jarmanager.JarUnpacker; class Test { JarUnpacker jarUnpacker = new JarUnpacker(); File myfile = new File("./myfile.jar"); File unpackDir = new File("./mydir"); List<File> unpacked_files = jarUnpacker.unpack(myfile.getAbsolutePath(), unpackDir.getAbsolutePath()); } 

你也可以使用Maven依赖

 <dependency> <groupId>fr.stevecohen.jarmanager</groupId> <artifactId>JarManager</artifactId> <version>0.5.0</version> </dependency> 

您还需要我的存储库

 <repository> <id>repo-reapersoon</id> <name>ReaperSoon's repo</name> <url>http://repo-maven.stevecohen.fr</url> </repository> 

使用下面的链接检查最后一个版本以使用最后一个依赖项

如果您发现一些错误,请使用我的公共问题跟踪器

那么这里是我的版本,使用try-with-resources

  try (JarFile jarFile = new JarFile(artifact.getFile())) { for (JarEntry entry : Collections.list(jarFile.entries())) { try (InputStream is = jarFile.getInputStream(entry)) { File file = new File(targetDir, entry.getName()); try (FileOutputStream fos = new FileOutputStream(file)) { fos.write(is.read()); } } } } catch (IOException e) { throw new MyException(String.format( "Unable to open jar %s", artifact.getArtifactId()), e); }