如何使用classLoad 读取外部jar文件中的资源?
网络运行的Java Webstart的JNLP的写法里和可执行的jar文件里,都包含了对外部jar文件的依赖的语法
比如JNLP 语法:
<jar href="lib/hsqldb.jar"/>
可执行jar文件MANIFEST.MF里包含的语句:
Class-Path:
lib/appframework-1.0.3.jar
lib/swing-worker-1.1.jar
常见的是把图片等其他非class文件组织打包成一个jar文件,方便程序中使用。
在可执行的jar文件中,只需要一行代码就可以得到这些资源。
比如在lib/appframework-1.0.3.jar包含一个打印格式文件jrxml
都放在report/目录下,一个工作单打印文件WorkOrder.jrxml.
必须使用Thread.currentThread().getContextClassLoader()定制的ClassLoader来调用
或this.getClass().getClassLoader()
注意this的意思必须是个运行时的类实例,而不能是静态类的.class.getClass()的方法。
InputStream test=null;
try
{
test = Thread.currentThread().getContextClassLoader().getResourceAsStream("report/WorkOrder.jrxml");
或者:
test =new YouCurrentClassName().getClass().getClassLoader().getResourceAsStream("report/WorkOrder.jrxml");
if(test!=null)
{
InputStreamReader inr=new InputStreamReader(test,"UTF-8");
BufferedReader br=new BufferedReader(inr);
String line="";
while( (line=br.readLine())!=null)
{
System.out.println(line);
}
另外不在classpath里的jar包的资源调用。
可以使用java.net.URL("jar:file://d:/temp/test.jar!");的语法来读取。
public JarFile tJar = null;
public JarURLConnection uc = null;
String resourcepath="image/log.jpg";
URL u = new URL("jar:file:lib/ReportResource_jrxml.jar!/");
uc = (JarURLConnection)u.openConnection();
tJar = uc.getJarFile();
// Enumeration entries = tJar.entries();
// while (entries.hasMoreElements()) {
// ZipEntry entry = (ZipEntry) entries.nextElement();
// System.out.println(entry.getName());
//
// }
input = tJar.getInputStream(tJar.getEntry(resourcepath));