前言
之前工作中和学习中一直在使用maven,并且所掌握完全能够满足工作要求,不过从来没有完整的学习过maven,今天是个开头,希望利用业余时间完整的学习maven
Maven安装相关
maven的windows安装很简单,https://maven.apache.org/download.cgi下载对应的包,解压后,添加环境变量,重启PC即可;
安装后maven的目录如下:
bin:下面放置了maven运行的脚本,执行mvn命令时,实际上就是调用了这些脚本;脚本中最后指定了调用java命令
boot:下面只有一个jar包plexus-classworlds-2.5.2.jar,该jar包包含了功能丰富的类加载器
conf:下面放置maven配置文件,最重要的就是settings文件;PS:PC机用户名下有个.m2目录,下面也有settings文件,这两个文件的区别是:
安装目录下的settings文件是全局的,而.m2下的是基于用户的,适用多用户场景
lib:放置maven运行时依赖的java类库
maven坐标
maven坐标是为了区分中心仓或者私服中不同构件引入的,由如下几个部分构成:
groupId:构件组ID,一般为公司或者组织名,例如com.alibaba
artifactId: 表示maven项目名称,推荐使用maven项目名称
version:版本号
packaging:打包方式,我目前见过的有:pom、maven-plugin、war、jar、ear;不指定默认为jar
classifier:不是很常用,用来定义构件的附属属性。如TestNG,主构件是基于jdk1.4平台的,并且又提供了一个基于jdk1.5平台的附属构件
maven简单应用
maven标准目录结构:
工程hello-world结构如下:
1、pom.xml
<?xml version="1.0" encoding="UTF-8"?> <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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.bale.test</groupId> <artifactId>hello-world</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> </project>
2、主类HelloWorld.java
public class HelloWorld { public String sayHello() { return "Hello Maven"; } public static void main(String[] args) { System.out.println(new HelloWorld().sayHello()); } }
3、测试类HelloWorldTest.java
import org.junit.Test; public class HelloWorldTest { @Test public void testSayHello() { HelloWorld helloWorld = new HelloWorld(); helloWorld.sayHello(); } }
mvn clean compile
只编译maven项目,可以看到,先执行clean,清理target目录=> 编译资源文件(当然这个例子没有)=> 编译源码 => 将字节码文件放到classpath中
mvn clean test
该命令执行单元测试,可以看出执行顺序为:
先执行clean,清理target目录=> 编译资源文件(这个例子没有)=> 编译源码 => 将字节码文件放到classpath中 => 编译test资源(这个例子没有)=> 编译测试代码 => 将字节码文件放到classpath中 => 生成单元测试报告
这里可以注意到的细节是:业务代码和测试代码有各自的classpath
mvn clean package
该命令用来打包该项目,指定顺序和执行mvn clean test一致,只不过在最后增加了一步:打包
mvn clean install
该命令用来打包该项目并且将生成的包安装到本地仓库
mvn clean deploy
该命令用来打包该项目并且将生成的包安装到本地仓库以及中心仓或者私服
生成可执行jar包
前面生成的jar包MANIFEST.MF文件中无主类信息,因此无法直接执行,可以通过maven-shade-plugin插件来生成可执行jar包
修改pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?> <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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.bale.test</groupId> <artifactId>hello-world</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.1.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>HelloWorld</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
编译后字节执行jar包: