最近在尝试做一个类似sourceforge的开源社区,因此需要为项目申请者提供远程SVN的配置。这里列出自己的代码和心得,一是为了与大家相互交流,更重要的是为了让各位提提意见,看看还需要什么内容。
现在提供的功能有:
   为项目创建svn仓库,修改svn账户密码,修改svn权限配置等。
   大家觉得还需要什么呢?
代码如下:
  首先定义一个异常:
 package commandLineTest;
package commandLineTest;


 class SvnException extends Exception
class SvnException extends Exception  {
{

 public SvnException(String s)
    public SvnException(String s)  {
{
 super(s);
        super(s);
 }
    }
 }
}

下面是对svn的操作:
 package commandLineTest;
package commandLineTest;

 import java.io.BufferedReader;
import java.io.BufferedReader;
 import java.io.BufferedWriter;
import java.io.BufferedWriter;
 import java.io.File;
import java.io.File;
 import java.io.FileNotFoundException;
import java.io.FileNotFoundException;
 import java.io.FileReader;
import java.io.FileReader;
 import java.io.FileWriter;
import java.io.FileWriter;
 import java.io.IOException;
import java.io.IOException;
 import java.io.InputStreamReader;
import java.io.InputStreamReader;


 public class SvnCommander
public class SvnCommander  {
{

 private String svn_home = "K:/subversion-repository/";
    private String svn_home = "K:/subversion-repository/";


 /** *//**
    /** *//**
 * 为指定项目在服务器创建svn仓库,当用户选择开通svn服务时,这个方法将被调用为用户的项目创建svn仓库
     * 为指定项目在服务器创建svn仓库,当用户选择开通svn服务时,这个方法将被调用为用户的项目创建svn仓库
 *
     * 
 * @param project
     * @param project
 *            需要创建svn仓库的项目的名称
     *            需要创建svn仓库的项目的名称
 * @throws SvnException
     * @throws SvnException
 *             当创建失败时将抛出错误
     *             当创建失败时将抛出错误
 */
     */

 public void createRepository(String project) throws SvnException
    public void createRepository(String project) throws SvnException  {
{

 try
        try  {
{
 Process p = new ProcessBuilder("svnadmin", "create", svn_home
            Process p = new ProcessBuilder("svnadmin", "create", svn_home
 + project).start();
                    + project).start();
 StringBuffer buffer = new StringBuffer();
            StringBuffer buffer = new StringBuffer();
 String tmp;
            String tmp;
 // BufferedReader reader=new BufferedReader(new
            // BufferedReader reader=new BufferedReader(new
 // InputStreamReader(p.getInputStream()));
            // InputStreamReader(p.getInputStream()));
 // while((tmp=reader.readLine())!=null)
            // while((tmp=reader.readLine())!=null)
 // buffer.append(tmp);
            // buffer.append(tmp);
 // System.out.println(buffer.toString());
            // System.out.println(buffer.toString());
 // buffer=new StringBuffer();
            // buffer=new StringBuffer();
 BufferedReader reader = new BufferedReader(new InputStreamReader(p
            BufferedReader reader = new BufferedReader(new InputStreamReader(p
 .getErrorStream()));
                    .getErrorStream()));
 while ((tmp = reader.readLine()) != null)
            while ((tmp = reader.readLine()) != null)
 buffer.append(tmp);
                buffer.append(tmp);
 // System.err.println(buffer.toString());
            // System.err.println(buffer.toString());
 if (buffer.length() > 0)
            if (buffer.length() > 0)
 throw new SvnException(buffer.toString());
                throw new SvnException(buffer.toString());
 initSvnServer(project);
            initSvnServer(project);
 initAuthz(project);
            initAuthz(project);

 } catch (IOException e)
        } catch (IOException e)  {
{
 // TODO Auto-generated catch block
            // TODO Auto-generated catch block
 e.printStackTrace();
            e.printStackTrace();
 }
        }

 }
    }


 /** *//**
    /** *//**
 * 用于修改svn仓库的svnserve.conf配置文件,这个方法将在@link createRepository(String name)
     * 用于修改svn仓库的svnserve.conf配置文件,这个方法将在@link createRepository(String name)
 * 中被自动调用,不建议被其他类调用
     * 中被自动调用,不建议被其他类调用
 *
     * 
 * @param project
     * @param project
 *            svn仓库对应的项目名称
     *            svn仓库对应的项目名称
 * @throws SvnException
     * @throws SvnException
 *             当用户所在的项目并没有开通svn服务,或者修改svnserve.conf文件出现io错误时将抛出SvnException
     *             当用户所在的项目并没有开通svn服务,或者修改svnserve.conf文件出现io错误时将抛出SvnException
 */
     */

