Как распаковать и распаковать файл, встроенный в мой установщик, созданный с помощью install4j? - PullRequest
0 голосов
/ 07 февраля 2012

Я оцениваю install4j для новой команды / проекта.План состоит в том, чтобы заменить набор отечественных установщиков, специфичных для их платформ, одним установщиком install4j.Я создал простой установщик для вывода команды сборки.Install4j отлично справляется с простым установщиком, который переносит выходные данные сборки в самораспаковывающийся файл и помещает его в каталог при выполнении.

Однако, когда я пытаюсь разархивировать и распаковать файлы, встроенные в выходные данные сборки, произойдет сбой, за исключением ниже.

Не может ли install4j обрабатывать файлы gzip'd tar "изкоробка"?Мне нужно написать собственный код для этого?Или это похоже на какую-то другую ошибку?Я проверил и могу сам распаковать и распаковать файл из командной строки в каталог, который я указал.

Это то, что мне нужно сделать с несколькими артефактами в моем установщике для MySQL, Tomcat и т. Д.

java.util.zip.ZipException: error in opening zip file
    at java.util.zip.ZipFile.open(Native Method)
    at java.util.zip.ZipFile.<init>(ZipFile.java:131)
    at java.util.zip.ZipFile.<init>(ZipFile.java:148)
    at com.install4j.runtime.beans.actions.files.AbstractExtractZipFileAction.getMaxProgress(Unknown Source)
    at com.install4j.runtime.beans.actions.files.AbstractExtractZipFileAction.extractZip(Unknown Source)
    at com.install4j.runtime.beans.actions.files.AbstractExtractZipFileAction.execute(Unknown Source)
    at com.install4j.runtime.beans.actions.SystemInstallOrUninstallAction.install(Unknown Source)
    at com.install4j.runtime.installer.InstallerContextImpl.performActionInt(Unknown Source)
    at com.install4j.runtime.installer.ContextImpl.performAction(Unknown Source)
    at com.install4j.runtime.installer.controller.Controller.executeActions(Unknown Source)
    at com.install4j.runtime.installer.controller.Controller.handleCommand(Unknown Source)
    at com.install4j.runtime.installer.controller.Controller.start(Unknown Source)
    at com.install4j.runtime.installer.Installer.runInProcess(Unknown Source)
    at com.install4j.runtime.installer.Installer.main(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at com.exe4j.runtime.LauncherEngine.launch(Unknown Source)
    at com.install4j.runtime.launcher.Launcher.main(Unknown Source)

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

Это оказалось не так сложно, как я думал.Я нашел фрагмент кода JAVA в этом посте , который помог.

Итак, ниже приведен код, который я добавил в действие «Выполнить скрипт».Это еще не достаточно умный, чтобы определить соответствующий файл tar MySQL для платформы, на которой устанавливается, но это начало.

import java.io.*;
import java.util.zip.*;
import org.apache.tools.tar.TarEntry;
import org.apache.tools.tar.TarInputStream;

File tgzFile = new File(context.getInstallationDirectory(), "mysql/mysql-5.5.17-linux2.6-i686.tar.gz");

// Create the Tar input stream.
FileInputStream fin = new FileInputStream(tgzFile);
GZIPInputStream gin = new GZIPInputStream(fin);
TarInputStream tin = new TarInputStream(gin);

String outputDirectory = "mysql";

// Create the destination directory.
File outputDir = new File(outputDirectory);
outputDir.mkdir();

// Extract files.
TarEntry tarEntry = tin.getNextEntry();
while (tarEntry != null) {
    File destPath = new File(context.getInstallationDirectory(), outputDirectory + File.separator + tarEntry.getName());

    if (tarEntry.isDirectory()) {
        destPath.mkdirs();
    } else {
        // If the parent directory of a file doesn't exist, create it.
        if (!destPath.getParentFile().exists())
            destPath.getParentFile().mkdirs();

        FileOutputStream fout = new FileOutputStream(destPath);
        tin.copyEntryContents(fout);
        fout.close();
    // Presserve the last modified date of the tar'd files.
        destPath.setLastModified(tarEntry.getModTime().getTime());
    }
    tarEntry = tin.getNextEntry();
}
tin.close();

return true;
0 голосов
/ 08 февраля 2012

Действия ZIP в install4j в настоящее время не работают с файлами gzip tar, только с файлами ZIP.

...