Извлеките некоторый контент из jar-файла, загруженного с помощью JWS
Я пытаюсь извлечь некоторые файлы из jar-файла, загруженного с помощью java-webstart. приведенный ниже код был использован, чтобы найти банку и инициировать файловую систему
1 final ProtectionDomain domain = this.getClass().getProtectionDomain();
2 final CodeSource source = domain.getCodeSource();
3 final URL url = source.getLocation();
4 final URI uri = url.toURI();
5 Path jarPath = Paths.get(uri);
6
7 FileSystem fs = FileSystems.newFileSystem(jarPath, null);
Это прекрасно работает, когда JAR-файл находится на локальном диске, но не в строке 5 в сценарии JWS, потому что
В журналах написано: url=http://localhost:8080/myjarfile.jar
java.nio.file.FileSystemNotFoundException: Provider "http" not installed
at java.nio.file.Paths.get(Unknown Source)
Если я правильно понимаю JWS, myjarfile.jar уже загружен в некоторый кеш, поэтому реализация FileSystemProvider for http для получения содержимого из myjarfile.jar кажется медленной и сложной. Так какие-нибудь хорошие идеи о том, как поступить?
2 ответа
в журналах написано: url=http://localhost:8080/myjarfile.jar
Это было решение по безопасности, принятое Sun до того, как Oracle приобрел их. Они решили, что это не бизнес апплетов или приложений JWS. чтобы узнать расположение ресурсов в локальной файловой системе, поэтому возвращаемый URI теперь всегда будет указывать на сервер, даже если они кэшируются локально и в приложении. имеет all-permissions
уровень безопасности.
Так какие-нибудь хорошие идеи о том, как поступить?
Редизайн приложения. Это единственное практическое решение.
Существует несколько способов итерации Zip или Jar для содержимого, но самый простой способ - включить список содержимого в известное расположение Jar, найти его с помощью getResource()
, прочитайте это, затем извлеките каждый ресурс.
Ниже приведена реализация вашей идеи, Эндрю, она использует пакет DirUtil, который я нашел здесь: http://codingjunkie.net/java-7-copy-move/
public class Zipper {
private static final String TEMP_FILE_PREFIX = "temp-";
private static final String TEMP_FILE_SUFIX = ".jar";
private Logger logger = Logger.getLogger(getClass().getName());
public Path extractProgram(String locationOfEmbeddedJar, String installDir) {
Path installPath = null;
try {
installPath = Paths.get(installDir);
if (Files.isDirectory(installPath)) {
logger.warn("program already installed");
} else {
installPath = Files.createDirectory(installPath);
Path tempJar = Files.createTempFile(TEMP_FILE_PREFIX,
TEMP_FILE_SUFIX);
this.extractEmbeddedJar(locationOfEmbeddedJar, tempJar.toFile());
logger.warn("in jarfile");
// in jar file
FileSystem fs = FileSystems.newFileSystem(tempJar, null);
Path programPath = fs.getPath("/");
logger.warn("programPath=" + programPath + " fileSystem="
+ programPath.getFileSystem());
DirUtils.copy(programPath, installPath);
}
} catch (IOException e) {
logger.warn(e);
}
return (installPath);
}
private void extractEmbeddedJar(String locationOfEmbeddedJar,
File locationOfTargetJar) {
logger.warn("extractEmbeddedJar() " + locationOfEmbeddedJar);
ClassLoader loader = this.getClass().getClassLoader();
InputStream inputStream = loader
.getResourceAsStream(locationOfEmbeddedJar);
try {
OutputStream out = new FileOutputStream(locationOfTargetJar);
byte buf[] = new byte[1024];
int len;
while ((len = inputStream.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.close();
inputStream.close();
} catch (IOException e) {
logger.warn(e);
}
}
}