Я пытаюсь добавить сценарий запуска в install4j, который обрабатывает распаковку и распаковку архивов для таких вещей, как mysql и tomcat, которые встраиваются в мой установщик. Я понимаю, что могу взорвать эти файлы tar как часть процесса сборки в ant, но по крайней мере для одного варианта использования я не могу этого сделать.
Я включил приведенный ниже код в действие «Выполнить сценарий», используя классы org.apache.tools.tar.TarEntry и TarInputStream. Это работает достаточно хорошо, с одной ошибкой.
При использовании этой реализации пути к файлам, длина которых превышает 99 символов, усекаются, а результирующие файлы переносятся в каталог верхнего уровня.
Я пытаюсь выяснить, является ли это ошибкой в моей реализации или проблемой с классами инструментов apache. Кажется, tarEntry.getName() не возвращает весь путь, если он превышает 99 символов. Есть ли простой способ обойти это без необходимости переписывать то, что делает TarInputStream? В Tar.Entry есть метод isGNULongNameEntry, но я не могу найти надежный способ указать, куда поместить файл, когда он возвращает значение true.
Какие-либо предложения?
import java.io.*;
import java.util.zip.*;
import org.apache.tools.tar.TarEntry;
import org.apache.tools.tar.TarInputStream;
String outputDirectory = "mysql";
File tgzFile = new File(context.getInstallationDirectory(), outputDirectory + File.separator + "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);
// 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());
tarEntry.isGNULongNameEntry()
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;