效果
最终还是调用javac命令编译源文件的,只不过调用javac通过CreatePipe、CreateProcess、ReadFile来完成.
CreatePipe
CreateProcessA
这个函数有点复杂,我还没有研究透彻.
ReadFile
用来从管道中读取数据
实现原理
首先不得不说javac的一些参数,在项目中,会用到不少jar包,在javac时,就需要指定其中的-extdirs参数.如JedisTest类中引入了Jedis包,如果单纯的使用javac ,那指定是不能通过编译的
但是如果指明了jedis的jar路径后,就可以成功编译,
但是对于Web项目,还需要servlet-api等,这些jar可在tomcat\lib下找到,所以,对于extdirs,可能要指明多个路径,使用;分割.
当面对成百上千的源文件是,javac提供了@这种方式来一次性编译
那又有新的问题,我们要遍历项目下所有的源文件,把他们的绝对路径都列举到一个文件中,最后把这个集合传递给javac
遍历生成有两个办法,使用dir(VB中的函数),但是dir函数貌似不支持直接递归,也就是在新的调用结束时,外层dir会使用上一次的处理结果,不是本层,导致出错.所以使用了FindNextFile、FindFirstFile函数.
其中的sJavaFilePathList数组用来保存java文件,通过遍历时Redim Preserve动态定义不断更新
遍历结束后,使用open函数输出到txt中.
在生成完java文件集合之后,拼接并执行javac命令
下面是重点调用.
通过CreatePipe创建管道后,将hReadPipe和hWritePipe句柄传递给STARTUPINFO结构体,CreateProcessA和此结构体关联之后,此时就可以通过ReadFile不断读取结果了,直到为0
其中appendLog是模块中的方法,展示log
在第一个文本框中输入项目路径,第二个文本框是引入的jar地址
点击编译后在项目src下生成out和source文本,其中out则是class输出目录,source则是项目中所有java文件
其实遍历还有一种更简单的方法,通过cmd的dir命令,指定/b/s,通过>输出到文本中
dir /b/s *.java>source.txt
此命令递归并只列举所有.java文件