4. 项目源码在linux控制台下的编译与运行
第3节中所述的操作其实已经可以满足大部分程序员的要求了。但是还有一小部分程序员,他们要把项目打好jar包部署到linux的服务器上。
部署的过程中有可能要在linux服务器上当场改代码。这时候有两种解决方式:
1.返回开发环境,用可视化的编辑软件修改代码后重新编译,在完成打包部署过程。
2.直接在linux服务器上用vi修改代码,改完后在linux上编译,打包,再部署。
两种方式各有好处,如果对linux相当熟悉的话,可以考虑使用第2种方式。快捷且高效。
这就是本节要阐述的内容:如何让项目源码在linux控制台下编译与运行
准备工作仍然是拿到源码stanford-source.jar(源文件为:
stanford-corenlp-2011-06-19-sources.jar,我改了名字)。
1. 解压源码到src目录
hdp@master:~/tmp/nlp$ mkdir src
hdp@master:~/tmp/nlp$ cd src
hdp@master:~/tmp/nlp/src$ jar xf ../stanford-source.jar
hdp@master:~/tmp/nlp/src$ ls
edu META-INF
2. 准备Makefile文件,文件内容是总体编译edu下的源码,然后使用META-INF下的MANIFEST.MF文件将编译好的class
hdp@master:~/tmp/nlp/src$ cd ..
hdp@master:~/tmp/nlp$ ls
src stanford-source.jar
hdp@master:~/tmp/nlp$ touch Makefile
hdp@master:~/tmp/nlp$ vi Makefile
JAVAC = javac
JAVAFLAGS = -O -d .
corenlp:
$(JAVAC) $(JAVAFLAGS) -classpath lib/jgraph.jar:lib/jgrapht.jar:lib/xom.jar:lib/fastutil.jar src/edu/stanford/nlp/*/*.java \
src/edu/stanford/nlp/*/*/*.java \
src/edu/stanford/nlp/*/*/*/*.java \
src/edu/stanford/nlp/*/*/*/*/*.java \
src/edu/stanford/nlp/*/*/*/*/*/*.java
jar -cfm stanford-corenlp-`date +%Y-%m-%d`.jar src/META-INF/MANIFEST.MF edu
cp stanford-corenlp-`date +%Y-%m-%d`.jar stanford-corenlp.jar
rm -rf edu
~
以上的命令可以完成MakeFile的创建工作,vi之后是Makefile的内容。
3. 准备编译时需要的jar包。lib/jgraph.jar:lib/jgrapht.jar:lib/xom.jar:lib/fastutil.jar
hdp@master:~/tmp/nlp$ ls
Makefile src stanford-source.jar
hdp@master:~/tmp/nlp$ mkdir lib
hdp@master:~/tmp/nlp$ cp /home/hdp/nlp/lib/*.jar lib/
4. 编译,打包
hdp@master:~/tmp/nlp$ make
javac -O -d . -classpath lib/jgraph.jar:lib/jgrapht.jar:lib/xom.jar:lib/fastutil.jar src/edu/stanford/nlp/*/*.java \
src/edu/stanford/nlp/*/*/*.java \
src/edu/stanford/nlp/*/*/*/*.java \
src/edu/stanford/nlp/*/*/*/*/*.java \
src/edu/stanford/nlp/*/*/*/*/*/*.java
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
jar -cfm stanford-corenlp-`date +%Y-%m-%d`.jar src/META-INF/MANIFEST.MF edu
cp stanford-corenlp-`date +%Y-%m-%d`.jar stanford-corenlp.jar
rm -rf edu
此过程中,nlp目录下将创建edu,然后编译,编译得到的文件全部放于edu中。然后使用edu中类文件与src/META-INF/MANIFEST.MF文件一起打成stanford-corenlp-`date +%Y-%m-%d`.jar包。最后将这个临时jar包改名成stanford-corenlp.jar
5. 准备输入数据。向input.txt写入数据。
hdp@master:~/tmp/nlp$ vi input.txt
Stanford University is located in California. It is a great university.
We use the stanford CoreNLP for tech research.
It is useful!
6. Java命令执行jar包中的StanfordCoreNLP示例。
hdp@master:~/tmp/nlp$ java -cp stanford-corenlp.jar:lib/xom.jar:lib/jgrapht.jar:lib/jgraph.jar:lib/stanford-corenlp-models-2011-06-19.jar -Xmx800m edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize,ssplit,pos,lemma,ner,parse,dcoref -file input.txt
Adding annotator tokenize
Adding annotator ssplit
Adding annotator pos
Loading POS Model [edu/stanford/nlp/models/pos-tagger/wsj3t0-18-left3words/left3words-distsim-wsj-0-18.tagger] ... Loading default properties from trained tagger edu/stanford/nlp/models/pos-tagger/wsj3t0-18-left3words/left3words-distsim-wsj-0-18.tagger
Reading POS tagger model from edu/stanford/nlp/models/pos-tagger/wsj3t0-18-left3words/left3words-distsim-wsj-0-18.tagger ... done [5.2 sec].
done [5.5 sec].
Adding annotator lemma
Adding annotator ner
Loading classifier from edu/stanford/nlp/models/ner/all.3class.distsim.crf.ser.gz ... done [21.3 sec].
Loading classifier from edu/stanford/nlp/models/ner/muc.distsim.crf.ser.gz ... done [19.4 sec].
Loading classifier from edu/stanford/nlp/models/ner/conll.distsim.crf.ser.gz ... done [18.2 sec].
Adding annotator parse
Loading parser from serialized file edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz ... done [4.8 sec].
Adding annotator dcoref
Processing file /home/hdp/tmp/nlp/input.txt ... (writing to /home/hdp/tmp/nlp/input.txt.xml)
Annotation pipeline timing information:
PTBTokenizerAnnotator: 0.2 sec.
WordsToSentencesAnnotator: 0.0 sec.
POSTaggerAnnotator: 0.5 sec.
MorphaAnnotator: 0.2 sec.
NERCombinerAnnotator: 0.2 sec.
ParserAnnotator: 18.9 sec.
DeterministicCorefAnnotator: 0.7 sec.
TOTAL: 20.8 sec. for 26 tokens at 1.2 tokens/sec.
Pipeline setup: 71.8 sec.
Total time for StanfordCoreNLP pipeline: 93.5 sec.
hdp@master:~/tmp/nlp$
由上命令中的参数,我设置的是800m虚拟内存。运行时间只要93.5s。可是昨天设置的512m内存,程序运行如下:
hdp@master:~/nlp$ java -cp stanford-corenlp.jar:lib/xom.jar:lib/jgrapht.jar:lib/jgraph.jar:lib/stanford-corenlp-models-2011-06-19.jar -Xmx512m edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize,ssplit,pos,lemma,ner,parse,dcoref -file input.txt
…….省略调试信息……
Annotation pipeline timing information:
PTBTokenizerAnnotator: 7.8 sec.
WordsToSentencesAnnotator: 0.3 sec.
POSTaggerAnnotator: 9.3 sec.
MorphaAnnotator: 4.3 sec.
NERCombinerAnnotator: 25.1 sec.
ParserAnnotator: 1888.0 sec.
DeterministicCorefAnnotator: 7.5 sec.
TOTAL: 1942.3 sec. for 13 tokens at 0.0 tokens/sec.
Pipeline setup: 3663.5 sec.
Total time for StanfordCoreNLP pipeline: 5616.9 sec.
hdp@master:~/nlp$
最后竟然用了5600s。这相当于1.55个小时。令人吃惊。
5. 总结
到这里,完成了开源框架的3种使用方式的介绍:
1. 方式:Eclipse下使用jar包引入方式。
优缺点:这种方式只能使用,不能对框架做底层改变。
使用条件:适合于大多数程序员开发阶段。
2. 方式:Eclipse下直接编译项目源码的方式。
优缺点:这种方式能够修改框架的实现,可视化编辑;不适合linux的控制台界面。
使用条件:少数需要修改开源框架的时候。
3. 方式:linxu控制台下直接编译项目源码的方式。
优缺点:能够修改框架,但不可视化,麻烦;适合部署过程中代码量的小规模修改。
使用条件:项目部署时代码量的小规模修改。