添加依赖(dependencies)
构建(编译、测试、运行)所需的依赖都在dependencies元素里添加,比如:
junit junit 4.11test
对每个依赖需要配置groupId、artifactId、version、scope。前三个好理解,每个工件都会有。
scope指的是如何使用这个依赖,其值有:compile、test、runtime等。
Maven在构建项目的时候会自动引用这些依赖,先从本地仓库(默认是在${user.home}/.m2/repository这个目录)找。
当本地仓库没有时,Maven会从远程仓库中下载到本次仓库。
默认的远程仓库地址是:https://repo.maven.apache.org/maven2/
当然,我们也可以搭建自己的远程仓库。
假设我们需要引用log4j这个依赖,那么它的groupId、artifactId、version是什么呢?
我们可以到Maven的中央仓库https://repo.maven.apache.org/maven2/log4j/log4j/这个目录下,会有一个maven-metadata.xml文件和对应每个版本的目录。
maven-metadata.xml文件的内容类似:
log4jlog4j1.2.171.2.171.1.31.2.41.2.51.2.61.2.71.2.81.2.91.2.111.2.121.2.131.2.141.2.151.2.161.2.1720140318154402
从这里我们可以得知log4j的groupId、artifactId,version则根据我们的需要来选择,比如,我们选择1.2.17这个版本:
junit junit 4.11testlog4j log4j 1.2.17compile
注意,scope设置的是compile,现在我们执行mvn compile,Maven就会自动下载这个依赖到本地仓库。
将JAR包部署到远程仓库
首先,需要在Maven的配置文件中配置我们的远程仓库的用户认证信息:
... mycompany-repositoryjvanzyl/path/to/identitymy_key_passphrase ...
然后,需要在项目的POM文件中配置远程仓库的地址:
4.0.0com.mycompany.app my-app 1.0-SNAPSHOTjar ... mycompany-repositoryMyCompany Repositoryscp://repository.mycompany.com/repository/maven2
创建项目站点/文档
使用archetype机制:
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-site -DgroupId=com.mycompany.app -DartifactId=my-app-site
构建其他类型的项目
比如web项目。
项目的生命周期对所有类型的项目都适用,所以,可以使用archetype机制来创建web项目:
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.mycompany.app -DartifactId=my-webapp
此时,生成的项目POM文件如下:
4.0.0com.mycompany.app my-webapp 1.0-SNAPSHOTwarjunit junit 4.11testmy-webapp
packaging元素的值是war,表示要打成WAR包。
我们同样是执行:
mvn package
进行打包。
如何一次构建多个项目?
首先要在多个项目的上级目录创建一个POM文件,以上面的my-app和my-webapp为例:
![3ebc67dcd3d41d163000961d1addaa3c.png](https://i-blog.csdnimg.cn/blog_migrate/6ebabeb8b68ad0cd62b6b5c6c0c88ff6.jpeg)
这个POM文件可以称为:父POM,它的内容是:
4.0.0com.mycompany.app app 1.0-SNAPSHOTpommy-appmy-webapp
父POM也有groupId、artifactId、version、packaging元素,只不过packaging元素的值是pom
还有modules元素,其值包含了my-app和my-webapp这两个工件,这表示该父POM有两个子模块
这样定义是告诉Maven在所有子模块集合上执行命令,而不是只在当前Maven项目上执行命令。但是也可以使用--non-recursive选项取消。
然后,假设my-webapp需要依赖my-app,所以需要在其POM文件中添加依赖:
... com.mycompany.app my-app 1.0-SNAPSHOT ...
这样会确保JAR包先于WAR包构建,然后打包的时候指示WAR插件将JAR包包含在WAR的库目录中。
最后,my-app和my-webapp这两个工件的POM文件都需要指定父POM:
com.mycompany.app app 1.0-SNAPSHOT
因为模块和父项目可能是分开分发(distribute)的,这样通过在仓库始终可以找到父POM。
现在,在父POM这一级目录下执行:
mvn verify
会看到对两个项目均执行了编译、打包等操作,当然,被依赖的肯定先编译和打包。
最终生成的是WAR包:my-webapp/target/my-webapp.war
然后,查看WAR包的内容:jar tvf my-webapp/target/my-webapp-1.0-SNAPSHOT.war
![23dc6a47b0c71dc96dfd6f96a0f04bea.png](https://i-blog.csdnimg.cn/blog_migrate/d62678a2eff83a175de888720f233778.jpeg)
可以看到WAR包中包含了my-app-1.0-SNAPSHOT.jar这个JAR包。
注意,我们的项目也依赖于junit,不过此依赖仅仅在测试时有效,所以打包不会包含junit的JAR包。