Java项目执行Ant Clean是否该删Lib目录?删除后如何用Ant+Ivy重建?
问题解答
是否该在clean时删除lib目录?
得看lib目录的维护方式:
- 如果
lib里的jar包是手动下载后提交到项目仓库的:绝对不能删,因为当前的build流程不会自动重建这个目录,删了之后编译肯定找不到依赖,直接失败。 - 如果
lib是用Ivy这类工具自动下载生成的:可以删,但前提是构建流程里必须包含重新拉取依赖的步骤,不然照样会崩。
从你给的代码里能看到ivy.xml,说明项目应该是用Ivy管依赖的,但现在的build目标根本没做拉取依赖的操作,所以当前clean删lib的逻辑完全不合理。
正确的构建调整方案
方案一:修改clean,保留lib目录(适合手动维护依赖的情况)
直接在clean的fileset里加一行排除lib/**,不让它删依赖目录:
<target name="clean" description="--> clean the project"> <delete includeemptydirs="true"> <fileset dir="${basedir}"> <exclude name="src/**" /> <exclude name="build.xml" /> <exclude name="ivy.xml" /> <exclude name="lib/**" /> <!-- 新增这行,保护lib目录 --> </fileset> </delete> </target>
方案二:完善构建流程,自动拉取依赖(适合Ivy管理依赖的情况)
既然有ivy.xml,那就把依赖拉取的步骤补到构建流程里,这样就算clean删了lib,build时也能自动重建:
1. 新增Ivy依赖拉取目标
<target name="resolve" description="--> 用Ivy拉取依赖"> <ivy:resolve /> <ivy:retrieve pattern="lib/[artifact]-[revision].[ext]" /> <!-- 把依赖下载到lib目录 --> </target>
2. 修改build目标,先拉取再编译
让build执行前先跑resolve,确保依赖已经到位:
<target name="build" description="Compile main source tree java files" depends="resolve"> <mkdir dir="${build.dir}" /> <javac srcdir="${java.dir}" destdir="${build.dir}" classpathref="lib.path.id" debug="true" deprecation="true" optimize="true" failonerror="true" /> <!-- class path properties files --> <copy file="${resource.dir}/log4j.properties" todir="${build.dir}" /> <copy file="${resource.dir}/mncplaymedia.properties" todir="${build.dir}" /> <copy todir="${build.dir}"> <fileset dir="${resource.dir}" /> </copy> </target>
3. (可选)保留clean删lib的逻辑
如果用Ivy自动管理,clean可以继续删lib,反正resolve会重新下载:
<target name="clean" description="--> clean the project"> <delete includeemptydirs="true"> <fileset dir="${basedir}"> <exclude name="src/**" /> <exclude name="build.xml" /> <exclude name="ivy.xml" /> <!-- 不用排除lib,resolve会重建 --> </fileset> </delete> </target>
最后验证
调整完之后,先跑ant clean,再跑ant build:
- 手动维护依赖的场景:lib目录没被删,编译正常;
- Ivy管理的场景:resolve会自动把依赖下载到lib,编译也能正常执行。
内容的提问来源于stack exchange,提问作者Adam Abdullah
相关产品推荐
相关产品推荐