 public void initSvnServer(String project) throws SvnException
    public void initSvnServer(String project) throws SvnException  {
{
 File svnserve = new File(svn_home + project + "/conf/svnserve.conf");
        File svnserve = new File(svn_home + project + "/conf/svnserve.conf");

 try
        try  {
{
 BufferedReader reader = new BufferedReader(new FileReader(svnserve));
            BufferedReader reader = new BufferedReader(new FileReader(svnserve));
 StringBuffer buffer = new StringBuffer();
            StringBuffer buffer = new StringBuffer();
 String tmp;
            String tmp;
 while ((tmp = reader.readLine()) != null)
            while ((tmp = reader.readLine()) != null)
 buffer.append(tmp + "\n");
                buffer.append(tmp + "\n");
 reader.close();
            reader.close();
 int index = buffer.indexOf("# anon");
            int index = buffer.indexOf("# anon");
 buffer.delete(index, index + 2);
            buffer.delete(index, index + 2);
 index = buffer.indexOf("# auth");
            index = buffer.indexOf("# auth");
 buffer.delete(index, index + 2);
            buffer.delete(index, index + 2);
 index = buffer.indexOf("# pass");
            index = buffer.indexOf("# pass");
 buffer.delete(index, index + 2);
            buffer.delete(index, index + 2);
 index = buffer.indexOf("# auth");
            index = buffer.indexOf("# auth");
 buffer.delete(index, index + 2);
            buffer.delete(index, index + 2);
 BufferedWriter writer = new BufferedWriter(new FileWriter(svnserve));
            BufferedWriter writer = new BufferedWriter(new FileWriter(svnserve));
 writer.write(buffer.toString());
            writer.write(buffer.toString());
 writer.close();
            writer.close();

 } catch (FileNotFoundException e)
        } catch (FileNotFoundException e)  {
{
 // TODO Auto-generated catch block
            // TODO Auto-generated catch block
 throw new SvnException("SvnException: 配置文件svnserve.conf未找到: "
            throw new SvnException("SvnException: 配置文件svnserve.conf未找到: "
 + e.toString());
                    + e.toString());

 } catch (IOException e)
        } catch (IOException e)  {
{
 // TODO Auto-generated catch block
            // TODO Auto-generated catch block
 throw new SvnException("SvnException: 配置文件svnserve.conf的io操作出现问题: "
            throw new SvnException("SvnException: 配置文件svnserve.conf的io操作出现问题: "
 + e.toString());
                    + e.toString());
 }
        }
 }
    }


 /** *//**
    /** *//**
 * 为用户设置svn帐户的密码,
     * 为用户设置svn帐户的密码,
 * 该方法将修改项目仓库的passwd文件,如果该用户帐户已存在于passwd文件中,将修改其密码信息;如果不存在,则会在passwd添加新的记录
     * 该方法将修改项目仓库的passwd文件,如果该用户帐户已存在于passwd文件中,将修改其密码信息;如果不存在,则会在passwd添加新的记录
 *
     * 
 * @param project
     * @param project
 *            用户所在的项目名称
     *            用户所在的项目名称
 * @param name
     * @param name
 *            用户帐户名称
     *            用户帐户名称
 * @param key
     * @param key
 *            用户密码
     *            用户密码
 * @throws SvnException
     * @throws SvnException
 *             当用户所在的项目并没有开通svn服务,或者修改passwd文件出现io错误时将抛出SvnException
     *             当用户所在的项目并没有开通svn服务,或者修改passwd文件出现io错误时将抛出SvnException
 */
     */
 public void setPassword(String project, String name, String key)
    public void setPassword(String project, String name, String key)

 throws SvnException
            throws SvnException  {
{
 File file = new File(svn_home + project);
        File file = new File(svn_home + project);
 if (!file.exists())
        if (!file.exists())
 throw new SvnException("SvnException: 该项目还未开通svn服务");
            throw new SvnException("SvnException: 该项目还未开通svn服务");
 File passwd = new File(svn_home + project + "/conf/passwd");
        File passwd = new File(svn_home + project + "/conf/passwd");

 try
        try  {
{
 BufferedReader reader = new BufferedReader(new FileReader(passwd));
            BufferedReader reader = new BufferedReader(new FileReader(passwd));
 StringBuffer buffer = new StringBuffer();
            StringBuffer buffer = new StringBuffer();
 String tmp;
            String tmp;
 while ((tmp = reader.readLine()) != null)
            while ((tmp = reader.readLine()) != null)
 buffer.append(tmp + "\n");
                buffer.append(tmp + "\n");
 reader.close();
            reader.close();
 int index = buffer.indexOf(name + " = ");
            int index = buffer.indexOf(name + " = ");

 if (index != -1)
            if (index != -1)  {
{
 int line_end = buffer.indexOf("\n", index);
                int line_end = buffer.indexOf("\n", index);
 if (line_end == -1)
                if (line_end == -1)
 line_end = buffer.length();
                    line_end = buffer.length();
 buffer.replace(index + name.length() + 3, line_end, key);
                buffer.replace(index + name.length() + 3, line_end, key);

 } else
            } else  {
{
 buffer.append(name + " = " + key);
                buffer.append(name + " = " + key);
 }
            }
 BufferedWriter writer = new BufferedWriter(new FileWriter(passwd));
            BufferedWriter writer = new BufferedWriter(new FileWriter(passwd));
 writer.write(buffer.toString());
            writer.write(buffer.toString());
 writer.close();
            writer.close();

 } catch (FileNotFoundException e)
        } catch (FileNotFoundException e)  {
{
 // TODO Auto-generated catch block
            // TODO Auto-generated catch block
 throw new SvnException("SvnException: 配置文件passwd未找到: "
            throw new SvnException("SvnException: 配置文件passwd未找到: "
 + e.toString());
                    + e.toString());

 } catch (IOException e)
        } catch (IOException e)  {
{
 // TODO Auto-generated catch block
            // TODO Auto-generated catch block
 throw new SvnException("SvnException: 配置文件passwd的io操作出现问题: "
            throw new SvnException("SvnException: 配置文件passwd的io操作出现问题: "
 + e.toString());
                    + e.toString());
 }
        }
 }
    }


