最近有一个需求,要通过命令行将一个文件夹下的所有java文件编译为class文件,包括子文件夹中的。
一开始找到一个命令:(表示将TestProjects目录下所有.java文件编译为class文件,并存放在目标文件夹中)
javac -d 目标文件夹 D:\TestProjects\*.java
但此命令不能编译子目录中的java文件
遍历文件夹中所有文件,并用正则表达式匹配所有.java文件,匹配成功执行上述命令即可
/** * 将sourceFile所指文件夹中(包括子文件夹)所有java文件编译为class文件 * @param sourceFile * @param targetPath */ public static void compailJavaToClass(File sourceFile, String targetPath) { try { // 判断文件不为null或文件目录存在 if (sourceFile == null || !sourceFile.exists()){ return; } // 取得这个目录下的所有子文件对象 File[] files = sourceFile.listFiles(); // 遍历该目录下的文件对象 for (File f: files){ //判断子目录是否存在子目录,如果是文件则删除 if (f.isDirectory()){ compailJavaToClass(f, targetPath); }else { // System.out.println("开始执行命令: sonar-scanner"); // 打印文件名 String name = f.getName(); String path = f.getPath(); // .:任意字符,*:任意次数 // 这里表示匹配任意结尾为java的文件 String pattern = ".*java"; System.out.println("path: " + path); if(Pattern.matches(pattern, name)) { String cmd = "javac -d " + targetPath + " " + path; System.out.println(cmd); Process proc = Runtime.getRuntime().exec(cmd); } } } }catch (Exception e) { e.printStackTrace(); } }
测试效果
File file = new File("D:\\TestProjects\\TestForFindbugs"); GitUtil.compailJavaToClass(file, "D:\\TestProjects\\TestForFindbugs\\classes");// classes文件夹必须已经存在