转:
详解myeclipse和maven的clean和build
MyEclipse是一个被广为使用的软件,但是很多人用了很久,对它如何编译,执行一个java工程却没有一个清楚的认识。比如,
- clean和build到底有什么区别?
- 直接run主类之前用不用clean一下?
- 直接clean和maven clean是不是一样的?
- 直接build和maven build,结果相同吗?
另外,在遇到最棘手的问题:
错误: 找不到或无法加载主类
的时候,很容易陷入懵逼状态。下面我结合我的一些实验,简单介绍下myeclipse的,clean,build,run,以及他们和maven clean,maven build的区别。
一.myeclipse的clean,build和run
首先,我们使用一个普通的maven工程作为例子。
- clean。作用很简单,清空输出目录下的所有文件,每一个source folder都有一个自己的输出目录,也就是output
folder。这个目录可以在build path里进行设置,一个标准maven工程中,src/main/java通常的输出目录是工程名/target/classes
- build。build的作用则是编译,实际上就是把source fold下的所有文件转移到相应的output folder, .java文件先编译再转移,其他文件直接转移。在maven工程中,这个build其实相当于一次myeclipse自身的编译,最后再利用maven提取一下资源文件。
- 其实两者区别很明显了,很多时候我们分不清他和clean的区别,是因为myeclipse提供了很多便利的机制。clean的提示框如下:
看到红框了吗,如果打勾,表示clean完毕之后立刻进行一次build,那看起来就和build没什么区别了。如果你把勾去掉,clean后去查看输出目录,就会发现输出目录被清空了。这里就不进行截图了。
4.run。简单来说就是找一个main方法,直接右键,run java application,相信大家都用过。这个run,实际上就是去工程名/target/classes
这个目录下去找class文件执行而已(如果不是maven工程,可能去工程名/classes下找),那么没有文件怎么办呢?如果你刚刚完成了clean,但是没有build,那么它会自动build一次。此外都会直接去找文件执行,如果找不到咋办?
错误: 找不到或无法加载主类
二.maven的clean和build
- maven clean
默认情况下直接删除target文件夹。简单直接。 - maven build
按照maven规则进行编译,和myeclipse无关,也就是说,不管你是不是设置了source folder,maven都按照他那一套进行编译,具体规则大家可以找maven文章深入学习。 - maven的一些规则。maven的默认输出文件夹也是
工程名/target/classes
,无论源代码还是资源文件,根目录都是这个文件夹,打包其实就相当于把这个文件夹打包而已。
三.总结
无论如何,build之前都应该clean,因为如果直接build,同名文件直接覆盖,非同名文件会保留,这有可能给程序带来未知的问题。如果myeclipse的输出文件夹设置合理,那么和maven build可能也不会出现什么不同。但是,在使用maven的情况下,直接使用myeclipse内置的build功能仍然可能会和maven build产生不完全一致的效果,比如maven可能会忽视src/main/java文件夹内的资源文件,而myeclipse会保留。
严格来说,myeclipse内置的编译功能,更多的是提供代码提示和检查功能,即使你完全不使用它,maven也可以正确编译。(当然这样你就享受不到代码提示之类的的了)。
但可以确定的是,使用maven clean build总是可以生成最精确的结果,所以推荐先maven clean build后再运行程序。