- 浏览: 2182260 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (682)
- 软件思想 (7)
- Lucene(修真篇) (17)
- Lucene(仙界篇) (20)
- Lucene(神界篇) (11)
- Solr (48)
- Hadoop (77)
- Spark (38)
- Hbase (26)
- Hive (19)
- Pig (25)
- ELK (64)
- Zookeeper (12)
- JAVA (119)
- Linux (59)
- 多线程 (8)
- Nutch (5)
- JAVA EE (21)
- Oracle (7)
- Python (32)
- Xml (5)
- Gson (1)
- Cygwin (1)
- JavaScript (4)
- MySQL (9)
- Lucene/Solr(转) (5)
- 缓存 (2)
- Github/Git (1)
- 开源爬虫 (1)
- Hadoop运维 (7)
- shell命令 (9)
- 生活感悟 (42)
- shell编程 (23)
- Scala (11)
- MongoDB (3)
- docker (2)
- Nodejs (3)
- Neo4j (5)
- storm (3)
- opencv (1)
最新评论
-
qindongliang1922:
粟谷_sugu 写道不太理解“分词字段存储docvalue是没 ...
浅谈Lucene中的DocValues -
粟谷_sugu:
不太理解“分词字段存储docvalue是没有意义的”,这句话, ...
浅谈Lucene中的DocValues -
yin_bp:
高性能elasticsearch ORM开发库使用文档http ...
为什么说Elasticsearch搜索是近实时的? -
hackWang:
请问博主,有用solr做电商的搜索项目?
Solr中Group和Facet的用法 -
章司nana:
遇到的问题同楼上 为什么会返回null
Lucene4.3开发之第八步之渡劫初期(八)
上篇,散仙讲了使用ant打包整个项目的方式,那样打包项目的总体大小,可能会变得非常臃肿,这样以来,整个jar包变得非常大,所以我们应该按需所取,灵活配置。
具体的思路就是,在打包时,配置ant的build.xml的脚本仅仅编译拷贝class,而不需要拷贝所用的jar包,或者一些其他的配置文件,比如xml或者一些log4j的文件,然后再启动时候,我们可以使用java -cp 把需要的jar包路径和配置文件的路径传进去,这样就比较灵活了,然后整个项目的jar包,会变得非常精简,
本次散仙的例子是打包一个有依赖lucene的分词器然后,并使用了log4j文件记录,注意,后面真正的运行时候,依赖的jar,log4j的包,还有一些配置文件,比如log4j等,会通过一个脚本动态的传参进去。
项目截图如下:
log4j的配置如下所示:
build.xml的配置
编写完成后,传到linux上,然后写个shell脚本,动态传入一些jar的路径和配置文件,例如log4j等,在linux上的目录执行ant后如下所示
然后我们的脚本里面如何定义的,因为我们的myjob.jar里面没有任何有关依赖的jar包,和conf配置文件,所以需要在启动时,使用cp命令动态传入,脚本如下所示:
执行效果如下所示:
而且,我们可以改动conf里面的log4j文件,再次启动时,会立刻生效,比如散仙打开了stdout控制台输出信息:
这样以来,我们的配置就非常灵活,任何依赖的jar包和配置文件,都可以放在项目以外的位置,不提供强依赖,必要时候,可以使用-cp加载。
最后需要注意的是,在linux上配置环境变量,注意export的方式:
具体的思路就是,在打包时,配置ant的build.xml的脚本仅仅编译拷贝class,而不需要拷贝所用的jar包,或者一些其他的配置文件,比如xml或者一些log4j的文件,然后再启动时候,我们可以使用java -cp 把需要的jar包路径和配置文件的路径传进去,这样就比较灵活了,然后整个项目的jar包,会变得非常精简,
本次散仙的例子是打包一个有依赖lucene的分词器然后,并使用了log4j文件记录,注意,后面真正的运行时候,依赖的jar,log4j的包,还有一些配置文件,比如log4j等,会通过一个脚本动态的传参进去。
项目截图如下:
log4j的配置如下所示:
log4j.rootCategory=INFO,fileout,errorout,stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout.ConversionPattern=%d{MM-dd HH\:mm\:ss.SSS}[%-30F\:%-5p\:%l] %m%n log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.fileout=org.apache.log4j.DailyRollingFileAppender log4j.appender.fileout.layout.ConversionPattern=%d{MM-dd HH\:mm\:ss.SSS}[%-5p] %m%n log4j.appender.fileout.layout=org.apache.log4j.PatternLayout log4j.appender.fileout.File=index_log log4j.appender.fileout.Append=true log4j.appender.fileout.DatePattern='.'yyyy-MM-dd log4j.appender.errorout=org.apache.log4j.RollingFileAppender log4j.appender.errorout.Threshold=ERROR log4j.appender.errorout.File=error_log log4j.appender.errorout.MaxFileSize=100000KB log4j.appender.errorout.MaxBackupIndex=10 log4j.appender.errorout.Append=true log4j.appender.errorout.layout=org.apache.log4j.PatternLayout log4j.appender.errorout.layout.ConversionPattern=%d{MM-dd HH\:mm\:ss.SSS}[%-30F\:%-5p\:%l] %m%n
build.xml的配置
<project name="${component.name}" basedir="." default="jar"> <!-- 引入环境变量 --> <property environment="env"/> <!-- --> <!-- 配置lucene的home地址,编译时用到,注意写法 --> <property name="lucene.home" value="${env.LUCENE_HOME}"/> <!-- 打印调试信息 --> <echo message="java的home是${env.LUCENE_HOME}"> </echo> <!-- 指定jar包的名字 --> <property name="jar.name" value="myjob.jar"/> <!-- 编译源码时需要依赖的jar包 --> <path id="project.classpath" > <fileset dir="lib"> <include name="*.jar"/> </fileset> <fileset dir="${lucene.home}"> <include name="*.jar"/> </fileset> </path> <!-- 编译前清空上次的bin文件 --> <target name="clean"> <delete dir="bin" failonerror="false"></delete> <mkdir dir="bin"/> </target> <!-- 构建编译源码 一般为固定写法 --> <target name="build" depends="clean"> <echo message="${ant.project.name}: ${ant.file}" ></echo> <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 --> <target name="jar" depends="build"> <!-- 这里是精简版的配置,如果需要,可以在这里面配置拷贝依赖的jar到lib目录里 --> <!-- <copy todir="bin/lib"> <fileset dir="lib"> <include name="**/*.*"/> </fileset> </copy> --> <jar basedir="bin" destfile="${jar.name}"> <include name="**/*" /> </jar> </target> </project>
编写完成后,传到linux上,然后写个shell脚本,动态传入一些jar的路径和配置文件,例如log4j等,在linux上的目录执行ant后如下所示
[search@fsedump03sand LuceneDemo]$ ant Buildfile: /home/search/LuceneDemo/build.xml [echo] hadoop的home是/home/search/hadoop [echo] java的home是/home/search/lucenedemo/lib/lucenelib/ clean: [delete] Deleting directory /home/search/LuceneDemo/bin [mkdir] Created dir: /home/search/LuceneDemo/bin buildwithout: [echo] ${component.name}: /home/search/LuceneDemo/build.xml [javac] Compiling 7 source files to /home/search/LuceneDemo/bin [javac] Note: /home/search/LuceneDemo/src/com/study/lucene/TestAnalysis.java uses or overrides a deprecated API. [javac] Note: Recompile with -Xlint:deprecation for details. jarwithout: [jar] Building jar: /home/search/LuceneDemo/myjob.jar BUILD SUCCESSFUL Total time: 1 second [search@fsedump03sand LuceneDemo]$ ll total 44 drwxrwxr-x 3 search search 4096 Nov 13 18:01 bin -rw-rw-r-- 1 search search 3514 Nov 13 15:30 build.xml drwxrwxr-x 2 search search 4096 Nov 13 15:45 conf -rw-rw-r-- 1 search search 256 Nov 13 15:45 error_log -rw-rw-r-- 1 search search 1628 Nov 13 15:45 index_log drwxrwxr-x 2 search search 4096 Nov 13 15:36 lib -rw-rw-r-- 1 search search 10407 Nov 13 18:01 myjob.jar -rw-rw-r-- 1 search search 364 Nov 13 15:43 sme.sh drwxrwxr-x 3 search search 4096 Nov 13 15:31 src [search@fsedump03sand LuceneDemo]$
然后我们的脚本里面如何定义的,因为我们的myjob.jar里面没有任何有关依赖的jar包,和conf配置文件,所以需要在启动时,使用cp命令动态传入,脚本如下所示:
[search@fsedump03sand LuceneDemo]$ cat sme.sh #定义根路径 cs='.:' cdir=`pwd` #echo $cdir #libpath="$cdir/lucenedemo/lib/lucenelib/" #依赖的jar包 libpath="/home/search/lucenedemo/lib/lucenelib/" #echo $libpath #获取依赖jar的目录,本例只有一个依赖jar, #如果有多个,可以都拼接上即可 FILES=`ls $libpath` for txt in $FILES;do cs=$cs$libpath$txt: #注意最后有个冒号拼接jar done #echo $cs #配置文件的目录 conf="conf:" #自身的jar,注意$cs命令一定要放在首位 cs=$cs$conf"myjob.jar" #echo $cs java -Xms128m -Xmx1024m -cp $cs com.study.lucene.TestAnalysis $1 [search@fsedump03sand LuceneDemo]$
执行效果如下所示:
[search@fsedump03sand LuceneDemo]$ sh sme.sh 你 没 有 输 入 任 何 内 容 [search@fsedump03sand LuceneDemo]$
容 [search@fsedump03sand LuceneDemo]$ sh sme.sh bbc bbc [search@fsedump03sand LuceneDemo]$
而且,我们可以改动conf里面的log4j文件,再次启动时,会立刻生效,比如散仙打开了stdout控制台输出信息:
[search@fsedump03sand LuceneDemo]$ sh sme.sh 11-13 18:25:27.784[TestAnalysis.java :WARN :com.study.lucene.TestAnalysis.main(TestAnalysis.java:41)] abc你 11-13 18:25:27.789[TestAnalysis.java :INFO :com.study.lucene.TestAnalysis.main(TestAnalysis.java:42)] 当前你 你 11-13 18:25:27.790[TestAnalysis.java :WARN :com.study.lucene.TestAnalysis.main(TestAnalysis.java:41)] abc没 11-13 18:25:27.791[TestAnalysis.java :INFO :com.study.lucene.TestAnalysis.main(TestAnalysis.java:42)] 当前没 没 11-13 18:25:27.792[TestAnalysis.java :WARN :com.study.lucene.TestAnalysis.main(TestAnalysis.java:41)] abc有 11-13 18:25:27.793[TestAnalysis.java :INFO :com.study.lucene.TestAnalysis.main(TestAnalysis.java:42)] 当前有 有 11-13 18:25:27.794[TestAnalysis.java :WARN :com.study.lucene.TestAnalysis.main(TestAnalysis.java:41)] abc输 11-13 18:25:27.795[TestAnalysis.java :INFO :com.study.lucene.TestAnalysis.main(TestAnalysis.java:42)] 当前输 输 11-13 18:25:27.796[TestAnalysis.java :WARN :com.study.lucene.TestAnalysis.main(TestAnalysis.java:41)] abc入 11-13 18:25:27.797[TestAnalysis.java :INFO :com.study.lucene.TestAnalysis.main(TestAnalysis.java:42)] 当前入 入 11-13 18:25:27.798[TestAnalysis.java :WARN :com.study.lucene.TestAnalysis.main(TestAnalysis.java:41)] abc任 11-13 18:25:27.799[TestAnalysis.java :INFO :com.study.lucene.TestAnalysis.main(TestAnalysis.java:42)] 当前任 任 11-13 18:25:27.800[TestAnalysis.java :WARN :com.study.lucene.TestAnalysis.main(TestAnalysis.java:41)] abc何 11-13 18:25:27.801[TestAnalysis.java :INFO :com.study.lucene.TestAnalysis.main(TestAnalysis.java:42)] 当前何 何 11-13 18:25:27.802[TestAnalysis.java :WARN :com.study.lucene.TestAnalysis.main(TestAnalysis.java:41)] abc内 11-13 18:25:27.803[TestAnalysis.java :INFO :com.study.lucene.TestAnalysis.main(TestAnalysis.java:42)] 当前内 内 11-13 18:25:27.804[TestAnalysis.java :WARN :com.study.lucene.TestAnalysis.main(TestAnalysis.java:41)] abc容 11-13 18:25:27.805[TestAnalysis.java :INFO :com.study.lucene.TestAnalysis.main(TestAnalysis.java:42)] 当前容 容 11-13 18:25:27.806[TestAnalysis.java :ERROR:com.study.lucene.TestAnalysis.main(TestAnalysis.java:46)] erro人错误 [search@fsedump03sand LuceneDemo]$
这样以来,我们的配置就非常灵活,任何依赖的jar包和配置文件,都可以放在项目以外的位置,不提供强依赖,必要时候,可以使用-cp加载。
最后需要注意的是,在linux上配置环境变量,注意export的方式:
HADOOP_HOME=/home/search/hadoop PATH=$PATH:$HOME/bin:$HADOOP_HOME/bin export PATH export LUCENE_HOME=/home/search/lucenedemo/lib/lucenelib/ PATH=$PATH:$LUCENE_HOME export PATH
发表评论
-
记一次log4j不打印日志的踩坑记
2019-09-22 01:58 1562### 起因 前几天一个跑有java应用的生产集群(200多 ... -
在Java里面如何解决进退两难的jar包冲突问题?
2019-07-23 19:10 1229如上图所示: es api组件依赖guava18.0 ... -
如何轻松理解二叉树的深度遍历策略
2019-07-03 23:33 1122我们知道普通的线性数据结构如链表,数组等,遍历方式单一 ... -
为什么单线程Redis性能也很出色
2019-01-21 18:02 2203高性能的服务器,不一 ... -
如何将编程语言里面的字符串转成数字?
2019-01-11 23:23 2089将字符串转成数字在很 ... -
为什么Java里面String类是不可变的
2019-01-06 18:36 1665在Java里面String类型是不可变对象,这一点毫无疑问,那 ... -
关于Java里面volatile关键字的重排序
2019-01-04 18:49 1063Java里面volatile关键字主 ... -
多个线程如何轮流打印ABC特定的次数?
2018-12-11 20:42 6037之前的一篇文章,我给 ... -
聊聊Java里面的引用传递
2018-11-16 21:21 988长久以来,在Java语言里面一直有一个争论,就是Java语言到 ... -
理解计数排序算法的原理和实现
2018-10-11 10:03 2089计数排序(Counting sort) ... -
理解Java7和8里面HashMap+ConcurrentHashMap的扩容策略
2018-09-06 11:31 3386### 前言 理解HashMap和Con ... -
关于Java里面多线程同步的一些知识
2018-07-18 09:45 1105# 关于Java里面多线程同步的一些知识 对于任何Java开 ... -
Java单例模式之双检锁深入思考
2018-07-08 12:25 3288# Java单例模式之双检锁 ... -
关于Java里面多线程同步的一些知识
2018-07-08 12:23 1119# 关于Java里面多线程同步的一些知识 对于任何Java开 ... -
重新认识同步与异步,阻塞和非阻塞的概念
2018-07-06 14:30 1471# 重新认识同步与异步 ... -
线程的基本知识总结
2018-06-27 16:27 1058### (一)创建线程的方式 (1)实现Runnable接口 ... -
Java里面volatile关键字修饰引用变量的陷阱
2018-06-25 11:42 1385# Java里面volatile关键字修饰引用变量的陷阱 如 ... -
关于Java里面的字符串拼接,你了解多少?
2018-06-25 11:28 1367# 关于Java里面的字符串 ... -
深入理解Java内存模型的语义
2018-06-25 11:39 735### 前言 Java内存模型( ... -
如何证明Java多线程中的成员变量数据是互不可见的
2018-06-21 10:09 1499前面的几篇文章主要介绍了Java的内存模型,进程和线程的定义, ...
相关推荐
非maven项目中的ANT打包可执行JAR包脚本,包括配置文件、第三方jar打包
在Java开发中,Ant是一个广泛使用的自动化构建工具,它能够帮助开发者编译、打包、测试以及部署应用程序。Ant是基于XML的,通过定义任务(tasks)来执行各种构建过程。在"ant发送邮件依赖jar包.rar"这个压缩文件中,...
标题中提到的"apache-ant-1.9.6的jar包"是指包含Ant核心功能的Java库,这个jar文件是运行Ant命令和脚本的基础。用户通常需要将其添加到类路径(classpath)中,以便在Eclipse这样的集成开发环境(IDE)中进行集成,...
ant.jar ant jar包,很是不错的jar。需要的时候就要找。build.xml需要用。
要开始使用Ant进行Android打包,首先需要安装Apache Ant。在给定的文件中,`apache-ant-1.9.4-bin.zip`是Ant的一个版本,你需要解压并将其添加到系统路径中,这样命令行就可以识别`ant`命令了。安装完成后,确保你的...
build是在build_with_bat的基础上实现的,主要是在compile和dex部分增加了第三jar的打包。 build_mulity_channel是多渠道打包脚本。该脚本需要ant-contrib-1.0b3.jar的支持。包中已包含,需要将其放到ant的lib...
例如,你可以使用ant.jar来编译源代码、创建类路径、打包JAR文件,甚至运行单元测试。这个库是使用Ant进行项目构建的基础,几乎所有的Ant任务都依赖于它。 2. ant-junit.jar:此文件扩展了Ant的功能,使其能够集成...
本文将深入探讨Ant及其与jar包的关系,帮助Java程序员更好地理解和使用这个强大的工具。 首先,让我们理解什么是Ant。Apache Ant是一个由Apache软件基金会开发的Java库和命令行工具,其任务是驱动构建过程。它的...
Ant打包jar,参数名变为无意义的arg0,arg1,Java代码提示参数名称无意义 ...使用ant打包的jar,变量变成如下无意义的arg0,arg1. 代码提示也同样. 而使用Eclipse的导出jar就没有问题 缺分了..很不厚道的收一分吧.
当我们有多个jar包相互依赖时,需要将它们合并成一个单一的jar,以便于部署和使用。Ant是一个流行的Java构建工具,它允许我们通过配置XML文件(build.xml)来执行自动化构建任务,包括jar文件的创建和合并。下面我们...
本资源包包含了运行ANT所必需的JAR文件,确保用户能够顺利执行ANT脚本进行项目管理。下面我们将深入探讨ANT以及其中涉及到的关键知识点。 首先,Apache Ant是一个XML驱动的构建工具,它的配置文件通常被称为build....
apache-ant-zip.jar包及用法 用过java做压缩或解压的都知道,jdk提供的zip只能按UTF-8格式处理,所有jdk提供的zip不能支持中文文件名,可以采用Apache的zip包解决中文文件名问题。
10. **元素**:将多个JAR文件合并为一个类路径条目,这样可以方便地把依赖的JAR包打包进最终的可执行JAR。 11. **使用Ant的lib目录**:通常,Ant的lib目录存放的是构建过程中需要的第三方库,这些库可以通过元素...
有了这个JAR包,开发者可以在本地环境中运行Ant命令行工具,执行构建任务。 特别提到的"docs"文件夹包含了Ant的API文档,这些文档是以网页格式呈现的。API(Application Programming Interface)是Ant的开发者接口...
这个"ant1.8全部jar包"包含了Ant 1.8版本的所有核心库文件,这些文件对于理解和使用Ant构建系统至关重要。Ant主要用作自动化Java项目的构建工具,它可以编译源代码、运行测试、打包应用以及执行其他与构建相关的任务...
本篇文章将详细介绍如何使用Ant来打包Android应用,以及涉及到的相关知识点。 首先,理解Ant的基本概念是必要的。Ant基于XML,通过构建文件(通常命名为build.xml)来定义构建任务。这些任务可以包括编译源代码、...
ant-1.8.2.jar 包。 包含了对struts上传文件时候的解析功能。ant-1.8.2.jar 包。 包含了对struts上传文件时候的解析功能。
下面是一个简单的Ant构建文件(build.xml)示例,展示了如何使用Ant打包JAR: ```xml <project name="MyProject" default="jar"> ${build.dir}/classes"/> <property name="jar.dir" value="${build.dir}/jar...
Ant的核心概念是构建文件,通常命名为`build.xml`,它定义了一系列的构建任务,如编译源代码、打包JAR文件、运行测试等。在Ant 1.6.5中,开发者可以利用这个版本提供的丰富任务来实现各种复杂的构建流程。例如,`...
Java项目中的Ant打包脚本是开发过程中的一个重要环节,它使得开发者能够自动化构建、测试和部署应用程序。Ant是一个基于XML的构建...理解并熟练掌握Ant打包脚本的编写和使用,对于Java开发人员来说是非常重要的技能。