Jnotify文件监控的用法以及Jar文件导入的方法
简介Jnotiy, 支持动态监控(支持级联监控)文件夹和文件的jar包。在linux中,调用linux底层的jnotify服务。在windows中,需要添加附件的dll文件。
因为通用的Maven仓库中没有此Jar文件,pom.xml文件需要如下配置:
<dependency>
<groupId>net.contentobjects.jnotify</groupId>
<artifactId>jnotify</artifactId>
<version>0.94</version>
</dependency> <!-- 在central库中没有这个包,需要添加以下的repo -->
<repositories>
<repository>
<id>bintray</id>
<url>http://dl.bintray.com/typesafe/maven-releases/</url>
</repository>
</repositories>
使用
首先从jar包中解目录压出dll文件,并放到工程lib/目录下。比如
/project/lib/native_libraries/...测试代码
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Properties;
import org.apache.log4j.Logger;
import net.contentobjects.jnotify.JNotify;
import net.contentobjects.jnotify.JNotifyException;
import net.contentobjects.jnotify.JNotifyListener; public class TestJnotify { static Logger log = Logger.getLogger(TestJnotify.class);
/**
* jnotify动态库 - 32位
*/
static final String NATIVE_LIBRARIES_32BIT = "/lib/native_libraries/32bits/";
/**
* jnotify动态库 - 64位
*/
static final String NATIVE_LIBRARIES_64BIT = "/lib/native_libraries/64bits/"; public static void main(String[] args) throws JNotifyException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { log.debug("-----------Jnotify test ---------"); Properties sysProps = System.getProperties();
String osArch = (String) sysProps.get("os.arch");
String osName = (String) sysProps.get("os.name");
String userDir = (String) sysProps.getProperty("user.dir");
LOG.debug("os.arch: " + osArch);
LOG.debug("os.name: " + osName);
LOG.debug("userDir: " + userDir);
LOG.debug("java.class.path: " + sysProps.get("java.class.path")); // 直接调用Jnotify时, 会发生异常:java.lang.UnsatisfiedLinkError: no jnotify_64bit in java.library.path
// 这是由于Jnotify使用JNI技术来加载dll文件,如果在类路径下没有发现相应的文件,就会抛出此异常。
// 因此可以通过指定程序的启动参数: java -Djava.library.path=/path/to/dll,
// 或者是通过修改JVM运行时的系统变量的方式来指定dll文件的路径,如下: // 判断系统是32bit还是64bit,决定调用对应的dll文件
String jnotifyDir = NATIVE_LIBRARIES_64BIT;
if (!osArch.contains("64")) {
jnotifyDir = NATIVE_LIBRARIES_32BIT;
}
LOG.debug("jnotifyDir: " + jnotifyDir);
// 获取目录路径
String pathToAdd = userDir + jnotifyDir ;
boolean isAdded = false;
final Field usrPathsField = ClassLoader.class.getDeclaredField("usr_paths");
usrPathsField.setAccessible(true);
final String[] paths = (String[]) usrPathsField.get(null);
LOG.debug("usr_paths: " + Arrays.toString(paths));
for (String path : paths) {
if (path.equals(pathToAdd)) {
isAdded = true;
break;
}
}
if (!isAdded) {
final String[] newPaths = Arrays.copyOf(paths, paths.length + 1);
newPaths[newPaths.length - 1] = pathToAdd;
usrPathsField.set(null, newPaths);
} LOG.debug("java.library.path: " + System.getProperty("java.library.path"));
LOG.debug("usr_paths: " + Arrays.toString((String[]) usrPathsField.get(null)));
usrPathsField.setAccessible(false);
LOG.debug("类路径加载完成"); // 监听F盘下的文件事件
JNotify.addWatch("F:\\", JNotify.FILE_ANY, true, new JNotifyListener() {
@Override
public void fileRenamed(int wd, String rootPath, String oldName, String newName) {
log.debug("wd = " + wd + ", rootPath = " + rootPath);
log.debug("oldName = " + oldName + ", newName = " + newName);
}
@Override
public void fileModified(int wd, String rootPath, String fileName) {
log.debug("fileModified");
}
@Override
public void fileDeleted(int wd, String rootPath, String fileName) {
log.debug("fileDeleted");
}
@Override
public void fileCreated(int wd, String rootPath, String fileName) {
log.debug("fileDeleted");
}
});
while (true) { }
}
}
Jnotify文件监控的用法以及Jar文件导入的方法的更多相关文章
- [转] - JAR文件包及jar命令详解 ( MANIFEST.MF的用法 )
常常在网上看到有人询问:如何把 java 程序编译成 .exe 文件.通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像. chm 文档一样双击运行了:而另一种是使用 JET 来进 ...
- java打jar包,引用其他.jar文件
大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个jar包的程序入口. 具体的方法是修改jar包内目录META-INF下的MANIF ...
- Jar文件 META-INF/MANIFEST.MF文件详解
打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录, 这个目录下会有一些文件,其中必有一个MANIFEST.MF,这个文件描述了该Jar文件的很多信息,下面将详细介绍MANI ...
- charles最新破解jar文件,及浏览器证书安装
一 在线破解文件下载 Charles 在线破解工具,https://www.zzzmode.com/mytools/charles/ 描述 此工具用于生成破解后的charles.jar文件, 破解原 ...
- 【转】学习jar命令 创建和解压jar文件包
java编程中每天都用不少jar文件,项目开发中不停地导包,在忙完了一天的工作,放下那些复杂的业务实现,不仅想问这些jar包怎么生成的,jar包有哪些独特的地方等等. 原来这些经常见到的jar包是ja ...
- hibernate5.2需要的最少jar文件
hibernate5.2需要的最少jar文件: required文件夹中的所有jar文件 + mysql-connector-java-bin.jar.
- Java_Java中动态加载jar文件和class文件
转自:http://blog.csdn.net/mousebaby808/article/details/31788325 概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下 ...
- Eclipse开发工具学习之道:用Eclipse生成jar文件
很多人都不知道怎么在Eclipse下生成jar文件,或者生成了jar文件后又老是用不了,总是会收到 Exception in thread "main" java.lang.NoC ...
- 如何运行jar文件
比如我要执行G:/weblogic文件夹下面的wls1036_generic.jar 文件. 1.cmd 2.跳转到G盘(G:回车),如果jar文件在桌面上,运行cd desktop进入桌面再定位到文 ...
随机推荐
- WebView自适应屏幕大小
webView.getSettings().setUseWideViewPort(true); webView.getSettings().setLoadWithOverviewMode(true); ...
- DMA-330(二)
DMA内部的block diagram: DMAC包含一个instruction processing block,来process program code,control DMA transfer ...
- struct2 学习总结
花了近半个月学习了struct2.现大致总结下学习点: 1. struct2 入门以及基本配置(未继承ActionSupport,配置struts.xml文件,execute方法直接返回SUCESS) ...
- an'gularjs 环境搭建之NodeJS、NPM安装配置步骤(windows版本)
NodeJS.NPM安装配置步骤(windows版本) :http://xiaoyaojones.blog.163.com/blog/static/28370125201351501113581/ ...
- android SDK安装容易出错的原因
1.实际上,安卓SDK安装之后,拷贝到其他的机子上面.配置一下环境变量,就可以跑起来的 2.但是拷贝到其他的机子上面临着一个问题就是Eclipse已经配置了的android环境,需要在新的机子上面修改 ...
- UISegmentedControl(转)
初始化UISegmentedControl NSArray *arr = [[NSArray alloc]initWithObjects:@"轻拍",@"长按" ...
- Jni层回调java代码【转】
本文转载自:http://www.linuxidc.com/Linux/2014-03/97562.htm JNI是Java Native Interface的缩写,是Java平台的重要特性,使得Ja ...
- scala 隐式转换
先参考这篇文章:http://www.jianshu.com/p/a344914de895 package com.test.scalaw.test /** * scala隐式转换 */ object ...
- tomcat启动startup.bat一闪而过 转
遇到很多次运行startup.bat后,一个窗口一闪而过的问题,但是从来没去纠正怎样修改配置才是正确的,现在从网上查阅的资料整理如下:tomcat在启动时,会读取环境变量的信息,需要一个CATALIN ...
- org.apache.cxf.transport.servlet.CXFServlet cannot be cast to javax.servlet.Servlet
java.lang.ClassCastException: org.apache.cxf.transport.servlet.CXFServlet cannot be cast to javax.se ...