使用Ant打包整个项目

[b][color=green][size=large]Maven的出现,使得项目管理,更加方便,快捷,但并不意味着Ant就从此消失了,现在很多的Apache的项目,依旧提供了Ant编译的方式,有的既提供了Ant的编译方式,也提供了Maven的编译方式,他们的优劣,散仙在这里就不加以讨论了,因为这种话题没什么具体的意义,合适的项目就选择合适的构建工具即可![/size][/color][/b]

[b][color=green][size=large]1,我们先看下,使用ant打包整个项目,并运行的例子:散仙的例子里,使用的jar包有lucene的,也有jdk自带的,所以打包整个项目,并使用java -cp xx.jar ,项目的主要两个测试类如下:

[/size][/color][/b]

package com.study.lucene;

/**
*
* 仅仅依赖JDK运行
*
*
*
* **/
public class TestReadControl {


public static void main(String[] args) {


if(args.length<1){
System.out.println("你没有传递任何参数!");
}else{

for(String s:args){
System.out.println("你传递的是: "+s);
}
}




}

}

package com.study.lucene;

import java.io.StringReader;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.miscellaneous.PatternAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;


/**
*
* 依赖lucene和jdk
*
*
* **/

public class TestAnalysis {


public static void main(String[] args) throws Exception {

String text="你没有输入任何内容!";
if(args.length==1){
text=args[0];
}
Analyzer analyzer=new StandardAnalyzer();
//空字符串代表单字切分
TokenStream ts= analyzer.tokenStream("field", new StringReader(text));
CharTermAttribute term=ts.addAttribute(CharTermAttribute.class);
ts.reset();
while(ts.incrementToken()){
System.out.println(term.toString());
}
ts.end();
ts.close();


}

}



[b][color=green][size=large]当前的结构路径,如下:[/size][/color][/b]

[img]http://dl2.iteye.com/upload/attachment/0103/1105/bc751bcf-e46c-341d-9544-bc0df767118c.jpg[/img]
[b][color=green][size=large]注意,lucene依赖的jar包,在build.xml里有依赖拷贝,下面看下build.xml里面的内容:[/size][/color][/b]、

<project name="${component.name}" basedir="." default="jar">
<property environment="env"/>
<!--

如果在这个地方配置hadoop的home,只需编译时用,
在project.classpath里面定义home即可
<property name="hadoop.home" value="${env.HADOOP_HOME}"/>
-->

<property name="hadoop.home" value="D:\hadooplib"/>
<property name="lucene.home" value="D:\lucenelib"/>
<!-- 指定jar包的名字 -->
<property name="jar.name" value="myjob.jar"/>
<!-- 编译时的依赖环境 -->
<path id="project.classpath">

<fileset dir="lib">
<include name="*.jar" />
</fileset>

<fileset dir="${lucene.home}">
<include name="*.jar" />
</fileset>
<!-- <fileset dir="${hadoop.home}">
<include name="**/*.jar" />
</fileset> -->

</path>
<!-- 编译前清空上次的bin文件 -->
<target name="clean" >
<delete dir="bin" failonerror="false" />
<mkdir dir="bin"/>
</target>

<!-- 构建编译源码 -->
<target name="build" depends="clean">
<echo message="${ant.project.name}: ${ant.file}"/>
<javac destdir="bin" encoding="utf-8" debug="true" includeantruntime="false" debuglevel="lines,vars,source">
<src path="src"/>
<exclude name="**/.svn" />
<classpath refid="project.classpath"/>
</javac>
<copy todir="bin">
<fileset dir="src">
<include name="*config*"/>
</fileset>
</copy>
</target>


<!-- 构建jar包时,会拷贝到lib目录里 -->

<target name="jar" depends="build">
<copy todir="bin/lib">
<fileset dir="lib">
<include name="**/*.*"/>
</fileset>
</copy>


<!-- 去掉下面的注释时,下面的lib包会被拷贝到lib目录里 -->

<!-- <echo message="111"/> -->
<copy todir="bin/lib">
<fileset dir="${lucene.home}">
<include name="**/*.*"/>
</fileset>
</copy>
<!--<echo message="222"/>-->





<!-- lib-classpath , my.classpath,可以直接在linux上对应的home里,加载lib包 -->
<path id="lib-classpath">
<fileset dir="lib" includes="**/*.jar" />
<fileset dir="${lucene.home}" includes="**/*.jar" />
</path>

<pathconvert property="my.classpath" pathsep=" " >
<mapper>
<chainedmapper>
<!-- 移除绝对路径 -->
<flattenmapper />
<!-- 加上lib前缀 -->
<globmapper from="*" to="lib/*" />
</chainedmapper>
</mapper>
<path refid="lib-classpath" />
</pathconvert>






<jar basedir="bin" destfile="${jar.name}" >
<include name="**/*"/>
<!-- define MANIFEST.MF -->
<manifest>
<attribute name="Class-Path" value="${my.classpath}" />
</manifest>

</jar>
</target>
</project>



[b][color=green][size=large]然后在对应的同级目录下提供lib目录,放入依赖的jar包即可[/size][/color][/b]


[b][color=green][size=large]
第二种方式,编译时候在windows上,引入需要依赖的jar,但并不把依赖的jar包打入lib目录下,然后再linux上,使用cp命令,把依赖的jar包拷贝入:
[/size][/color][/b]
<project name="${component.name}" basedir="." default="jar">
<property environment="env"/>
<!--

