转自:http://www.wujianrong.com/archives/2006/12/maven_3.html
最近由于工作原因在研究、应用Maven,有了一些体会就写成了此文。本文虽然是Maven2的入门文章,但并不涉及 Maven的历史、下载与安装,这些内容可以到Maven的官方网站上了解。本文主要是关注Maven中的重要概念,并以一个实例来阐述使用Maven的 基本方法。文末有例子代码下载的链接。
1 关键名词
Project:任何您想build的事物,Maven都可以认为它们是工程。这些工程被定义为工程对象模型(POM,Poject Object Model)。一个工程可以依赖其它的工程;一个工程也可以由多个子工程构成。
POM:POM(pom.xml)是Maven的核心文件,它是指示Maven如何工作的元数据文件,类似于Ant中的build.xml文件。POM文件位于每个工程的根目录中。
GroupId:groupId是一个工程的在全局中唯一的标识符,一般地,它就是工程名。groupId有利于使用一个完全的包名,将一个工程从其它有类似名称的工程里区别出来。
Artifact:artifact 是工程将要产生或需要使用的文件,它可以是jar文件,源文件,二进制文件,war文件,甚至是pom文件。每个artifact都由groupId和 artifactId组合的标识符唯一识别。需要被使用(依赖)的artifact都要放在仓库(见Repository)中,否则Maven无法找到 (识别)它们。
Dependency:为了能够build或运行,一个典型的Java工程会依赖其它的包。在Maven中,这些被依赖的包就被称为dependency。dependency一般是其它工程的artifact。
Plug-in:Maven是由插件组织的,它的每一个功能都是由插件提供的。插件提供goal(类似于Ant中的target),并根据在POM中找到的元数据去完成工作。主要的Maven插件要是由Java写成的,但它也支持用Beanshell或Ant脚本写成的插件。
Repository:仓库用于存放artifact,它可以是本地仓库,也可以是远程仓库。Maven有一个默认的远程仓库--central,可以从http://www.ibiblio.org/maven/下载其中的artifact。在Windows平台上,本地仓库的默认地址是User_Home\.m2\repository。
Snapshot:工程中可以(也应该)有一个特殊版本,它的版本号包括SNAPSHOT字样。该版本可以告诉Maven,该工程正处于开发阶段,会经常更新(但还未发布)。当其它工程使用此类型版本的artifact时,Maven会在仓库中寻找该artifact的最新版本,并自动下载、使用该最新版。
2 Maven Build Life Cycle
软件项目一般都有相似的开发过程:准备,编译,测试,打包和部署,Maven将上述过程称为Build Life Cycle。在Maven中,这些生命周期由一系列的短语组成,每个短语对应着一个(或多个)操作;或对应着一个(或多个)goal(类似于Ant中的 target)。
如编译源文件的命令mvn compile中的compile是一个生命周期短语。同时该命令也可以等价于mvn compiler:compile,其中的compiler是一个插件,它提供了compile(此compile与mvn compile中的compile意义不同)goal;compiler还可提供另一个goal--testCompile,该goal用于编译junit测试类。
在执行某一个生命周期时,Maven会首先执行该生命周期之前的其它周期。如要执行compile,那么将首先执行validate,generate- source,process-source和generate-resources,最后再执行compile本身。关于Maven中默认的生命周期短语,请见参考资源[6]中的附录B.3。
3 标准目录布局
Maven为工程中的源文件,资源文件,配置文件,生成的输出和文档都制定了一个标准的目录结构。Maven鼓励使用标准目录布局,这样就不需要进行额外 的配置,而且有助于各个不同工程之间的联接。当然,Maven也允许定制个性的目录布局,这就需要进行更多的配置。关于Maven的标准目录布局,请见参考资源[6]中的附录B.1。
4 Maven的优点
[1]build逻辑可以被重用。在Ant中可能需要多次重复地写相同的语句,但由于POM的继承性,可以复用其它的POM文件中的语句。这样既可以写出清晰的build语句,又可以构造出层次关系良好的build工程。
[2]不必关注build工作的实现细节。我们只需要使用一些build生命周期短语就可以达到我们的目标,而不必管Maven是如何做到这些的。如,只需要告诉Maven要安装(install),那么它自然就会验证,编译,打包,及安装。
[3]Maven会递归加载工程依赖的artifact所依赖的其它artifact,而不用显示的将这些artifact全部写到dependency中。
[4]如果完全使用Maven的标准目录布局,那么可以极大地减少配置细节。
5 实例
5.1 构想
由于只是阐述Maven的基本使用方法,所以本文将要设计的实例,只是一个简单的Maven demo。该实例包含两个工程:普通应用程序工程(app)和Web应用工程(webapp)。app工程提供一个简单的Java类;webapp工程只 包含一个Servlet,并将使用app中的Java类。
该Demo的目标是能够正确地将webapp制成war包,以供部署时使用。要能够正确制作war,自然首先就必须要能够正确的编译源代码,且要将App模块制成jar包。本文创建的工程所在的目录是D:\maven\demo。
5.2 App工程
可以使用Maven的archetype插件来创建新工程,命令如下:
D:\maven\demo>mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=app
该工程的groupId是ce.demo.mvn,那么该工程的源文件将放在Java包ce.demo.mvn中。artifactId是app,那么该工程根目录的名称将为app。
当第一次执行该命令时,Maven会从central仓库中下载一些文件。这些文件包含插件archetype,以及它所依赖的其它包。该命令执行完毕后,在目录D:\maven\demo下会出现如下目录布局:
app
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- ce
| `-- demo
| `-- mvn
| `-- App.java
`-- test
`-- java
`-- ce
`-- demo
`-- mvn
`-- AppTest.java
因本文暂时不涉及JUnit测试,故请将目录app\src\test目录删除。然后再修改App.java文件,其完全内容如下:
package ce.demo.mvn;
public class App {
public String getStr(String str) {
return str;
}
}
其实,如果我们能够清楚地知道Maven的标准目录布局,就可以不使用archetype插件来创建工程原型;如果我们要定制个性的目录布局,那么就更没有必要使用archetype插件了。
5.3 WebApp工程
我们仍然如创建app工程一样使用archetype插件来创建webapp工程,命令如下:
D:\maven\demo>mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=webapp -DarchetypeArtifactId=maven-archetype-webapp
第一次运行此命令时,也会从central仓库中下载一些与Web应用相关的artifact(如javax.servlet)。此命令与创建app的命 令的不同之处是,多设置了一个属性archetypeArtifacttId,该属性的值为maven-archetype-webapp。即告诉 Maven,将要创建的工程是一个Web应用工程。创建app工程时没有使用该属性值,是由于archetype默认创建的是应用程序工程。同样的,执行 完该命令之后,会出现如下标准目录布局:
webapp
|-- pom.xml
`-- src
`-- main
`-- webapp
|-- index.jsp
|-- WEB-INF
`-- web.xml
根据5.1节的构想,webapp工程将只包含一个Servlet,所以我们不需要index.jsp文件,请将其删除。此时大家可以发现,目前的目录布 局中并没有放Servlet,即Java源文件的地方。根据参考资源[6]中的附录B.1,以及app工程中Java源文件的布局,可以知道 Servlet(它仍然是一个Java类文件)仍然是放在webapp\src\main\java目录中,请新建该目录。此处的Servlet是一个简单HelloServlet,其完整代码如下:
package hello;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import ce.demo.mvn.App; // 引用app工程中的App类
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = -3696470690560528247L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
App app = new App();
String str = app.getStr("CE Maven Demo");
PrintWriter out = response.getWriter();
out.print("");
out.print("
" + str);
out.print("
分享到:
相关推荐
综合上述信息,我们可以了解到两个关键的开源项目:一是用于Java开发的Paranamer Maven插件,帮助开发者获取方法参数名称;二是Scala Inflector,一个在Scala中实现的文本操作库,提供丰富的字符串处理功能。这两个...
Apache Solr Maven插件的使用通常涉及到以下几个关键知识点: 1. **Apache Solr**: Solr提供了索引和搜索大量文本数据的能力,支持丰富的查询语法和结果排序。它还允许自定义处理数据,如分词、同义词处理等,以...
以下是对这些关键领域的一些详细解释: 1. **Java基础**:Java是一种多平台的、面向对象的编程语言,由Sun Microsystems(现为Oracle公司)开发。它的“Write Once, Run Anywhere”(WORA)理念使得开发者可以在...
1. **字典分词**:ikanalyzer使用词典进行分词,词典中包含了大量常用词汇和专有名词,能够快速准确地识别出词语。 2. **动态词典**:ikanalyzer支持动态加载和更新词典,可以在运行时增加或修改词典内容,适应不同...
IK Analyzer是一个广泛使用的开源中文分词器,尤其在搜索引擎领域,如Apache Solr和Elasticsearch中,它扮演着关键的角色。本项目"ik-analyzer-solr5-master.zip"是IK Analyzer针对Solr5的特别修正版,确保与该版本...
### Jenkins使用指引文档知识点 #### 1. Jenkins简介 **1.1.... Jenkins是一款开源持续集成工具,旨在提供一种自动化的方式来...以上就是从给定的文件信息中提取的关键知识点,希望能帮助您更好地理解和使用Jenkins。
OpenNLP包含预训练的模型,可以快速有效地进行词性标注,这对于理解句子结构和含义非常关键。 **4. 名称抽取(Name Entity Recognition, NER)** 名称抽取是识别文本中具有特定意义的实体,如人名、地名、组织名等...
IK Analyzer是一个基于Maven构建的项目,它旨在提供高效、灵活的中文分词解决方案。 IK Analyzer的核心功能是对中文句子进行分词处理,即将连续的汉字序列切分成具有实际意义的词汇单元,这是中文自然语言处理的...
词典通常包含了大量的常用词汇、专有名词和短语,是分词器性能的关键。在源码中,开发者可以找到词典的格式和更新方法。 3. **配置文件**:这些文件允许用户自定义分词器的行为,例如设置停用词表、选择分词模式...
在处理中文文本时,一个关键的组件就是中文分词器,而IK(Intelligent Chinese)分词器是Solr中常用的中文分词工具之一。本文将深入探讨"solr5的ik中文分词器源码"的相关知识点。 1. **IK分词器概述**: IK分词器...
对于Maven或Gradle项目,可以在pom.xml或build.gradle文件中添加相应的依赖。 4. **使用API**:在代码中,通过创建Analyzer实例,如`IKAnalyzer analyzer = new IKAnalyzer(new FileInputStream("path_to_dict"));`...
同时,词性标注是中文分词的另一个重要环节,它标识出每个词语在句子中的语法角色,如名词、动词、形容词等,对于后续的句法分析和语义理解起到关键作用。 在实际应用中,Yard可以用于新闻分析、社交媒体监测、搜索...
【IMFRestDemo项目概述】 IMFRestDemo是一个基于Java技术栈开发的RESTful API示例,...开发者可以通过分析和运行此项目,深入了解如何构建基于Java的Web服务,并学习如何使用这些关键技术来处理数据持久化和接口设计。
- **词典管理**:IKAnalyzer内置了丰富的中文词汇库,包括常用词、专有名词、网络词汇等。词典的加载和更新是分词过程中的关键部分。 - **分词器**:实现分词算法,根据输入的文本流进行分词操作,返回分词结果。 ...
类和接口的命名应采用名词,方法名使用动词。 2. **异常日志**:在异常处理中,规范强调了正确捕获和处理异常的重要性,以及如何记录详尽的错误日志。这包括使用try-catch-finally结构,避免使用空catch块,以及在...
在自然语言处理(NLP)领域,分词是基础且关键的一环,因为正确的分词直接影响后续的文本分析、信息检索、情感分析等任务的效果。 IK分词器的主要特点包括: 1. 高性能:IK分词器采用高效的算法和数据结构,能够...
4. **使用指南**:这份文档会指导开发者如何搭建开发环境、运行项目、进行单元测试等,通常包括依赖管理(如Maven或Gradle)、数据库配置、服务器部署等步骤。 5. **服务层(service)**:在Java开发中,服务层是业务...
例如,类名通常用名词或名词短语,方法名用动词或动宾短语。 2. **注释规范**:注释应当简洁明了,描述代码功能和用途,避免过于琐碎。Javadoc的使用能提高代码文档化程度,方便API的使用和理解。 3. **异常处理**...