 private void initAuthz(String project) throws SvnException
    private void initAuthz(String project) throws SvnException  {
{
 File template = new File("authz_template.txt");
        File template = new File("authz_template.txt");
 File authz = new File(svn_home + project + "/conf/authz");
        File authz = new File(svn_home + project + "/conf/authz");

 try
        try  {
{
 BufferedReader reader = new BufferedReader(new FileReader(template));
            BufferedReader reader = new BufferedReader(new FileReader(template));
 BufferedWriter writer = new BufferedWriter(new FileWriter(authz));
            BufferedWriter writer = new BufferedWriter(new FileWriter(authz));
 String tmp;
            String tmp;
 while ((tmp = reader.readLine()) != null)
            while ((tmp = reader.readLine()) != null)
 writer.write(tmp);
                writer.write(tmp);
 reader.close();
            reader.close();
 writer.close();
            writer.close();

 } catch (FileNotFoundException e)
        } catch (FileNotFoundException e)  {
{
 // TODO Auto-generated catch block
            // TODO Auto-generated catch block
 throw new SvnException("SvnException: 配置文件passwd未找到: "
            throw new SvnException("SvnException: 配置文件passwd未找到: "
 + e.toString());
                    + e.toString());

 } catch (IOException e)
        } catch (IOException e)  {
{
 // TODO Auto-generated catch block
            // TODO Auto-generated catch block
 throw new SvnException("SvnException: 配置文件passwd的io操作出现问题: "
            throw new SvnException("SvnException: 配置文件passwd的io操作出现问题: "
 + e.toString());
                    + e.toString());
 }
        }
 }
    }


 /** *//**
    /** *//**
 * 用于设置各个用户对svn的使用权限
     * 用于设置各个用户对svn的使用权限
 *
     * 
 * @param project
     * @param project
 *            对应的项目名称
     *            对应的项目名称
 * @param path
     * @param path
 *            权限对应的文件夹,该参数应该采取"/foo/bar"的形式,不然设置结果将不起作用
     *            权限对应的文件夹,该参数应该采取"/foo/bar"的形式,不然设置结果将不起作用
 * @param name
     * @param name
 *            用户名称,全部用户应该使用"*"来表示
     *            用户名称,全部用户应该使用"*"来表示
 * @param right
     * @param right
 *            权限,为"r"或者"rw"两种形式
     *            权限,为"r"或者"rw"两种形式
 */
     */
 public void setAuthz(String project, String path, String name, String right)
    public void setAuthz(String project, String path, String name, String right)

