-12-14   最后修改:2009-12-14

需要在项目打包后,生成的jar包所在目录生成一个临时目录。

开始,直接取了user.dir,可打包后发现出不对:user.dir为用户工作目录。

那么只能从class loading入手了,从加载资源class计算URL得到一个该目录(这样能得到结果,就是不知道有什么风险?我在windows和linux上测试过)。

我的FileUtil代码如下:

Java代码 复制代码
  1. public class FileUtil {   
  2.     private static final Log logger = LogFactory.getLog(FileUtil.class);   
  3.     /**  
  4.      * syslog应用程序被打包成为jar包发布。在syslog服务中,需要在jar文件位置创建临时文件夹,以保存数据。  
  5.      * 临时文件夹:1 读文件中,ftp到中央日志服务的文件,被放到临时文件夹后再读。  
  6.      *          2 分析会后的日志,保存一个月。如果选择了备份,则把每天需要备份的文件移动到一个临时备份文件夹。  
  7.      * 逻辑:如果getDirFromClassLoader()方法计算不出来path,就取System.getProperty("user.dir")用户工作目录  
  8.      * */  
  9.     public static String getJarDir(){   
  10.         String path = getDirFromClassLoader();   
  11.         if(path == null){   
  12.             path = System.getProperty("user.dir");   
  13.         }   
  14.         return path;   
  15.     }   
  16.        
  17.     /**  
  18.      * 从通过Class Loading计算路径:  
  19.      * 1 class文件通过jar包加载:  
  20.      * 如果为jar包,该包为d:/test/myProj.jar  
  21.      * 该方法返回d:/test这个目录(不受用户工作目录影响)  
  22.      * 提示:在jar包加载 的时候,通过指定加载FileUtil的class资源得到jar:<url>!/{entry}计算出加载路径  
  23.      * 2 class文件直接被加载:  
  24.      * 如果是web工程,class文件放在D:/tools/apache-tomcat-5.5.27/webapps/webProj/WEB-INF/classes  
  25.      * 该方法返回D:/tools/apache-tomcat-5.5.27/webapps/webProj/WEB-INF  
  26.      * 即返回放class文件夹的上一层目录。  
  27.      * */  
  28.     private static String getDirFromClassLoader(){   
  29.         try {   
  30.             String path = FileUtil.class.getName().replace(".""/");   
  31.             path ="/"+path+".class";   
  32.             URL url=FileUtil.class.getResource(path);   
  33.             String jarUrl= url.getPath();   
  34.             if(jarUrl.startsWith("file:")){   
  35.                 if(jarUrl.length()>5){   
  36.                     jarUrl = jarUrl.substring(5);   
  37.                 }   
  38.                 jarUrl = jarUrl.split("!")[0];   
  39.   
  40.             }else{   
  41.                 jarUrl = FileUtil.class.getResource("/").toString().substring(5);   
  42.             }   
  43.             File file = new File(jarUrl);   
  44.             return file.getParent();   
  45.                
  46.         } catch (Exception e) {   
  47.         }   
  48.         return null;   
  49.     }   
  50.        
  51.     /**  
  52.      * 找出指定目录及其子目录下,满足指定后缀的文件的绝对路径。  
  53.      * 提示:方法中出现异常被内部捕获。  
  54.      * @param dir 指定目录  
  55.      * @param suffix 文件名后缀  
  56.      *   
  57.      * @throws IllegalArgumentException   
  58.      * */  
  59.     public static List<String> find(String dir,String suffix){   
  60.         List<String> list = new ArrayList<String>();   
  61.         try {   
  62.             File file = new File(dir);   
  63.             if(file.exists() && file.isDirectory()){   
  64.                 find(file, suffix, list);   
  65.             }else{   
  66.                 throw new IllegalArgumentException("param /"dir/" must be an existing directory .dir = "+dir);   
  67.             }   
  68.         } catch (Exception e) {   
  69.             logger.error("gcw:find(dir,suffix) - "+e.getMessage());   
  70.         }   
  71.         return list;   
  72.     }   
  73.     /**  
  74.      * 递归遍历,查找满足后缀的文件  
  75.      * @param dirFile 必须为一个存在的目录.不能为null  
  76.      * @param suffix  
  77.      * @param list 递归遍历目录记录满足后缀的文件的绝对路径。  
  78.      * */  
  79.     private static void find(File dirFile,String suffix,List<String> list){   
  80.         if(dirFile.exists() && dirFile.isDirectory()){   
  81.             File[] subFiles = dirFile.listFiles();   
  82.             for(File subFile : subFiles) {   
  83.                 if(subFile.isDirectory()){   
  84.                     find(subFile, suffix, list);   
  85.                 }else{   
  86.                     String path = subFile.getAbsolutePath();   
  87.                     if(path.endsWith(suffix)){   
  88.                         list.add(path);   
  89.                     }   
  90.                 }   
  91.             }   
  92.         }else{   
  93.             throw new IllegalArgumentException("param /"dir/" must be an existing directory .dir = "+dirFile.getAbsolutePath());   
  94.         }   
  95.     }   
  96.        
  97. }