2013-12-19 49 views
2

一个独特的测试场景我有,我需要能够读取Java中的一个给定的Github的项目(公共事业)的目录结构。换句话说,给定一个GitHub项目url,我的程序应该能够读取/src/main/java下的Java文件。读一GitHub上项目的目录结构中的Java

选项1:直接从像下面和解析某些令牌URL中读取HTML是一种选择,但它太脆而痛苦。

https://github.com/testuser/testproject/tree/master/src/main/java

选项2:下载该项目作为zip文件和使用Java ZipInputStream来处理它。

https://github.com/testuser/testproject/archive/master.zip

除了这两个选项,有没有简单的解决方案,我很想念?

+0

其他选项:实现一个git客户端;) – zapl

+2

或使用现有的一个:http://developer.github.com/libraries/ –

+0

感谢。我试图从[developer.github.com/libraries]提到的库列表使用[Kohsuke的GitHub的API对于Java(http://github-api.kohsuke.org/index.html)。我能够连接到公共库和获得[GHBranch(http://github-api.kohsuke.org/apidocs/index.html)对象。但是,我找不到任何提示文件/目录列表的线索。我发送了一封电子邮件给API的作者。 – MFIhsan

回答

1

因为我无法获取Java GitHub的图书馆工作,我决定来解析源zip文件得到我想要的东西。

String githubZip = "https://github.com/testuser/testproject/archive/master.zip" 

    ZipInputStream zipInputStream = null 
    def javaFiles = [:] 
    try { 
     zipInputStream = new ZipInputStream(new URL(githubZip).openStream()); 
     ZipEntry zipEntry; 

     while((zipEntry = zipInputStream.getNextEntry())!=null) { 
      if(!zipEntry.isDirectory() && zipEntry.getName().endsWith("java")){ 
       StringWriter stringWriter = new StringWriter() 
       IOUtils.copy(zipInputStream, stringWriter) 
       def fileContent = stringWriter.toString(); 

       javaFiles[zipEntry.getName()] = fileContent 
       stringWriter.close() 
      } 
     } 
    } catch (Exception e){ 
     e.printStackTrace() 
    } finally { 
     zipInputStream.close() 
    } 
0

使用JGit库克隆库到你的文件系统,然后遍历工作目录以正常的方式 - 因为它只是一个普通的目录。

+0

谢谢罗宾。正如Dave Newton所提到的,如果我成功使用develop.github.com/libraries中的一个GitHub Java API,那么这对我来说是理想的解决方案。我想避免将存储库克隆到文件系统,因为我可能没有访问外部构建系统的权限。 – MFIhsan