Maven
什么是maven
它是一个项目管理工具,使用maven对java项目进行构建、依赖管理。
Pom.xml需要配置
什么是项目构建
一个项目从编写源代码到编译、测试、运行、打包、部署、运行的过程
Maven项目构建过程
maven将项目构建的过程进行标准化,每个阶段使用一个命令完成,下图展示了构建过程的一些阶段,后面章节详细介绍每个阶段,这里先大概了解下:
上图中部分阶段对应命令如下:
清理阶段对应maven的命令是clean,清理输出的class文件
编译阶段对应maven的命令是compile,将java代码编译成class文件。
打包阶段对应maven的命令是package,java工程可以打成jar包,web工程可以打成war包
运行一个maven工程(web工程)需要一个命令:tomat:run
Maven工程构建的优点
1、一个命令完成构建、运行,方便快捷。
2、maven对每个构建阶段进行规范,非常有利于大型团队协作开发。
一步构建,依赖管理,maven跨平台(基于java开发),提高开发效率
Maven项目工程目录约定
使用maven创建的工程我们称它为maven工程,maven工程具有一定的目录规范,如下:
Java项目显示下:
Project
|-src
| |-main
| | |-java ——存放项目的.java文件
| | |-resources ——存放项目资源文件,如spring, hibernate配置文件
|-webapp —— webapp目录是web工程的主目录
|-WEB-INF
|-web.xml
| |-test
| |-java ——存放所有测试.java文件,如JUnit测试类
| |-resources ——测试资源文件
|-target ——目标文件输出位置例如.class、.jar、.war文件
|-pom.xml ——maven项目核心配置文件
将本地jar包安装到仓库:
将jar包直接放到仓库文件夹下是不能使用的
在命令行中执行命令:
依赖范围
- compile:编译范围,指A在编译时依赖B,此范围为默认依赖范围。编译范围的依赖会用在编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包。
- provided:provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用, provided依赖在编译和测试时需要,在运行时不需要,比如:servlet-api , jsp-api被tomcat容器提供。
- runtime:runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如:jdbc的驱动包。由于运行时需要所以runtime范围的依赖会被打包。
- test:test范围依赖在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用,比如:junit。由于运行时不需要所以test范围依赖不会被打包。
system:system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径,需要指定systemPath磁盘路径,system依赖不推荐使
在maven-web工程中测试各各scop。
索引:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
Pom配置
Pom.xml 需要配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- tomcat组件可以不配 -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.1</version>
<configuration>
<!-- 可以灵活配置工程路径 -->
<path>/crm</path>
<!-- 可以灵活配置端口号 -->
<port>8080</port>
</configuration>
</plugin>
</plugins>
</build>
maven命令
maven命令
将项目发布到私服:在要发送的工程中执行:mvn deploy -DrepositoryId=releases
方法二:在eclipse中运行:clean install deploy
maven无法下载jar问题解决时可以在pom.xml 中添加:
<repositories>
<repository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
maven 引入本地包:
Maven引入本地依赖Jar到可执行Jar包中
在Maven中,默认地,是不会将依赖的Jar包打入可执行Jar包的,如果需要将依赖打入可执行Jar包,需要在pom
中添加maven-assembly-plugin
插件,这个很容易实现,但是在正规开发中不推荐这样使用,为什么?因为稍微大型一些的项目都至少有几十个依赖项,而每次打包都将这些Jar包打入可执行Jar,使得最后生成的可执行Jar体积非常大。标准的做法是,将所有的依赖Jar包都打入lib目录中,而在可执行Jar的MANIFEST.MF
中指定lib路径即可。这也很容易实现,并不是本文的重点,本文的重点是如何将不在Maven中央仓库中的Jar包,或者说依赖本地的Jar包打入可执行Jar,并更新MANIFEST.MF
文件。
例如在我的Maven项目中,需要依赖本地Jar,首先将依赖的Jar复制到src/main/resources/lib
目录下,引用如下
<dependency>
<groupId>com.yuewen</groupId>
<artifactId>lucene</artifactId>
<version>1.0.0-SNAPSHORT</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/lucene-1.0.0-SNAPSHORT.jar</systemPath>
</dependency>
Maven 实现多环境打包
在pom.xml中添加profile配置:
<!-- 环境 -->
<profiles>
<!-- 开发 -->
<profile>
<id>dev</id>
<activation>
<!--默认激活配置-->
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!--当前环境-->
<profile.name>dev</profile.name>
<!--这个属性是自定义的-->
<profile.baseUrl>http://192.168.1.58:6652</profile.baseUrl>
</properties>
</profile>
<!-- 测试 -->
<profile>
<id>test</id>
<properties>
<!--当前环境-->
<profile.name>test</profile.name>
<profile.baseUrl>http://cloud.xxxx.com/rainbow</profile.baseUrl>
</properties>
</profile>
<!-- 生产 -->
<profile>
<id>prd</id>
<properties>
<!--当前环境,生产环境为空-->
<profile.name>prd</profile.name>
<profile.baseUrl>http://api.xxx.cn/rainbow</profile.baseUrl>
</properties>
</profile>
</profiles>