我试图从使用java-webstart下载的jar文件中提取一些文件。 下面的代码用于定位jar并启动FileSystem
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文件位于本地磁盘上时这很好,但是在JWS场景中第5行失败,因为
日志说: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已经被下载到某个缓存中了,所以实现一个用于http的FileSystemProvider从myjarfile.jar获取一些内容似乎既缓慢又复杂。那么如何进行任何好的想法?
答案 0 :(得分:1)
日志说:url = http:// localhost:8080 / myjarfile.jar
这是Sun在Oracle收购之前做出的一项安全决策。他们认为这不是applets或JWS应用程序的业务。要知道本地文件系统上资源的位置,所以返回的URI现在总是指向服务器,即使它们是在本地缓存的。该应用程序。具有all-permissions
安全级别。
所以关于如何进行的任何好主意?
重新设计应用。这是唯一切实可行的解决方案。
有很多方法可以为内容迭代Zip或Jar,但最简单的方法是在Jar的已知位置包含内容列表,使用getResource()
找到它,读取它,然后提取每个资源。
答案 1 :(得分:1)
以下是您的想法Andrew的实现,它使用我在这里找到的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);
}
}
}