我有两个jar文件。通常,如果我想从我的jar文件中“解压缩”资源,我会去:
InputStream in = MyClass.class.getClassLoader().getResourceAsStream(name);
byte[] buffer = new byte[1024];
int read = -1;
File temp2 = new File(new File(System.getProperty("user.dir")), name);
FileOutputStream fos2 = new FileOutputStream(temp2);
while((read = in.read(buffer)) != -1) {
fos2.write(buffer, 0, read);
}
fos2.close();
in.close();
如果我在同一目录中有另一个JAR文件怎么办?我可以用simillar方式访问第二个JAR文件资源吗?第二个JAR没有运行,所以没有自己的类加载器。是解压缩第二个JAR文件的唯一方法吗?
答案 0 :(得分:2)
我使用下面提到的代码来执行相同类型的操作。它使用JarFile类来做同样的事情。
/**
* Copies a directory from a jar file to an external directory.
*/
public static void copyResourcesToDirectory(JarFile fromJar, String jarDir, String destDir)
throws IOException {
for (Enumeration<JarEntry> entries = fromJar.entries(); entries.hasMoreElements();) {
JarEntry entry = entries.nextElement();
if (entry.getName().startsWith(jarDir + "/") && !entry.isDirectory()) {
File dest = new File(destDir + "/" + entry.getName().substring(jarDir.length() + 1));
File parent = dest.getParentFile();
if (parent != null) {
parent.mkdirs();
}
FileOutputStream out = new FileOutputStream(dest);
InputStream in = fromJar.getInputStream(entry);
try {
byte[] buffer = new byte[8 * 1024];
int s = 0;
while ((s = in.read(buffer)) > 0) {
out.write(buffer, 0, s);
}
} catch (IOException e) {
throw new IOException("Could not copy asset from jar file", e);
} finally {
try {
in.close();
} catch (IOException ignored) {}
try {
out.close();
} catch (IOException ignored) {}
}
}
}
答案 1 :(得分:1)
如果另一个Jar在您的常规类路径中,那么您可以以完全相同的方式访问该jar中的资源。如果Jar只是一个不在类路径上的文件,则必须打开它并使用the JarFile and related classes提取文件。请注意,Jar文件只是特殊类型的Zip文件,因此您还可以使用ZipFile related classes
访问Jar文件答案 2 :(得分:1)
您可以使用URLClassLoader
。
URLClassLoader classLoader = new URLClassLoader(new URL[]{new URL("path_to_file//myjar.jar")})
classLoader.loadClass("MyClass");//is requared
InputStream stream = classLoader.getResourceAsStream("myresource.properties");