在Ant中如何创建并使用目标库?远程导入目标文件的问题求助
嘿,我来帮你搞定这两个Ant相关的问题!先从创建和使用目标库的方法说起,再解决你头疼的远程导入目标文件无法本地查看的麻烦~
1. 编写可复用的目标文件
首先把通用的Ant目标提取到单独的XML文件里,比如mytargets.xml,里面可以包含编译、打包、清理这类重复使用的逻辑,示例代码如下:
<?xml version="1.0" encoding="UTF-8"?> <project name="MyCompanyTargets" default="help"> <target name="compile" description="Compile Java source files"> <javac srcdir="${src.dir}" destdir="${build.classes.dir}" includeantruntime="false"/> </target> <target name="package" depends="compile" description="Package compiled classes into JAR"> <jar destfile="${dist.dir}/${project.name}.jar" basedir="${build.classes.dir}"/> </target> <target name="clean" description="Clean build artifacts"> <delete dir="${build.dir}"/> <delete dir="${dist.dir}"/> </target> </project>
2. 本地项目中使用目标库
在你的项目build.xml里,用<import>标签导入本地的目标文件即可复用这些目标:
<project name="MyProject" default="package"> <!-- 定义通用属性 --> <property name="src.dir" value="src/main/java"/> <property name="build.dir" value="build"/> <property name="build.classes.dir" value="${build.dir}/classes"/> <property name="dist.dir" value="dist"/> <!-- 导入本地的目标库 --> <import file="../path/to/mytargets.xml"/> </project>
3. 将目标库发布到制品仓库
把你的mytargets.xml按版本号整理好,上传到公司的制品仓库,比如按http://mycompany.com/artifacts/mycompany.com/mytargets/1.2.3/mytargets-1.2.3.xml这样的路径存储,方便其他项目通过URL导入。
你现在用URL导入的方式确实没法直接查看文件内容,这里有几个实用的解决办法:
方法一:手动下载+动态切换导入路径
先把远程的mytargets-1.2.3.xml手动下载到本地某个目录,比如lib/ant-targets/,然后在build.xml里用属性来控制导入的路径,想查看的时候就用本地路径,正式构建再切回远程URL:
<project name="MyProject" default="package"> <!-- 定义属性,默认用远程URL,需要查看时改成本地路径 --> <property name="mytargets.url" value="http://mycompany.com/artifacts/mycompany.com/mytargets/1.2.3/mytargets-1.2.3.xml"/> <!-- <property name="mytargets.url" value="lib/ant-targets/mytargets-1.2.3.xml"/> --> <!-- 导入目标文件 --> <import url="${mytargets.url}"/> </project>
方法二:用Ant的<get>任务自动下载到本地
在构建开始前自动把远程文件下载到本地临时目录,然后导入本地的副本,这样既能保证使用最新版本,又能随时查看本地文件:
<project name="MyProject" default="package"> <!-- 定义远程URL和本地保存路径 --> <property name="mytargets.remote.url" value="http://mycompany.com/artifacts/mycompany.com/mytargets/1.2.3/mytargets-1.2.3.xml"/> <property name="mytargets.local.path" value=".ant-cache/mytargets-1.2.3.xml"/> <!-- 自动下载远程文件到本地 --> <target name="fetch-targets" description="Download remote targets file"> <mkdir dir="${basedir}/.ant-cache"/> <get src="${mytargets.remote.url}" dest="${mytargets.local.path}" usetimestamp="true"/> </target> <!-- 导入本地缓存的目标文件,依赖下载任务 --> <import file="${mytargets.local.path}" depends="fetch-targets"/> </project>
这个方法里,usetimestamp="true"会检查远程文件的更新时间,只有当远程文件比本地新的时候才会重新下载,避免重复请求。
方法三:利用制品仓库的本地缓存
如果你们公司用的是Nexus、Artifactory这类支持本地缓存的制品仓库,可以配置Ant使用仓库的本地缓存目录。一般这类仓库会把下载过的文件缓存到本地(比如用户目录下的.m2/repository或者仓库指定的缓存路径),你可以找到缓存后的mytargets-1.2.3.xml文件直接查看。
内容的提问来源于stack exchange,提问作者davidrmcharles

