如何用Ant将其他包的Car类添加至现有Jar并替换原Car类
解决Ant更新Jar替换指定类的问题
核心需求回顾
现有Jar包含同包下的Car.class、Home.class、Agency.class,需要用另一个包下的新Car类替换Jar里的旧Car.class,同时保留原Jar里的其他类,且类文件不能嵌套在多余文件夹里。
之前代码的问题
- 第一个脚本的
jar任务用了basedir="${build.dir}",会把build目录的整个目录结构都打进Jar,导致类被包裹在文件夹中 - 第二个
exec脚本写错了执行命令,应该调用jar工具而非java,参数格式也不对
正确的Ant实现方案
下面是完整的可运行脚本,注释里说明了每个步骤的作用:
<?xml version="1.0" encoding="UTF-8"?> <project default="update-jar" name="ReplaceCarInJar" basedir="."> <!-- 定义关键属性,根据你的实际路径修改 --> <property name="original.jar" location="../path/to/your/original.jar" /> <!-- 原Jar的路径 --> <property name="new.car.src" location="../src/newpack" /> <!-- 新Car类的源码目录 --> <property name="compile.dir" location="../build/classes" /> <!-- 编译输出目录 --> <!-- 清理编译目录 --> <target name="clean"> <delete dir="${compile.dir}" /> </target> <!-- 创建编译目录 --> <target name="init" depends="clean"> <mkdir dir="${compile.dir}" /> </target> <!-- 编译新的Car类,会自动生成对应包结构的class文件 --> <target name="compile-new-car" depends="init"> <javac srcdir="${new.car.src}" destdir="${compile.dir}" /> <echo message="新Car类编译完成" /> </target> <!-- 更新Jar:先删除旧的Car.class,再添加新的Car.class --> <target name="update-jar" depends="compile-new-car"> <!-- 第一步:删除原Jar中的旧Car.class,注意替换成你实际的包路径 --> <jar jarfile="${original.jar}" update="true"> <delete> <!-- 原Jar里旧Car的完整路径,比如原Car在com/oldpack下,就写com/oldpack/Car.class --> <fileset dir="" includes="com/oldpack/Car.class" /> </delete> </jar> <!-- 第二步:添加新编译的Car.class到Jar中 --> <jar jarfile="${original.jar}" update="true"> <!-- basedir指向编译输出的根目录,这样包结构会被正确打进Jar --> <fileset dir="${compile.dir}" includes="**/Car.class" /> </jar> <echo message="Jar更新完成:已替换Car.class" /> </target> </project>
关键说明
- 务必修改
original.jar、new.car.src等属性为你实际的文件路径 <delete>标签里的includes要写原Jar中旧Car.class的完整包路径(比如原Car在com.oldpack包下,路径就是com/oldpack/Car.class)- 编译新Car类时,Ant会自动根据包结构生成对应的目录,用
fileset指定**/Car.class就能精准找到新编译的类,避免打进多余文件 update="true"参数表示在原Jar基础上修改,不会覆盖其他类
内容的提问来源于stack exchange,提问作者panda
相关产品推荐
相关产品推荐

