Maven
maven的命令格式如下:
mvn [plugin-name]:[goal-name]
该命令的意思是:执行“plugin-name”插件的“goal-name”目标(或者称为动作)。
Maven的默认中央仓库:
当构建一个Maven项目时,首先检查pom.xml文件以确定依赖包的下载位置,执行顺序如下:
1、从本地资源库中查找并获得依赖包,如果没有,执行第2步。
2、从Maven默认中央仓库中查找并获得依赖包(http://repo1.maven.org/maven2/),如果没有,执行第3步。
3、如果在pom.xml中定义了自定义的远程仓库,那么也会在这里的仓库中进行查找并获得依赖包,如果都没有找到,那么Maven就会抛出异常。
默认中央仓库的地址:
1、http://repo1.maven.org/maven2/
2、以上地址还配有搜索页面:http://search.maven.org/
3、如果想要向中央仓库提交自己的依赖包,可以很肯定的告诉你,此功能可以实现;参考:
maven创建java项目:
maven查看插件信息:
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-archetype-plugin
根据Goal Prefix得知,这个插件有别名,所以就可以使用别名
mvn help:describe -Dplugin=archetype
比如使用archetype的generate目标创建最简单的项目
mvn archetype:generate
但是它却很慢,因为:
使用本地的原型文件
所以提前下载archetype-catalog.xml
https://repo.maven.apache.org/maven2/archetype-catalog.xml
下载好以后放在C:\Users\Mustang.m2\repository\目录下
然后输入:mvn archtype:generate -DarchetypeCatalog=local
使用本地的archetype-catalog.xml
但是目标有2000多条,太多了怎么办?
使用maven内置的原型文件
mvn archetype:generate -DarchetypeCatalog=internal
只有七个目标
使用第七个项目模板
创建后的项目架构
maven导入eclipse
无法导入,因为用maven创建的项目没有.project 和 .classpath 文件
cmd 中输入mvn help:describe -Dplugin=eclipse
发现eclipse:eclipse命令能创建.project 和 .classpath 文件
cmd 切到项目根目录
生产了这两个文件,这样eclipse就能识别order项目
如果导入的项目报错,检查是否有M2_REPO 变量,如果没有就如下操作:
maven导入idea
首先删除刚才生产的eclipse的配置文件
进入order项目输入 mvn eclipse:clean
然后使用 mvn help:describe -Dplugin=idea 查看目标信息
使用 idea:idea 然后生成的idea的配置文件
maven编译:
进入项目根目录输入 mvn compiler:compile
maven测试:
mvn compiler:testCompile 编译测试java文件
mvn surefire:test 运行测试class文件
执行surefire:test 必须要经过编译后的class文件才行
这里运行了两个Test测试单元
运行一个Test测试单元
Maven生命周期:
有三个内置的生命周期:默认(default),清洁(clean)和站点(site)。
默认构建生命周期(Default Lifeclyle): 该生命周期表示这项目的构建过程,定义了一个项目的构建要经过的不同的阶段。
清理生命周期(Clean Lifecycle): 该生命周期负责清理项目中的多余信息,保持项目资源和代码的整洁性。一般拿来清空directory(即一般的target)目录下的文件。
站点管理生命周期(Site Lifecycle) :向我们创建一个项目时,我们有时候需要提供一个站点,来介绍这个项目的信息,如项目介绍,项目进度状态、项目组成成员,版本控制信息,项目javadoc索引信息等等。站点管理生命周期定义了站点管理过程的各个阶段。
执行生命周期compile:mvn compile
Maven命令分类:插件命令和生命周期命令
生命周期阶段命令是插件命令的有序集合。
插件命令是单独的,生命周期命令是把很多插件命令组合在一起,是固定的,比较省事,但是插件命令更灵活。
maven打包
mvn package
但是如果想打包出来的文件包含第三方jar包就使用插件:maven-shade-plugin 需要在pom.xml配置
然后在cmd使用mvn package
打包为可执行jar
META-INF/MANIFEST.MF 文件中,配置如下
Main-Class:xxx.xxx.xxx类名
然后进入target目录cmd运行
D:\projects\order\target>java -jar order-1.0-SNAPSHOT.jar
pom.xml结构
<!-- 第三方依赖包 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
</dependencies>
<!-- 把shade插件绑定到package生命周期里面 -->
<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">
<manifestEntries>
<Main-Class>com.oops.eshop.Pay</Main-Class>
<X-Compile-Source-JDK>1.8</X-Compile-Source-JDK>
<X-Compile-Target-JDK>1.8</X-Compile-Target-JDK>
</manifestEntries>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
<!-- 指定当前pom的版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 坐标 -->
<groupId>反写的公司网址+项目名</groupId>
<artifactId>项目名+模块名</artifactId>
<!-- 第一个0表示大版本号
第二个0表示分支版本号
第三个0表示小版本号
0.0.1
snapshot快照
alpha内部测试
beta公测
Release稳定
GA正式发布 -->
<version></version>
<!-- 默认是jar
war zip pom -->
<packaging></packaging>
<!-- 项目描述名 -->
<name></name>
<!-- 项目地址 -->
<url></url>
<!-- 项目描述 -->
<description></description>
<!-- 开发人员表 -->
<developers></developers>
<!-- 许可证信息 -->
<license></license>
<!-- 组织信息 -->
<organization></organization>
<!-- 依赖 -->
<dependencies>
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!-- 依赖范围 这个jar只存在于测试的范围
compile:默认范围,编译测试运行都有效
provided:在编译和测试时都有效
runtime:在测试和运行时有效
test:在测试范围有效 比如junit
system:与本机系统相关联,可移植性差
import:导入的范围,它只是用在dependencyManagement中,表示从气他的pom中导入dependecy的配置-->
<scope>test</scope>
<!-- 设置依赖是否可选 -->
<optional></optional>
<!-- 排除依赖传递列表 -->
<exclusions>
<exclusion>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- 依赖管理,定义在父模块,给子模块用的 -->
<dependencyManagement>
<dependencies>
<dependency></dependency>
</dependencies>
</dependencyManagement>
<build>
<!-- 插件列表 -->
<plugin>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</plugin>
</build>
<!-- 用于子模块对父模块的继承 -->
<parent></parent>
<!-- 聚合运行多个maven项目 -->
<modules>
<module></module>
</modules>
在eclipse使用maven创建项目
编译
如果报错:
maven的[WARNING] Using platform encoding (UTF-8 actually) to copy filter
在项目中的pom.xml添加
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
如果报错:
Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.2:compile
Installed JREs的环境变量jre设置为jdk