Jacob从当前路径读取dll文件及相关打包方法

独立观察员2013.08.12

Jacob  LibraryLoader.class  修改版代码

功能:让jacob可在当前路径下的dll文件夹内读取相关依赖的dll文件,免去复制到系统文件夹的麻烦。

Bug:好像就不会从系统路径读取了,难道catch内代码不执行?期待高手解答。

package com.jacob.com;

import java.util.Enumeration;

import java.util.HashSet;

import java.util.Locale;

import java.util.MissingResourceException;

import java.util.ResourceBundle;

import java.util.Set;

public final class LibraryLoader

{

        publicstatic final String JACOB_DLL_PATH = "jacob.dll.path";

        publicstatic final String JACOB_DLL_NAME = "jacob.dll.name";

        publicstatic final String JACOB_DLL_NAME_X86 = "jacob.dll.name.x86";

        publicstatic final String JACOB_DLL_NAME_X64 = "jacob.dll.name.x64";

        publicstatic final String DLL_NAME_MODIFIER_32_BIT = "x86";

        publicstatic final String DLL_NAME_MODIFIER_64_BIT = "x64";

        publicstatic void loadJacobLibrary()

        {

                  ResourceBundleresources = null;

                  Setkeys = new HashSet();

                  try{

                           resources=ResourceBundle.getBundle(LibraryLoader.class.getName(), Locale.getDefault(),LibraryLoader.class.getClassLoader());

                           Enumerationi = resources.getKeys();

                           while(i.hasMoreElements()) {

                                    Stringkey = (String)i.nextElement();

                                    keys.add(key);

                           }

                  }

                  catch(MissingResourceException e)

                  {

                  }

try {

                           Stringpath, name, dir;

                           path= System.getProperty("user.dir") + "\\dll\\";   //先获取当前目录下的dll文件夹路径——dlgcy

                           name= getPreferredDLLName();

                           dir= path + name + ".dll";  //加后缀适应load()方法;

                           JacobObject.debug("Loadinglibrary " + dir + " using System.loadLibrary ");

                      System.load(dir);  //使用load()可载入任意绝对路径下的库文件;

                      System.out.println("载入dll文件成功!");

                  }catch (Exception e) { //原方法;

                           Stringpath = System.getProperty("jacob.dll.path");

                      if ((path == null) && (resources !=null) && (keys.contains("jacob.dll.path"))) {

                        path =(String)resources.getObject("jacob.dll.path");

                      }

                      if (path != null) {

                        JacobObject.debug("Loading library" + path + " using System.loadLibrary ");

                        System.loadLibrary(path);

                      }

                      else {

                        String name = null;

                        if(System.getProperty("jacob.dll.name") != null)

                          name =System.getProperty("jacob.dll.name");

                        else if((System.getProperty("jacob.dll.name.x86") != null) &&(shouldLoad32Bit()))

                        {

                          name = System.getProperty("jacob.dll.name.x86");

                        } else if((System.getProperty("jacob.dll.name.x64") != null) &&(!shouldLoad32Bit()))

                        {

                          name =System.getProperty("jacob.dll.name.x64");

                        } else if ((resources != null) &&(keys.contains("jacob.dll.name")))

                          name =resources.getString("jacob.dll.name");

                        else if ((resources != null) &&(keys.contains("jacob.dll.name.x86")) && (shouldLoad32Bit()))

                        {

                          name =resources.getString("jacob.dll.name.x86");

                        } else if ((resources != null) &&(keys.contains("jacob.dll.name.x64")) &&(!shouldLoad32Bit()))

                        {

                          name =resources.getString("jacob.dll.name.x64");

                        }

                        else{

                          name = getPreferredDLLName();

                        }

                        JacobObject.debug("Loading library" + name + " using System.loadLibrary ");

                        System.loadLibrary(name);

                      }

                           e.printStackTrace();

                  }

        }

        publicstatic String getPreferredDLLName()

        {

                  if(shouldLoad32Bit()) {

                           return"jacob-" + JacobReleaseInfo.getBuildVersion() + "-" +"x86";

                  }

                  return"jacob-" + JacobReleaseInfo.getBuildVersion() + "-" +"x64";

        }

        protectedstatic boolean shouldLoad32Bit()

        {

                  Stringbits = System.getProperty("sun.arch.data.model", "?");

                  if(bits.equals("32"))

                           returntrue;

                  if(bits.equals("64")) {

                           returnfalse;

                  }

                  Stringarch = System.getProperty("java.vm.name", "?");

                  if(arch.toLowerCase().indexOf("64-bit") >= 0) {

                           returnfalse;

                  }

                  returntrue;

        }

}

附下载:

使用j2ewiz打包

首先在Eclipse中这样导出:

出现的是一个jar文件和一个库文件夹:

然后打开j2ewiz

然后选择“浏览JAR…”或者你用好压将Jar文件提前解压那么这时就可以选择“选择目录:

接下来都是相应的选择;

这里还可以隐藏class,就是当你生成exe文件后,你用好压打开也看不见你的class

慎重选择隐藏功能,否则可能读取不到某些路径的文件

最后就可生成exe文件:图标可自己设定。

接着将exe文件、依赖库文件夹、以及其它资源文件打包压缩:

然后点击自解压制作成类似安装包的自解压文件(可参考)。