HELLO!大家好!这是咕噜的第一篇博客,还请前辈们多包涵!!咕噜大大,专注编程和单身30年!
尊重原创,请大家转载时注明该文章来自:
正如大家所知的,maven是Apache底下的一个项目构建和管理工具,主要的功能有项目中依赖的jar包管理,项目的构建(build),清理,编译,打包部署,运行测试用例,生成报告和文档,软件配置管理,发布管理等等(要活用“等等”这个词,当你不知道这玩意还有什么功能时,写上“等等”,就会显得很专业的赶脚
)。在构建JavaEE项目时,很多人的第一反应就是要上SSH框架,因为上框架能实现项目的工业化开发,提高代码的复用性和可维护性,解耦合,方便模块化层次化开发,好处自然不言而喻。但问题就在于要使用这些框架,就得往项目中下载不同的依赖包,哪怕是只使用最基本的3个框架功能:数据库持久化+依赖注入+前端控制,也需要下载20多个jar包,不光名字难以记全,还可能因为版本不一致的问题导致jar冲突,这对开发人员来说简直是一个噩梦!所以,这时候就要请ApacheMaven出马了,maven提倡一个理念:约定大于配置(Convention Over Configuration),只要你遵守maven的项目配置约定(比如说:创建的项目目录结构得是:/src/main/java),就只用在pom.xml中填写少量的配置,maven便能帮你把项目自动管理起来,下载依赖包,清理构建部署等等,十分方便!
下载安装maven
maven是一个Java工具,所以使用maven之前必须要在系统中安装JDK。
maven的官方下载传送门:http://maven.apache.org/download.cgi
将下载下来的bin tar.gz文件解压缩并放在你想要的目录下,目前最新的maven版本是3.2.5.
接下来在你的mac操作系统中打开命令行终端,并在里面添加一个maven2文件bin目录地址的变量:
export M2=/your/path/apache-maven-3.2.5/bin
然后将刚刚的地址变量加入到系统中的path环境变量里, 并输出在bash_profile文件里
echo "export PATH=$M2:$PATH" >> ~/.bash_profile
bash_profile
没报错的话,最后运行
>>mvn --version
如果出现下面的内容,恭喜你已经成功安装maven2在你的mac系统上了。
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-15T01:29:23+08:00)
Maven home: /Users/apple/Documents/apache-maven-3.2.5
Java version: 1.6.0_65, vendor: Apple Inc.
Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Default locale: zh_CN, platform encoding: EUC_CN
OS name: "mac os x", version: "10.9.5", arch: "x86_64", family: "mac"
创建maven项目
在maven中使用archetype机制去构建一个项目,archetype是一个通用的maven项目的模板管理工具,用户也可以通过archetype为自己的EJB,SPRING项目建立模板。
打开你的命令行并使用archetype命令去创建一个符合maven约定的项目。
>>mvn -B archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.guludada.maven -DartifactId=my-maven
第一次创建可能时间会比较久,因为会下载许多依赖包。 DarchetypeGroupId是该模板所属的机构(group);DgroupId是你自己的项目所属的机构,使用倒叙域名的写法;DartifactId是你项目的名称; (其中“archetype:create”已不推荐使用)
在当前目录下,archetype就会创建如下目录结构的maven项目:
--my-maven
--pom.xml
--src
|--main
--jave
--com
--guludada
--maven
--App.java
|--test
--java
--com
--guludada
--maven
--AppTest.java
一个标准的maven项目目录结构中,包含一个pom.xml文件,以及项目业务源码的存放目录${DartifactId}/main/java和测试源码的存放目录${DartifactId}/test/java
同时,你还可以使用 “-DarchetypeArtifactId=${template_name}”指定模板去创建maven项目,默认情况下,如果不明确指明用哪个模板去创建项目,系统会使用“-DarchetypeArtifactId=maven-archetype-quickstart”模板去创建项目,如上所示;如果你想创建一个webapp项目,你可以在使用archetype命令时明确指出:“-DarchetypeArtifactId=maven-archetype-webapp”,或者你也可以自定义自己的archetype模板。
maven的核心:pom.xml
在maven工程下,你会看见pom(Project Object Model)文件,它是maven项目的核心也是最本的maven元素。pom文件记录着关于项目的信息以及被maven用来构建项目的配置。一个基本的pom文件如下所示:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.guludada.maven</groupId>
<artifactId>my-maven</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>my-maven</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
“<project>”是pom.xml的顶级元素。
“<modelVersion>”是指当前pom的版本,一般就默认配置就好了
"<groupId>"是指这个项目创建者的ID,一般就是公司域名的倒叙,如:com.guludada
"<artifactId>"是指这个项目产生的可运行软件的名称,并遵循<artifactId>-<version>.<extension>的格式,如上maven产生的jar包名就是:my-maven-1.0.jar
"<packaging>"是指项目打包的格式,如:jar,war,ear等,默认情况下是jar
"<version>" 指的是该项目的版本,maven有自己的一套项目版本管理机制,如上所示-snapshot的指示符标明该项目处于开发阶段
"<name>"指的是该项目的名称,通常被用在maven生成的文档中
"<url>"指的是该项目部署的域名,通常被用在maven生成的文档中
一个最轻量最基本的pom文件必须包含:“<project>”,“<modelVersion>”,"<groupId>","<artifactId>","<version>"这5个元素。
同时,所有项目的pom文件都会继承一个父类pom文件:super pom,如下所示:
<project>
<modelVersion>4.0.0</modelVersion>
<name>Maven Default Project</name>
<repositories>
<repository>
<id>central</id>
<name>Maven Repository Switchboard</name>
<layout>default</layout>
<url>http://repo1.maven.org/maven2</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Maven Plugin Repository</name>
<url>http://repo1.maven.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
<build>
<directory>target</directory>
<outputDirectory>target/classes</outputDirectory>
<finalName>${artifactId}-${version}</finalName>
<testOutputDirectory>target/test-classes</testOutputDirectory>
<sourceDirectory>src/main/java</sourceDirectory>
<scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
</testResource>
</testResources>
</build>
<reporting>
<outputDirectory>target/site</outputDirectory>
</reporting>
……………………………………
</project>
上面的super pom只列了一部分内容,主要是要让大家看“<build>”元素中的内容
<sourceDirectory>src/main/java</sourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
这里就约定了maven的目录结构是:src/main/java的结构,所以没有什么类似不改会死的需求的话,就不要去改这个maven约定的项目目录结构了,毕竟是很多开发人员总结出来的项目目录结构。
Maven2的包管理
最为大家熟悉的就是Maven的包管理机制了,只要配置好pom.xml文件,maven就会自动帮你下载管理项目所需要用的依赖包。构建项目时,maven会先去~/.m2/repository下寻 找项目中需要用到的依赖包,如果没有的话,maven就会去远程库(http://repo.maven.apache.org/maven2/)中下载依赖包到本地中来。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.guludada.upload</groupId>
<artifactId>my-UploadWeb</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>my-UploadWeb Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>my-UploadWeb</finalName>
</build>
</project>
如上所示,只要在pom.xml根据项目需要,使用“<dependencies>”标签添加要依赖的jar包库信息,maven就会帮你自动将jar包管理起来。
“grouid”,“artifactid”和“version”和之前提到的含义是相同的,这里多了一个“<scope>”标签,这个scope标签是指明项目在什么时候使用这些依赖包,默认下是“compile”,这里是指定为“test”,意思就是只有当项目的测试模块编译和运行时才使用这个junit依赖包。
无图无真相,无例无内涵
这里通过一个简单的例子来演示如何用maven构建你的项目。
首先打开命令行,用archetype来构建maven项目,并且指定“-DarchetypeArtifactId=maven-archetype-webapp”,这样创建的maven项目目录下面就会有一个webapp的目录
>>mvn -B archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.guludada.upload -DartifactId=my-UploadWeb
然后使用Eclipse的"File"-->"Import"功能将刚刚创建好的maven项目导进来,选择“Existing Maven Projects”
可以看见导入刚刚创建好的maven项目后的目录结构如下图所示:
我们会发现刚创建的maven项目报错了,没关系,我们现在来解决。从项目错误来看,提示的是找不到“javax.servlet.http.HttpServlet”找不到。首先右键点击项目,并选择“Properties” --> "Project Facets", 你会看见Eclipse自动为你勾选了 “Dynamic Web Module” 模板,所以项目中必须要有servlet-api的jar包,而servlet一般由容器生成,所以我们这时候要去检查TOMCAT的jar包有没有导入到项目中来。
接下来,选择“Java Build Path”,我们会看见里面的“Libraries”选项卡中只有“JRE System Libraries”和“maven dependencies”两个jar包库,这是远远不够的;需要点击右边的“Add Library”按钮,选择添加“Server Runtime”(Tomcat的lib库),“Web App Libraries”和“EAR Libraries”(企业级应用EJB的依赖库)3个jar包库;
添加完依赖包后,你会发现Eclipse自动帮你构建了“src/main/java”文件目录。右键点击项目,选择“Properties”-->"Deployment Assembly",如果里面没有“Maven Dependencies”,则需要点击右边的“add…”-->"Java Build Path Entries"-->"Maven Dependencies"添加进去。
这时候一个完整的maven web项目就构建完成了,之前的错误也消失了,可以开始实现上传文件的程序了。(如果仍然报错,可以右键点击项目选择“Validate”,就会好了)
最后一步就是要在pom文件中中配置该项目要使用到的依赖包(通过“<dependency>”标签),并点击保存(或打开命令行输入mvn compile),那么maven就会从远程依赖库中下载该项目要用到的依赖包到本地依赖库中。
这样一个完整的maven项目就算构建完成了。接下来开始写业务代码吧。
很多朋友会问到,这里maven的目录结构为src/main/java/com/guludada/UploadWeb或"src/main/webapp",我们在配置web.xml文件或者在servlet中写要调用的jsp或servlet的地址,是不是要写全maven的目录结构?答案是否定的!!右键点击项目,选择“Properties”-->"Deployment Assembly",你会发现“src/main/java”目录下的文件都直接构建在WEB-INF/classes目录下,所以在web.xml配置文件下,就像平常那样在“<servlet-class>”标签里直接写上“com.guludada.uploadApp.app”,而不用再写上”src/main/java“目录了。同理,“src/main/webapp”下的文件全部构建在“/”目录下,所以在servlet中调用jsp时,直接写上“request.getRequestDispatcher("index.jsp").forward(request, response)”就可以了,而不用再带上“request.getRequestDispatcher("src/main/webapp/index.jsp").forward(request, response)”前缀地址。
小技巧
${user.home}/.m2/settings.xml中自定义你某个项目里远程仓库的镜像,而不用改变原有项目的pom文件。其中<mirrorOf>和pom文件中<repository>标签下的<id>一致。这样你就可以用下面配置的新仓库地址去更换原有项目中pom文件里配置的仓库地址了。
<settings>
...
<mirrors>
<mirror>
<id>CHN</id>
<name>CHN Central</name>
<url>http://your/repository/addr/maven2</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
...
</settings>
目前maven2的远程仓库的官方地址是: 位于米国的http: //repo.maven.apache.org/maven2, 和腐国的
http://uk.maven.org/maven2. 不过没啥事就不要去改这个默认配置了,反正我用着挺溜的。
好了,最后希望这篇文章对大家能有帮助!