本文吐槽!
假设我们创建两个Java项目,一个叫StatsReader,把数据从网上下载到本地数据库里;一个叫StatsViewer,把数据从数据库里拿出来呈现给用户。这两个项目都要用同一个外部类库mysql-connector-java-5.0.8-bin.jar。
Eclipse可以创建一个工作集,内含多个Java项目,但工作集只是一个概念,与项目的实际存储位置无关。但是我们可以把两个项目放在同一个目录里,比如D:\Source Code\NBA\StatsReader和D:\Source Code\NBA\StatsViewer。
假设有个需求,要求reader读完数据后自动打开viewer。我们可以用修改.project文件增加链接文件夹的方式把StatsReader的编译位置从D:\Source Code\NBA\StatsReade\bin转移到D:\Source Code\NBA\bin,即..\bin。同样StatsViewer也这样转移。
Java编译烂就烂在在文件级别上源代码与二进制一一对应,我有a.java,它就编出a.class。所以,万一StatsReader和StatsReader有某个文件重名就会出错。
我从C#出身的,在Java里我习惯把包含main函数的文件起名为Program.java,所以有StatsReader/Program.java和StatsViewer/Program.java,编译后bin里只会有一个Program.class,我也不知道是reader的还是viewer的!
那行吧,幸亏我还能把java程序打包成jar。比如我reader先调试好了,打包成StatsReader.jar,放到bin里,然后开始调试viewer。
因为reader的program.class在bin里面,我在eclipse的viewer项目里点击运行,实际上运行的还是reader!我要重新编译reader,不行的!说要清理项目状态然后编译。清理项目状态其实就把bin里的所有文件都清除了,我刚打包好的StatsReader.jar没了!
Visual Studio支持就好多了!VS创建一个项目,这个项目就自动处在一个解决方案里,从一开始就告诉你一个解决方案可以包含多个项目,而不特别去查的话不会知道Eclipse有工作集这个玩意儿。
VS可以强制重新编译项目,不管代码文件有没有改过,它都给你编译一遍。VS也可以清理解决方案,就跟Eclipse清理项目状态差不多,但VS它不是一股脑地整个删除bin文件夹里的文件,它只会删除它生成的文件。
像我刚才描述的两个项目,在VS里面我想就很好做,结构清晰,管理简单。有人不服气了,说Eclipse有Ant自动构建大神,还有maven大神、Gradle大神,但我这只是简单的需求就要动用到另一项专门技术?Eclipse里菜单是有“Ant自动构建”之类的选项,但我怎么知道这是什么意思?
我也不知道Eclipse能不能执行“编译前动作”“编译后动作”,这似乎是ant负责的事。能不能编译到D:\Source Code\NBA\StatsReade\bin,打包成jar放到D:\Source Code\NBA\bin,运行D:\Source Code\NBA\bin的jar?看起来非得搞懂自动构建才行!
VS编译前编译后动作就很明显,在项目属性窗口里,点几下就能看到。尽管编译前编译后动作属于自动构建领域,但VS不引进这个概念,我直接看到我想要的就用了,不知不觉,“原来这就是自动构建呀!”VS也支持编译后把非代码文件复制到编译目录。在我的例子里,reader和viewer都要连接数据库,我想把连接字符串存在一个文件里,比如connection.txt,与两个程序放在同级目录。由于上面清理项目状态的问题,这个txt经常被删掉。在VS里就方便了,txt与代码放一起,但设置编译后复制到编译目录,这样就行了。
要说VS有没有类似ant大神的自动构建工具,我不知道,但其csproj文件就具有一定的编程能力。
结论就是,Visual Studio比Eclipse好用!
欢迎拍砖。