Ant与批处理(win环境)学习笔记

背景:最近个人附带的负责维护测试服务环境,每天早上的过程大致如下:
远程登录到主机438——进入构建目录——删除Cloud和dist两个文件夹——进入ant目录——键入build开始构建(由于系统很大一般要12分钟)——构建完成之后打开SSH File Transfer将新构建的连个文件夹上传到Rhel服务器——在Rhel中启动cloud和dc。
   刚开始还好,搞得天数多了难免不生厌,于是想如何使上述这一过程做到最大程度的自动化呢?
   想到的一种实现方式:
a、将build做成随机启动(因服务器一般都不关闭的,因此考虑做成定时的)(写.cmd脚本)
b、将删除与上传工的作放进构建脚本中(修改ant脚本)
于是开始行动, 先去系统地学习一下ant的使用... ...

————————Ant学习之简单Demo——————
一、基本概念
1、什么是Ant
2、什么是构建
3、使用Ant的优势(相对于make而言)
   .跨平台
   .使用简单
   .语法清晰
   .功能强大

二、Ant安装

1、http://ant.apache.org/bindownload.cgi下载Ant,当前最新版本为1.8.1
2、 与配置Jdk的环境类似,新建一个变量:ANT_HOME=ant所在目录
    设置Path为: %ANT_HOME%/bin
注意:如果要让Ant能够支持Junit,需要将JUnit的junit.jar放置在Ant的lib目录并记得修改ClassPath中原有关Junit的设定。
3、 进入CMD界面,键入ant -v
    若出现有关版本的提示则表明你的安装成功了。
好了,让我们开始进入Ant的编写... ...

三、Ant简单Demo
目的: 使用Ant来达成目的,完成一件事情的实例
.编写一个程序
.编译它们
.把它们打成jar包
.设定它们的存放位置
.运行它们
1、首先写一个HelloWorld.java

package test.ant;

public class HelloWorld {
	
	public static void main(String[] args) {
		System.out.println("Welcome to The Ant World");
	}

}


2、 撰写构建脚本build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="HelloWorld" default="run" basedir=".">
   <property name="src" value="src"/>
   <property name="dest" value="classes"/>
   <property name="hello_jar" value="hello1.jar"/>
   <target name="init">
      <mkdir dir="${dest}"/>
   </target>
   
   <target name="compile" depends="init">
      <javac srcdir="${src}" destdir="${dest}" includeantruntime="false"/>
   </target>
   
   <target name="build" depends="compile"> 
      <jar jarfile="${hello_jar}" basedir="${dest}"/>
   </target>
   
   <target name="run" depends="build">
      <java classname="test.ant.HelloWorld" classpath="${hello_jar}"/>
   </target>
   
   <target name="clean">
      <delete dir="${dest}"/>
      <delete file="${hello_jar}"/>
   </target>
   
   <target name="return" depends="clean,run">
      <ant target="clean"/>
      <ant target="run"/>
   </target>
</project>


3、解读脚本
把你想做的每一件事情写一个target,depends是它所依赖的target,在执行当前的target之前必须先执行depends中所定义的target。
  注意:上述脚本中return这个target是一个特殊的target,相当于还原
4、执行
键入ant,你会发现你所定义的一个个任务都已经完成。有时我们可能并不想执行程序,只是想执行其中的某些步骤,那么你可以采取如下的做法:
  ant targetName 即可,如我只执行clean就键入 ant clean
  ^_^ ^_^ Demo至此完工,休息一下,继续后面的学习... ...

途中遇到的问题:
1、 ant warning:'includeantruntime' was not set,defaulting to build.sysclasspath=last;set to false for repeatable builds
解决方案:在javac标签中加入属性includeantruntime="false" 便可以了

