企业微信会话存档功能开发
企业微信会话存档功能开发
概述
使用前帮助
## 环境
开发:win10 部署: linux
sdk下载
把动态库拷贝到lib目录下面,Financ类放在com.tencent.wework包下面(必须的)
动态库加载
/** * 加载动态库 * /lib 或者usr/lib 或者{JAVA_HOME}/jre/bin 等 */ static { List<String> libs = new ArrayList<>(); String property = System.getProperty("os.name","linux"); if(property.toLowerCase().startsWith("win")){ libs.add("libssl-1_1-x64.dll"); libs.add("libcurl-x64.dll"); libs.add("libcrypto-1_1-x64.dll"); libs.add("WeWorkFinanceSdk.dll"); }else{ libs.add("libWeWorkFinanceSdk_Java.so"); } libs.forEach(Finance::loadDynamicLibrary); } //对junit测试环境单独处理 private static void loadDynamicLibrary(String s) { String resourcePath = ResourceUtils.CLASSPATH_URL_PREFIX + "lib/"+ s; if(isUnitTest()){ loadDevJarDynamicLibrary(resourcePath); }else{ loadJarDynamicLibrary(resourcePath,s); } } /** * junit测试环境 * @param classpath */ private static void loadDevJarDynamicLibrary(String classpath) { URL url = null; try { url = ResourceUtils.getURL(classpath); } catch (FileNotFoundException e) { log.error("loadDynamicLibraryInSpring error,classpath={}",classpath,e); return; } String path = url.getPath(); log.info("开始加载动态库classpath={},path={}",classpath,path); System.load(path); } /** * 加载jar包里面的lib * @param classpath classpath:lib/aaa.so * @param filename aaa.so */ private static void loadJarDynamicLibrary(String classpath, String filename) { ApplicationHome applicationHome = new ApplicationHome(Finance.class); String rootPath = applicationHome.getSource().getParentFile().toString(); String path = rootPath+ File.separator+filename; File file = new File(path); if(file.exists()){ log.info("已经存在动态库file={}",file.getAbsolutePath()); } try { URL url = ResourceUtils.getURL(classpath); InputStream inputStream = url.openConnection().getInputStream(); FileUtils.copyInputStreamToFile(inputStream,file); String absolutePath = file.getAbsolutePath(); log.info("开始加载动态库path={}",absolutePath); System.load(absolutePath); } catch (Exception e) { log.error("动态库拷贝error,classpath={},filename={}",classpath,filename); } } /** * 是否是junit测试 * @return */ private static boolean isUnitTest() { try { StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); for (int i = stackTrace.length - 1; i >= 0; i--) { if (stackTrace[i].getClassName().startsWith("org.junit.")) { return true; } } } catch (Exception ex) { log.error("isUnitTest error",ex); } return false; }
问题: 1.动态库加载的区别 System.load(absolutePath);//加载全路径文件,后面带dll或者so System.loadLibrary(libName);//加载动态库,只用名字,不带路径和dll或者so 2.为什么要把文件考出来
-
不考出来其实也是能得到文件路径的,得到的的是 /app/jar/app.jar/…/xxx.so,是不能直接加载jar包里面的动态库的 考出来可以兼容windows和linux环境
demo
输入参数直接运行