Maven是一个基于Java语言开发的跨平台的项目构建,依赖管理和项目信息管理工具,
编写源代码时要做哪些事?
JavaWeb开发式通常都会使用到许多开源框架和类库
Spring
MyBatis
Apache Commons
……
编写完源代码之后要做的那些事情(构建的生命周期)
清理(mvn clean)
测试(mvn test),同时会生成测试报告
打包(mvn package)
安装(mvn install)
部署(mvn deploy)
POM(Project Object Model)项目对象模型:Maven是用来做项目管理的,而Maven把每一个项目当作一个对象来看待,而项目的描述信息则使用了pom.xml文件来描述。
依赖管理模型:从指定的仓库(中心仓库,私服和本地仓库)中获取项目中依赖的jar,war包构建到本地。
Build lifestyle&phases:Maven的项目构建实现都是通过插件的机制实现的,项目的整个构建生命周期,包括清除(mvn clean)-编译(mvn compile)-测试(mvn test)-打jar,war包(mvn package)-本地安装(mvn install)-远程部署(mvn deploy)/font>。
一句话理解Maven所做的事情就是:Maven可以通过pom.xml文件配置各种框架和类库的依赖,同时可以通过一条命令完成软件的构建。
前提条件:安装并配置好JDK7
从 Maven下载链接Apache官网中下载Maven安装包,将其解压在指定的目录中,然后在系统环境变量中新增MAVEN_HOME的环境变量,指向Maven的主目录(D:\JavaTool\apache-maven-3.3.9),再将%MAVEN_HOME%\bin目录追加到系统的path环境变量中,在命令行中输入mvn -version命令就可以获取到Maven的版本,安装路径等信息了。
关于Maven和IntelliJ IDEA的集成,可以参考博客IntelliJ IDEA集成Maven点我!!!
在搭建完成Maven环境之后会在MAVEN_HOME目录中存在着bin,boot,conf,lib四个文件夹,而站在使用Maven的角度上讲(有些公司的业务需要可能还会针对Maven开发自己的插件),需要了解的是:
bin:主要包含了Maven的可执行程序,当然因为maven是使用Java语言开发,可执行程序也就只是提供了一个mvn.cmd文件,在命令行输入任何命令时实际上就是在调用mvn.cmd文件的内容。
boot:只包含了名为plexus-classworlds-2.5.2.jar的jar文件,plexus-classworlds是一个类加载器框架,相对于默认的java类加载器,它提供了更丰富的语法以方便配置,maven使用该框架加载自己的类库。
config:该目录包含了Maven运行时的配置文件,其中需要关注的就是setting.xml文件,直接修改该文件后就能定义Maven运行时的行为。
该文件主要用来配置本地仓库地址以及私服仓库和远程中心仓库的地址。
lib: maven依赖的第三方类库,主要关注该目录下的maven-model-builder-3.3.3.jar中的pom.xml文件,该文件定义了Maven在进行构建项目时的默认行为。 pom.xml文件内容如下(在搭建IntelliJ IDEA的Maven项目时会详细介绍该文件的内容):
<?xml version="1.0" encoding="UTF-8"?>
<!-- START SNIPPET: superpom -->
<project>
<modelVersion>4.0.0</modelVersion>
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
<build>
<directory>${project.basedir}/target</directory>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<finalName>${project.artifactId}-${project.version}</finalName>
<testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
<sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
<scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
</testResource>
</testResources>
<pluginManagement>
<!-- NOTE: These plugins will be removed from future versions of the super POM -->
<!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) -->
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
</plugin>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.3.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
<reporting>
<outputDirectory>${project.build.directory}/site</outputDirectory>
</reporting>
<profiles>
<!-- NOTE: The release profile will be removed from future versions of the super POM -->
<profile>
<id>release-profile</id>
<activation>
<property>
<name>performRelease</name>
<value>true</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<inherited>true</inherited>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<inherited>true</inherited>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<inherited>true</inherited>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<updateReleaseInfo>true</updateReleaseInfo>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
<!-- END SNIPPET: superpom -->
1 修改仓库的路径
Maven默认的本地仓库路径${user.home}/.m2/repository,这里改成自定义的路径
<localRepository>D:\Maven\repository</localRepository>
2 配置 Maven 的 mirror 地址指向OSChina 的 Maven 镜像地址,Maven默认的中心仓库有时候在国内的网络环境是连接不上的,所以…..
<mirror>
<id>osc</id>
<mirrorOf>central</mirrorOf>
<url>http://maven.oschina.net/content/groups/public/</url>
</mirror>
<mirror>
<id>osc_thirdparty</id>
<mirrorOf>thirdparty</mirrorOf>
<url>http://maven.oschina.net/content/repositories/thirdparty/</url>
</mirror>
3 在使用Maven执行软件构建时, Maven 还需要安装一些插件包,这些插件包的下载地址也让其指向 OSChina 的 Maven 地址,增加如下内容。
<profile>
<id>jdk-1.7</id>
<activation>
<jdk>1.7</jdk>
</activation>
<repositories>
<repository>
<id>nexus</id>
<name>local private nexus</name> <url>http://maven.oschina.net/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>local private nexus</name>
<url>http://maven.oschina.net/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
新增环境变量MAVEN_OPTS=-Xms512m -Xmx2048m(我的机器是16G的内存,可以结合自身的硬件配置调整),因为Java默认的最大可用内存往往不能够满足Maven运行的需要,比如在大型Web项目使用Maven生成项目站点需要占用大量内存,如果没有该配置,则容易得到java.lang.OutOfMemoryError,因此,一开始就配置该环境变量是推荐的做法。
在使用IntelliJ IDEA15做JavaWeb开发中已经介绍过如何搭建一个Maven的JavaWeb项目,但是今天准备了一个完整的例子来说明Maven在IntelliJ IDEA的使用过程。
基于Maven的Web项目结构说明
目录 | 说明 |
---|---|
src/main/java | 用于存放Java源代码 |
src/main/resource | 用于存放生产环境的配置文件 |
src/test/java | 用于存放测试环境的代码 |
src/test/resource | 用于存放本地或者测试环境的配置文件 |
IntelliJ IDEA使用图形化界面的方式显示了Maven构建生命周期的插件,鼠标双击就可以实现软件构建的某个生命周期了。
需要注意的是使用Intellij IDEA创建基于Maven的Web Project时需要手动添加测试环境存放代码和资源的文件夹,图例说明如下:
完整的工程我稍后会上传到GitHub上