—————————Ant学习之Ant整合————————————
  背景:我们目前的项目一共分成了8个模块,共13个小工程,不同的小组负责不同的模块或者工程,为了测试,各个小组都是自己写的build.xml,而我作为测试维护人员负责把这些模块组合到一块使用。写一个build.xml,这时我就惆怅了:
   1、重新写一个build.xml?——这貌似很麻烦
   2、 尽量利用同事已经写好的build.xml,减少自己的工作
   也正因为决定采取第二种方式,现在开始学习Ant整合
———————————————————————————————————————————————————————————
  假设只有3个模块,每个小组负责一个模块,他们分别有一个src和写好的build.xml。此时你拿到他们的src,你需要做的是建立三个文件夹src1,src2,src3并分别把他们的src和build.xml合并写一个新的build.xml。
  

<?xml version="1.0" encoding="UTF-8"?>
<project name="main" default="build" basedir=".">
   <property name="bin" value="${basedir}/bin"/>
   <property name="src1" value="${basedir}/src1"/>
   <property name="src2" value="${basedir}/src2"/>
   <property name="src3" value="${basedir}/src3"/>
   <target name="init">
      <mkdir dir="${bin}"/>
   </target>
   
   <target name="run">
      <ant dir="${src1}" target="run"/>
      <ant dir="${src2}" target="run"/>
      <ant dir="${src3}" target="run"/>
   </target>
   
   <target name="clean">
      <ant dir="${src1}" target="run"/>
      <ant dir="${src2}" target="run"/>
      <ant dir="${src3}" target="run"/>
   </target>
   
   <target name="build" depends="init">
      <copy todir="${bin}">
      	<fileset dir="${src1}">
      		<include name="*.jar"/>
      	</fileset>
      		<fileset dir="${src2}">
      		<include name="*.jar"/>
      	</fileset>
      		<fileset dir="${src3}">
      		<include name="*.jar"/>
      	</fileset>
      </copy>
   </target>
   
   <target name="rebuild" depends="build,clean">
      <ant target="clean"/>
      <ant target="build"/>
   </target>
</project>

OK,你的任务完成了!

——————————Ant进阶学习——————————
如你所见,上述做法还是存在很大的问题,重点体现在重复性的东西比较多,每次修改一个目录导致要修改多处,是否能让工作做得更好一点呢?
  引入两个东西:
  1、property
  2、xml include
这两个东西都有一个功能,就是能把build.xml中</property>分离出来共同使用。
差异:
  property的特点是维护简单,只需要简单的键值对
  xml include的特点是不但可以提取出属性,连target也可以提取

——————————————————————————————————————
   继续上述例子,如我们想把src1 src2 src3这三个属性从xml中提出来,可以新建一个all.properties,里面的内容如下:
src1=文件位置...
src2=文件位置...
src3=文件位置
然后你的build.xml可以这样写,别人只需要修改你的配置文件all.properties而不需修改你的build.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project name="main" default="build" basedir=".">
   <property name="bin" value="${basedir}/bin"/>
   <property file="all.properties"/>
   <target name="init">
      <mkdir dir="${bin}"/>
   </target>
   
   <target name="run">
      <ant dir="${src1}" target="run"/>
      <ant dir="${src2}" target="run"/>
      <ant dir="${src3}" target="run"/>
   </target>
   
   <target name="clean">
      <ant dir="${src1}" target="run"/>
      <ant dir="${src2}" target="run"/>
      <ant dir="${src3}" target="run"/>
   </target>
   
   <target name="build" depends="init">
      <copy todir="${bin}">
      	<fileset dir="${src1}">
      		<include name="*.jar"/>
      	</fileset>
      		<fileset dir="${src2}">
      		<include name="*.jar"/>
      	</fileset>
      		<fileset dir="${src3}">
      		<include name="*.jar"/>
      	</fileset>
      </copy>
   </target>
   
   <target name="rebuild" depends="build,clean">
      <ant target="clean"/>
      <ant target="build"/>
   </target>
