Я пытаюсь добавить Run Script для install4j, который обрабатывает распаковку и распаковку тарболлов для таких вещей, как mysql и tomcat, которые встраиваются в мой установщик. Я понимаю, что могу взорвать эти tars как часть процесса сборки в 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;