1,我们先看下,使用ant打包整个项目,并运行的例子:散仙的例子里,使用的jar包有lucene的,也有jdk自带的,所以打包整个项目,并使用java -cp xx.jar ,项目的主要两个测试类如下:
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(); } }
当前的结构路径,如下:
注意,lucene依赖的jar包,在build.xml里有依赖拷贝,下面看下build.xml里面的内容:、
<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>
然后在对应的同级目录下提供lib目录,放入依赖的jar包即可
第二种方式,编译时候在windows上,引入需要依赖的jar,但并不把依赖的jar包打入lib目录下,然后再linux上,使用cp命令,把依赖的jar包拷贝入:
<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]$
第二种方式,仅仅在编译期间,引用了windows上的依赖jar,而并不需要,把windows上的一些jar打入jar包里,因为这些jar可能很大,例如hadoop的或hbase的,当然不引入,并不代表我们不需要,编译期仍然需要,参与编译,传到服务器上时,服务器已经有jar包了,所以不需要在windows上,上传上去,因为我们在linux上,使用cp命令,拷贝载入了需要依赖的jar所以才没报错,可以正常运行,如需在ant里调试,可以使用echo脚本进行打印显示。