JNotify 的简单使用(Linux命令行环境)

下载地址:http://sourceforge.net/projects/jnotify/
关于JNotify的使用说明,从下载的jnotify-lib-0.94.zip中解压出的readme文件的前两行写的很清晰,如下:
JNotify works on Linux with INotify support (Tested on 2.6.14), Mac OS X 10.5 or higher (Tested on 10.6.2), and on Windows XP/2K/NT (Tested on XP and on Windows 7).
You can test run JNotify with the command:
java -Djava.library.path=. -jar jnotify-0.94.jar [directory]
which will monitor the specified directory or the current directory if not specified and output events to the console.

下面是我从net.contentobjects.jnotify.JNotify中取出的main函数,可以直接编译运行

import java.io.File;
import java.io.IOException;


import net.contentobjects.jnotify.JNotify;
import net.contentobjects.jnotify.JNotifyListener;


public class JNotifyTest {


	public static void main(String[] args) throws InterruptedException, IOException
	{
		String dir = new File(args.length == 0 ? "." : args[0]).getCanonicalFile().getAbsolutePath();
		JNotify.addWatch(dir, JNotify.FILE_ANY, true, new JNotifyListener()
		{
			public void fileRenamed(int wd, String rootPath, String oldName,
					String newName)
			{
				System.out.println("renamed " + rootPath + " : " + oldName + " -> " + newName);
			}
			
			public void fileModified(int wd, String rootPath, String name)
			{
				System.out.println("modified " + rootPath + " : " + name);
			}
			
			public void fileDeleted(int wd, String rootPath, String name)
			{
				System.out.println("deleted " + rootPath + " : " + name);
			}
			
			public void fileCreated(int wd, String rootPath, String name)
			{
				System.out.println("created " + rootPath + " : " + name);
			}
		});
		
		System.out.println("Monitoring " + dir/* + ", ctrl+c to stop"*/);
		while (true) Thread.sleep(10000);
	}
}

我是在Linux下使用的命令行进行操作的,运行上面的demo。运行前,将jnotify-0.94.jar和操作系统对应的动态链接库(我用的是64位的libjnotify.so)。运行时,会出现以下问题:
1.编译时找不到jnotify-0.94.jar中的类,可以设置classpath路径,也可以使用下面的命令行参数,进行编译:
  javac -cp .:jnotify-0.94.jar JNotifyTest.java
  -cp 后面不要忘加当前目录.
2.运行时,执行下面的命令:
  java -cp .:jnotify-0.94.jar JNotifyTest
  这时会报下面的错误:
  Exception in thread "main" java.lang.UnsatisfiedLinkError: no jnotify in java.library.path
  这是因为程序运行时在动态链接库的搜索路径中找不到libjnotify.so(前面的lib是前缀,后面的.so是后缀),在bash下可以通过以下设置完成,
  export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
3.动态链接库搜索路径设置成功以后,可能还会出现下面的问题:
  Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/local/study/jnotify3/libjnotify.so: /lib64/libc.so.6: version `GLIBC_2.12' not found
  这个问题在于系统的glibc库版本不是libjnotify.so编译时使用的版本,使用 rpm -qi glibc 查看系统的glibc库版本信息,在这里看到我的版本号是2.5,低于libjnotify.so编译时使用的版本2.12。
  我的处理方法是在本机重新编译libjnotify.so,如下:
  ·首先将源代码中的以下三个文件拷贝到某一目录下
  net_contentobjects_jnotify_linux_JNotify_linux.c inotify-syscalls.h net_contentobjects_jnotify_linux_JNotify_linux.h
  ·然后进行编译,如下
  -bash-3.1$ gcc -I /usr/java/jdk1.6.0_45/include/ -I /usr/java/jdk1.6.0_45/include/linux/ -fPIC -g -c net_contentobjects_jnotify_linux_JNotify_linux.c -o libjnotify.o
  -bash-3.1$ gcc -g -shared -W1 -o libjnotify.so libjnotify.o -lc
  -bash-3.1$ ls
  inotify-syscalls.h  libjnotify.so                                     net_contentobjects_jnotify_linux_JNotify_linux.h
  libjnotify.o        net_contentobjects_jnotify_linux_JNotify_linux.c
  这里要引入 jni 需要的库,而且版本要和操作系统相匹配。使用 uname -a 查看操作系统的版本,java -version 查看JDK版本。我这里操作系统和JDK都是64位版本。
  此时可以正常使用libjnotify.so了。


正确的执行过程如下:
-bash-3.1$ ls
jnotify-0.94.jar  JNotifyTest.java  libjnotify.so
-bash-3.1$ javac -cp .:jnotify-0.94.jar JNotifyTest.java 
-bash-3.1$ java -cp .:jnotify-0.94.jar JNotifyTest
-bash-3.1$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
-bash-3.1$ java -cp .:jnotify-0.94.jar JNotifyTest
Monitoring /usr/local/study/jnotify3

下面是我参考的文章,感谢他们的分享
http://blog.csdn.net/qq160816/article/details/7679426
http://blog.csdn.net/force_eagle/article/details/8684669
http://blog.csdn.net/hmsiwtv/article/details/8197263



你可能感兴趣的:(java,linux,命令行,动态链接库,jnotify)