Java web项目 获取classpath路径问题

    这几天,以前工作过的同事要重新安装下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,还好现在发现及时改了。


你可能感兴趣的:(java,classpath)