这几天,以前工作过的同事要重新安装下SVN服务器。SVN管理系统是公司内部开发的一套管理系统。主要实现功能有
创建SVN仓库、管理公司用户、分配仓库权限等功能。由于要做到web页面控制SVN服务的基本功能,需要做一些调用、编辑一些文件。自然就要获取到文件的路径,classpath的路径必然需要获取。两年前,我添加完用户权限管理功能完后,测试没什么问题。获取classpath是正常的。
代码如下
/** * 获取项目ClassPath的绝对路径 * @return */ public static String getClassPath(){ String classPath = null; classPath = RmSvnAdminInit.class.getResource("/" + "").toString(); classPath = classPath.substring(6); //截掉路径的”file:“前缀 System.out.println("ClassPath的绝对路径 = /"+classPath); return classPath; }
大家看到了,获取路径后是是需要截取掉 "file:"后的路径 /var/www/svn/website/svn/WEB-INF/classes/
原路径是:file:/var/www/svn/website/svn/WEB-INF/classes/
输出信息
ClassPath的绝对路径 = file:/root/svn/WEB-INF/classes/ ClassPath的绝对路径 = root/svn/WEB-INF/classes/ ClassPath的绝对路径 = file:/root/svn/WEB-INF/classes/ ClassPath的绝对路径 = root/svn/WEB-INF/classes/ --------初始化版本库 crtp 配置信息-------- svn.properties 属性文件路径 : root/svn/WEB-INF/classes/svn.properties ApacheWebSiteConfigPath : /etc/apache2/sites-available/svn 仓库权限文件路径 : /var/www/svn/crtp/conf/authz 创建authz初始化标记文件 /var/www/svn/crtp/conf/lockinitAuth 修改配置文件目录权限 /var/www/svn/crtp Shell : chmod 777 -R /var/www/svn/crtp Shell : chown cloud:subversion -R /var/www/svn/crtp --------初始化成功--------
最近获取路径是发现
输出的信息是:
ClassPath的绝对路径 = file:/var/www/svn/website/svn/WEB-INF/classes/ ClassPath的绝对路径 = var/www/svn/website/svn/WEB-INF/classes/ ClassPath的绝对路径 = file:/var/www/svn/website/svn/WEB-INF/classes/ ClassPath的绝对路径 = var/www/svn/website/svn/WEB-INF/classes/ 2015-05-16 17:20:32,104 DEBUG [org.apache.struts.action.ExceptionHandler] - java.lang.NullPointerException at java.io.File.<init>(Unknown Source) at pm.svn.RmSvnAdminInit.<init>(RmSvnAdminInit.java:33) at pm.svn.rmsvnrepository.web.RmSvnRepositoryInitAction.initRepo(RmSvnRepositoryInitAction.java:51) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
也就是说
获取不到路径
var/www/svn/website/svn/WEB-INF/classes/
所以报错了。
对比的Linux版本
出错版本:
Linux version 3.13.0-32-generic (buildd@phianna) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #57~precise1-Ubuntu SMP Tue Jul 15 03:51:20 UTC 2014
原版本:
Linux version 3.13.0-24-generic (buildd@panlong) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014
新的版本我没有用过,原因可能和tomcat路径、当前启动路径都有关系。
最后发现,原因是之前启动的方式是 service tomcat start
默认是从 根目录 / 启动 所以 路径var/www/svn/website/svn/WEB-INF/classes/能找到
而现在的启动方式是 /usr/local/tomcat/bin/startup.sh
这就有问题了,当前路径如果是 /root 那么全路径就是/root/var/www/svn/website/svn/WEB-INF/classes/
文件肯定是找不到了。所以,是路径不对。
对此,最好的方法是修改下获取classpath的方法做到以不变应万变:
/** * 获取项目ClassPath的绝对路径 * @return */ public static String getClassPath(){ String classPath = RmSvnAdminInit.class.getClassLoader().getResource("/").getPath(); String rootPath = ""; // 符号 "\\"、 "/"、 "//" 替换为 / classPath = classPath.replace("\\\\", "/"); classPath = classPath.replace("\\", "/"); classPath = classPath.replace("//", "/"); System.out.println("ClassPath的绝对路径 = "+classPath); return classPath; }
这样获取路径就不会有问题。
细节问题,编码方式都是要注重。以前没多少经验,代码写的有些bug,还好现在发现及时改了。