</project>


   有时候你想给每个小组的build.xml中添加几个target,一种做法是每个build.xml中写入target,但是有一种更好的做法: 
    你可以写一个include.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
  <property name="src" value="src"/>
  <property name="dest" value="classes"/>
  <target name="test">
    <ant target="run"/>
  </target>
</xml>


然后你可以按如下方式更改你的每个build.xml,在每个build.xml中写入:

 <!-- include a xml file, it can be common property, can be also a target -->
  <!DOCTYPE project[
     <!ENTITY share-variable SYSTEM "file:../include.xml">
  ]>

   然后再在build.xml中的<project></project>之间写入 &share-variable;即可
如下:

<?xml version="1.0" encoding="UTF-8"?>
  <!-- include a xml file, it can be common property, can be also a target -->
  <!DOCTYPE project[
     <!ENTITY share-variable SYSTEM "file:../include.xml">
  ]>
<project name="HelloWorld" default="run" basedir=".">
	<!--use the include -->
	&share-variable;
	<!--define the property -->
	<!-- via include
	   <property name="src" value="src"/>
   <property name="dest" value="classes"/>
	-->
   <property name="hello_jar" value="hello1.jar"/>
	<!--define op -->
   <target name="init">
      <mkdir dir="${dest}"/>
   </target>
   
   <target name="compile" depends="init">
      <javac srcdir="${src}" destdir="${dest}" includeantruntime="false"/>
   </target>
   
   <target name="build" depends="compile"> 
      <jar jarfile="${hello_jar}" basedir="${dest}"/>
   </target>
   
   <target name="run" depends="build">
      <java classname="test.ant.HelloWorld" classpath="${hello_jar}"/>
   </target>
   
   <target name="clean">
      <delete dir="${dest}"/>
      <delete file="${hello_jar}"/>
   </target>
   
   <target name="return" depends="clean,run">
      <ant target="clean"/>
      <ant target="run"/>
   </target>
</project>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,你的问题是如何在 Ant Design 的 Table 中显示预览图片。对吧? 如果是这样的话,可以考虑使用 Ant Design 中的 Upload 组件和 Modal 组件来实现。具体步骤如下: 1. 在 Table 中,使用 render 函数来渲染每一行的数据,其中包括需要显示预览图片的列。 2. 在 render 函数中,使用 Upload 组件来上传图片,并将图片的 url 存储在 state 中。 3. 在 render 函数中,使用 Modal 组件来显示预览图片。当用户点击图片时,Modal 组件会显示图片的预览。 下面是一个简单的示例代码: ```javascript <template> <a-table :columns="columns" :data-source="data"> <template #avatar="text"> <a-upload :show-upload-list="false" :before-upload="handleUpload" > <a-avatar :src="avatarUrl" /> </a-upload> <a-modal :visible="previewVisible" @cancel="handleCancel"> <a-img :src="previewImage" /> </a-modal> </template> </a-table> </template> <script> export default { data() { return { data: [ { name: "John Brown", age: 32, avatarUrl: "", }, ], previewVisible: false, previewImage: "", }; }, methods: { handleUpload(file) { // 上传图片,并将图片的 url 存储在 state 中 this.avatarUrl = URL.createObjectURL(file.raw); }, handlePreview(url) { // 显示图片预览 this.previewImage = url; this.previewVisible = true; }, handleCancel() { // 隐藏图片预览 this.previewVisible = false; }, }, computed: { columns() { return [ { title: "Name", dataIndex: "name", }, { title: "Age", dataIndex: "age", }, { title: "Avatar", dataIndex: "avatarUrl", scopedSlots: { customRender: "avatar" }, width: "20%", }, ]; }, }, }; </script> ``` 在这个示例中,我们使用了 Upload 组件来上传图片,并将图片的 url 存储在 state 中。在 render 函数中,我们使用了 Modal 组件来显示预览图片。当用户点击图片时,Modal 组件会显示图片的预览。 希望这可以帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值