 throws SvnException
            throws SvnException  {
{
 File passwd = new File(svn_home + project + "/conf/authz");
        File passwd = new File(svn_home + project + "/conf/authz");

 try
        try  {
{
 BufferedReader reader = new BufferedReader(new FileReader(passwd));
            BufferedReader reader = new BufferedReader(new FileReader(passwd));
 StringBuffer buffer = new StringBuffer();
            StringBuffer buffer = new StringBuffer();
 String tmp;
            String tmp;
 while ((tmp = reader.readLine()) != null)
            while ((tmp = reader.readLine()) != null)
 buffer.append(tmp + "\n");
                buffer.append(tmp + "\n");
 reader.close();
            reader.close();
 int begin = buffer.indexOf("[" + project + ":" + path + "]");
            int begin = buffer.indexOf("[" + project + ":" + path + "]");
 System.err.println(begin);
            System.err.println(begin);

 if (begin != -1)
            if (begin != -1)  {
{
 int end = buffer.indexOf("[" + project, begin+1);
                int end = buffer.indexOf("[" + project, begin+1);
 System.err.println(end);
                System.err.println(end);
 if (end == -1)
                if (end == -1)
 end = buffer.length();
                    end = buffer.length();
 int index = buffer.indexOf(name, begin);
                int index = buffer.indexOf(name, begin);
 System.err.println(index);
                System.err.println(index);

 if (index < end && index != -1)
                if (index < end && index != -1)  {
{
 int line_end = buffer.indexOf("\n", index);
                    int line_end = buffer.indexOf("\n", index);
 if (line_end == -1)
                    if (line_end == -1)
 line_end = buffer.length();
                        line_end = buffer.length();
 buffer.replace(index + name.length() + 3, line_end, right);
                    buffer.replace(index + name.length() + 3, line_end, right);

 } else
                } else  {
{
 int line_end = buffer.indexOf("\n", begin);
                    int line_end = buffer.indexOf("\n", begin);
 if (line_end == -1)
                    if (line_end == -1)
 line_end = buffer.length();
                        line_end = buffer.length();
 buffer.insert(line_end + 1, name + " = " + right + "\n");
                    buffer.insert(line_end + 1, name + " = " + right + "\n");
 }
                }

 } else
            } else  {
{
 buffer.append("[" + project + ":" + path + "]\n");
              buffer.append("[" + project + ":" + path + "]\n");
 buffer.append(name + " = " + right + "\n");
              buffer.append(name + " = " + right + "\n");
 }
            }
 BufferedWriter writer = new BufferedWriter(new FileWriter(passwd));
            BufferedWriter writer = new BufferedWriter(new FileWriter(passwd));
 writer.write(buffer.toString());
            writer.write(buffer.toString());
 writer.close();
            writer.close();

 } catch (FileNotFoundException e)
        } catch (FileNotFoundException e)  {
{
 // TODO Auto-generated catch block
            // TODO Auto-generated catch block
 throw new SvnException("SvnException: 配置文件authz未找到: "
            throw new SvnException("SvnException: 配置文件authz未找到: "
 + e.toString());
                    + e.toString());

 } catch (IOException e)
        } catch (IOException e)  {
{
 // TODO Auto-generated catch block
            // TODO Auto-generated catch block
 throw new SvnException("SvnException: 配置文件authz的io操作出现问题: "
            throw new SvnException("SvnException: 配置文件authz的io操作出现问题: "
 + e.toString());
                    + e.toString());
 }
        }
 }
    }


 /** *//**
    /** *//**
 * @param args
     * @param args
 */
     */

 public static void main(String[] args)
    public static void main(String[] args)  {
{
 // TODO Auto-generated method stub
        // TODO Auto-generated method stub
 SvnCommander s = new SvnCommander();
        SvnCommander s = new SvnCommander();
 //        try {
//        try {
 //            s.createRepository("lala");
//            s.createRepository("lala");
 //        } catch (SvnException e) {
//        } catch (SvnException e) {
 //            // TODO Auto-generated catch block
//            // TODO Auto-generated catch block
 //            System.err.print(e.toString());
//            System.err.print(e.toString());
 //        }
//        }
 //         try {
//         try {
 //         s.setPassword("lala", "td", "12344321");
//         s.setPassword("lala", "td", "12344321");
 //         } catch (SvnException e) {
//         } catch (SvnException e) {
 //         // TODO Auto-generated catch block
//         // TODO Auto-generated catch block
 //         System.err.print(e.toString());
//         System.err.print(e.toString());
 //         }
//         }

 try
        try  {
{
 s.setAuthz("lala","/","haha","rw");
            s.setAuthz("lala","/","haha","rw");

 } catch (SvnException e)
        } catch (SvnException e)  {
{
 // TODO Auto-generated catch block
            // TODO Auto-generated catch block
 System.err.print(e.toString());
            System.err.print(e.toString());
 }
        }
 }
    }
 }
}

创建svn仓库是通过调用
Process p = new ProcessBuilder("svnadmin", "create", svn_home
     + project).start();
进行的。同时捕捉系统的返回查看是否有异常
BufferedReader reader = new BufferedReader(new InputStreamReader(p
     .getErrorStream()));
   while ((tmp = reader.readLine()) != null)
    buffer.append(tmp);
   // System.err.println(buffer.toString());
   if (buffer.length() > 0)
    throw new SvnException(buffer.toString());
而对密码和权限的修改是通过对svn默认的passwd以及authz文件进行文本操作。
另外既然是b/s模式当然有显示的页面,碍于篇幅就不详述咯
最后,有两个问题还想请问各位:
1.对文本的操作难道只能读入内存修改后重新写入吗?有没有比较高效的方法呢?
2.还需要什么额外的功能?因为svn的一些基本操作(如导入导出)其实通过svn客户端访问svn地址就可以了