因为在做的一个小应用里面用到了JNI的SQLite驱动,需要使用一个sqlite_jni.dll.
所以程序打包成jar文件发布的时候需要连带一个sqlite_jni.dll放在jar同目录或者放到系统的path中
就觉得很麻烦,希望能做成单文件的.
折腾了半天之后才弄出来这个方法可以把程序自身jar里的资源拷贝到外部文件夹的方法
代码如下:
1import java.io.File;
2import java.io.FileOutputStream;
3import java.io.IOException;
4import java.io.InputStream;
5import java.io.OutputStream;
6
7public class CopyDll
8{
9 private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
10 void copyDll() throws Exception
11 {
12 InputStream in = this.getClass().getClassLoader()
13 .getResourceAsStream("bin/lib/sqlite_jni.dll");
14 File file2 = new File("sqlite_jni.dll");
15 FileOutputStream out = new FileOutputStream(file2);
16 copy(in, out);
17 in.close();
18 out.close();
19 }
20
21 private static void copy(InputStream input, OutputStream output)
22 throws IOException
23 {
24 byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
25 int n = 0;
26 while (-1 != (n = input.read(buffer)))
27 {
28 output.write(buffer, 0, n);
29 }
30 }
31}
下面的代码里面把sqlite_jni.dll的位置写死了,位于jar文件里面的bin/lib文件夹中,用
InputStream in = this.getClass().getClassLoader().getResourceAsStream("bin/lib/sqlite_jni.dll");
把资源读取为InputStream
而OutputStream则被实例化为FileOutputStream对象,输出dll文件到与jar文件同级目录下:
private static int copy(InputStream input, OutputStream output)
这个方法把InputStream的内容拷贝到传入的FileOutputStream实例中,即可实现文件的输出.
然后在整个程序开始的时候判断一下sqlite_jni.dll文件是否存在,如果不存在就调用copyDll()方法把dll文件从jar中取出来.
补充:
用Eclipse导出可执行的jar文件.默认是不会包括dll文件的,所以我是在导出之后
用7_zip解压缩软件打开jar,在里面新建bin/lib两层目录再把dll文件拷入其中
之后直接执行jar文件就会在当前文件夹中释放出dll文件啦.
posted on 2010-11-17 01:39
ApolloDeng 阅读(1885)
评论(4) 编辑 收藏 所属分类:
分享 、
Java