Я создал файл JAR. Теперь я создал другую программу Java. Я хочу распаковать этот JAR файл в другой каталог, то есть я хочу сделать что-то вроде unzip.
Если я запустил 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)`
Ответ 1
Адаптировать этот пример: Как извлечь ресурсы Java из JAR и zip-архива
Или попробуйте этот код:
Извлечь содержимое файлов ZIP/JAR Programmatically
Предположим, что jarFile
- файл jar/zip, который нужно извлечь. destDir
- путь, по которому он будет извлечен:
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
Ответ 2
Вы можете использовать этот фрагмент кода в качестве ссылки, чтобы выполнить свою задачу. Это почти то же, что и фрагмент кода, показанный выше @JuanZe, за исключением того, что для тех, кто получал FileNotFoundException, я добавил небольшой фрагмент кода, который будет проверьте, существует ли файл, а если нет, он создаст родительскую папку вместе с файлами и извлечет содержимое файла 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();
}
}
}
Ответ 3
JarFile класс.
JarFile file = new JarFile("file.jar");
for (Enumeration<JarEntry> enum = file.entries(); enum.hasMoreElements();) {
JarEntry entry = enum.next();
System.out.println(entry.getName());
}
Ответ 4
Вот что я сделал бы, чтобы извлечь всю мою папку "ресурсов" из моей банки. Быстрее использовать 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;
}
Ответ 5
Ваше название не похоже на вопрос очень хорошо, но если вы действительно хотите "написать [a] java-программу, извлекающую файл jar", вам просто нужно Class JarFile.
Ответ 6
Вы можете использовать эту очень простую библиотеку в файле pack/unpack 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 repo</name>
<url>http://repo-maven.stevecohen.fr</url>
</repository>
Проверьте последнюю версию со ссылкой ниже, чтобы использовать последнюю зависимость
Пожалуйста, используйте общедоступный трекер ошибок, если вы найдете некоторые ошибки
Ответ 7
Ну вот моя версия, используя 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);
}