2011-01-28 59 views
10

我们在我们的项目中使用了很多传统package.html文件,我们希望将它们转换为package-info.java文件。手动做这个不是一个选项(方式太多的文件)。有没有一种很好的方法来自动化?如何自动将所有javadoc package.html文件转换为package-info.java文件?

我们希望将其转换为一对夫妇的原因:

  • 根据JavaDoc规格:此文件是在JDK 5.0新,并且优于package.html的。

  • 为了不在同一个代码库

  • 混合这两种类型的文件,为了避免这种情况的IntelliJ/Eclipse构建把那些* .html文件在我们班迪尔斯(也可能在释放二进制罐),使他们像我们其他正常的html资源一样。

回答

7

如果您没有运行Windows,您可能需要更改目录分隔符。此外,转换是一个黑客,但它应该工作。出于好奇,你有多少包装手册不是一个选项?

public class Converter { 

    public static void main(String[] args) { 
     File rootDir = new File("."); 
     renamePackageToPackageInfo(rootDir); 
    } 

    private static void renamePackageToPackageInfo(File dir) { 
     File[] files = dir.listFiles(new FilenameFilter() { 
      @Override 
      public boolean accept(File dir, String name) { 
       return "package.html".equals(name); 
      } 
     }); 
     for (File file : files) { 
      convertFile(file); 
     } 
     // now recursively rename all the child directories. 
     File[] dirs = dir.listFiles(new FileFilter() { 
      @Override 
      public boolean accept(File pathname) { 
       return pathname.isDirectory(); 
      } 
     }); 
     for (File subdir : dirs) { 
      renamePackageToPackageInfo(subdir); 
     } 
    } 

    private static void convertFile(File html) { 
     // determine the FQN package name 
     String fqpn = getPackageName(html); 

     // check if package-info.java already exists 
     File packageInfo = new File(html.getParent(), "package-info.java"); 
     if (packageInfo.exists()) { 
      System.out.println("package-info.java already exists for package: "+fqpn); 
      return; 
     } 

     // create the i/o streams, and start pumping the data 
     try { 
      PrintWriter out = new PrintWriter(packageInfo); 
      BufferedReader in = new BufferedReader(new FileReader(html)); 
      out.println("/**"); 

      // skip over the headers 
      while (true) { 
       String line = in.readLine(); 
       if (line.equalsIgnoreCase("<BODY>")) 
        break; 
      } 
      // now pump the file into the package-info.java file 
      while (true) { 
       String line = in.readLine(); 
       if (line.equalsIgnoreCase("</BODY>")) 
        break; 
       out.println(" * " + line); 
      } 

      out.println("*/"); 
      out.println("package "+fqpn+";"); 
      out.close(); 
      in.close(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     // queue the package.html file for deletion 
     //html.deleteOnExit(); 
    } 

    private static String getPackageName(File file) { 
     StringBuilder path = new StringBuilder(file.getParent()); 
     // trim the first two characters (./ or .\) 
     path.delete(0, 2); 
     // then convert all separators into . (HACK: should use directory separator property) 
     return path.toString().replaceAll("\\\\", "."); 
    } 

} 
+1

我不认为这只是重命名的情况 - 请参阅http://download.oracle.com/javase/1.5.0/docs/tooldocs/windows/javadoc.html#packagecomment – 2011-01-28 15:36:39