如果在这个地方配置hadoop的home,只需编译时用,
在project.classpath里面定义home即可
<property name="hadoop.home" value="${env.HADOOP_HOME}"/>
-->

<property name="hadoop.home" value="D:\hadooplib"/>
<property name="lucene.home" value="D:\lucenelib"/>
<!-- 指定jar包的名字 -->
<property name="jar.name" value="myjob.jar"/>
<!-- 编译时的依赖环境 -->
<path id="project.classpath">

<fileset dir="lib">
<include name="*.jar" />
</fileset>

<fileset dir="${lucene.home}">
<include name="*.jar" />
</fileset>
<!-- <fileset dir="${hadoop.home}">
<include name="**/*.jar" />
</fileset> -->

</path>
<!-- 编译前清空上次的bin文件 -->
<target name="clean" >
<delete dir="bin" failonerror="false" />
<mkdir dir="bin"/>
</target>

<!-- 构建编译源码 -->
<target name="build" depends="clean">
<echo message="${ant.project.name}: ${ant.file}"/>
<javac destdir="bin" encoding="utf-8" debug="true" includeantruntime="false" debuglevel="lines,vars,source">
<src path="src"/>
<exclude name="**/.svn" />
<classpath refid="project.classpath"/>
</javac>
<copy todir="bin">
<fileset dir="src">
<include name="*config*"/>
</fileset>
</copy>
</target>


<!-- 构建jar包时,会拷贝到lib目录里 -->

<target name="jar" depends="build">
<copy todir="bin/lib">
<fileset dir="lib">
<include name="**/*.*"/>
</fileset>
</copy>


<!-- 去掉下面的注释时,下面的lib包会被拷贝到lib目录里 -->

<!-- <echo message="111"/>
<copy todir="bin/lib">
<fileset dir="${lucene.home}">
<include name="**/*.*"/>
</fileset>
</copy>-->
<!--<echo message="222"/>-->





<!-- lib-classpath , my.classpath,可以直接在linux上对应的home里,加载lib包 -->
<!-- 将jar包的路径载入classpath里 -->
<path id="lib-classpath">
<fileset dir="lib" includes="**/*.jar" />
<!-- <fileset dir="${lucene.home}" includes="**/*.jar" /> -->
</path>

<pathconvert property="my.classpath" pathsep=" " >
<mapper>
<chainedmapper>
<!-- 移除绝对路径 -->
<flattenmapper />
<!-- 加上lib前缀 -->
<globmapper from="*" to="lib/*" />
</chainedmapper>
</mapper>
<path refid="lib-classpath" />
</pathconvert>






<jar basedir="bin" destfile="${jar.name}" >
<include name="**/*"/>
<!-- define MANIFEST.MF -->
<manifest>
<attribute name="Class-Path" value="${my.classpath}" />
</manifest>

</jar>
</target>
</project>


linux下的目录
drwxrwxr-x 4 search search     4096 Nov 12 17:10 bin
-rw-rw-r-- 1 search search 2740 Nov 12 17:07 build.xml
drwxrwxr-x 2 search search 4096 Nov 12 17:10 lib
-rw-rw-r-- 1 search search 25726164 Nov 12 17:10 myjob.jar
drwxrwxr-x 3 search search 4096 Nov 12 17:10 src
-rw-rw-r-- 1 search search 577 Nov 12 17:27 ss.sh
[search@fsedump03sand LuceneDemo]$


执行脚本如下:


[search@fsedump03sand LuceneDemo]$ cat ss.sh


cs='.:'

libpath="/home/search/lucenedemo/lib/lucenelib/"

#jarlib=`ls $libpath`


#echo $jarlib


for txt in `ls $libpath`

do


cs=$cs$libpath$txt:


done


#拼接上主程序类
cs=$cs"./myjob.jar"

echo $cs


echo "运行没有依赖的jar包"
java -cp myjob.jar com.study.lucene.TestReadControl
echo "===================运行有依赖,无传参======================="
java -cp $cs com.study.lucene.TestAnalysis
echo "======================运行有依赖,有传参===================="
java -cp $cs com.study.lucene.TestAnalysis "i am 啊 中国人 "


运行结果如下:
[search@fsedump03sand LuceneDemo]$ sh ss.sh    
.:/home/search/lucenedemo/lib/lucenelib/lucene-analyzers-common-4.10.2.jar:/home/search/lucenedemo/lib/lucenelib/lucene-core-4.10.2.jar:/home/search/lucenedemo/lib/lucenelib/lucene-queryparser-4.10.2.jar:./myjob.jar
运行没有依赖的jar包
你没有传递任何参数!
===================运行有依赖,无传参=======================









======================运行有依赖,有传参====================
i
am




[search@fsedump03sand LuceneDemo]$


[b][color=green][size=large]第二种方式,仅仅在编译期间,引用了windows上的依赖jar,而并不需要,把windows上的一些jar打入jar包里,因为这些jar可能很大,例如hadoop的或hbase的,当然不引入,并不代表我们不需要,编译期仍然需要,参与编译,传到服务器上时,服务器已经有jar包了,所以不需要在windows上,上传上去,因为我们在linux上,使用cp命令,拷贝载入了需要依赖的jar所以才没报错,可以正常运行,如需在ant里调试,可以使用echo脚本进行打印显示。 [/size][/color][/b]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值