maven 打包
在 pom.xml 文件内配置入口类:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<!-- 入口类 -->
<mainClass>org.example.Demo</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
maven 约定
maven 约定:
- src/main/java:存放项目的 .java 文件
- src/main/resources:存放项目资源文件
- src/main/webapp:存放web项目的文件
- src/test/java:存放全部测试的 .java 文件
- src/test/resources:存放测试的资源文件
maven 生命周期
maven 的构建生命周期,只是一个抽象的规范流程
- 周期内的每个阶段的具体执行,是在插件里面来实现的
- 运行任何一个阶段,都会从其所在的生命周期的第一个阶段开始,如 mvn package,会从 default 的 process-resources 阶段运行到 package 阶段
各个生命周期预设的定义如下:
阶段 | 处理 | 描述 |
---|---|---|
验证 validate | 验证项目 | 验证项目是否正确且所有必须信息是可用的 |
编译 compile | 执行编译 | 源代码编译在此阶段完成 |
测试 Test | 测试 | 使用适当的单元测试框架,如Junit运行测试 |
包装 package | 打包 | 创建 jar/war 包 |
检查 verify | 检查 | 对继承测试的结果进行检查 |
安装 install | 安装 | 安装打包的项目到本地仓库,供其他项目使用 |
部署 deploy | 部署 | 拷贝最终的工程包到远程仓库 |
maven 插件:插件 plugin 绑定到生命周期,是承担实际功能的组件,mvn 运行时,会自动关联来运行
default 生命周期与插件:
生命周期 | 插件 | 作用 |
---|---|---|
process-resources | maven-resources-plugin:resources | 复制主资源文件至主输出目录 |
compile | maven-compiler-plugin:compile | 编译主代码至输出目录 |
process-test-resources | maven-reources-plugin:testResources | 复制测试资源文件至测试输出目录 |
test | maven-compiler-plugin:testCompile | 编译测试代码至测试输出目录 |
package | maven-jar-plugin:jar | 创建项目jar包 |
install | maven-install-plugin:install | 将项目输出构建安装到本地仓库 |
deploy | maven-deploy-plugin:deploy | 将项目输出构建部署到远程仓库 |
常用的maven命令:
- mvn clean:清理
- mvn compile:编译主程序
- mvn package:打包
- mvn install:安装 jar 到本地库
使用maven命令生成项目:mvn archetype:generate -DgroupId=com.example -DartifactId=Demo -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=1.0
- -DgroupId:项目ID
- -DartifactId:项目名
- -DarchetypeArtifactId:创建项目的模板
- -Dversion:项目版本
Maven 坐标与依赖
1、标识
在 Maven 中,坐标是 jar 包的唯一标识,坐标元素包括如下参数:
- groupId:定义当前模块隶属的实际Maven项目,一般是公司域名倒置
- artifactId:定义实际项目中的一个Maven模块,模块的唯一标识
- version:项目版本
- SNAPSHOT:不稳定快照版
- LATEST:最新版,可能是发布版,可能是稳定版
- RELEASE:最后一个发布版
- packaging:项目的打包方式
- jar:默认
- war
- pom
- maven-plugin
- dassifier:附属构建,如javadoc等,需要有附加插件的帮助
2、依赖管理:在 java 中,依赖的表现形式为,当项目启动时,其依赖的 jar 包必须放入其 classpath 路径内
3、依赖传递:maven 默认的依赖传递取舍规则
- 路径最短原则,即项目根目录中的依赖优先级最高,往下优先级递减
- 同路径长度下,谁先声明谁优先,即当需要覆盖某个依赖时,可以将最新的依赖写在前面
4、解决依赖冲突:
- 使用 exclusions 标签将相关依赖排除
- mvn dependency:tree 用来查看决策出来的依赖树
5、依赖的生命周期:
- compile:默认,用于编译,打包时会包含进去
- provided:用于编译,但不会被打包
- runtime:在运行时提供支持,依赖的 jar 打包时会包含进去
- test:仅用于测试,依赖的 jar 在打包时不会包含
- system:需要外在提供相应的元素,根据 systemPath 来取得,一般禁止使用
Maven 插件开发
可以自定义插件,来扩展 maven 的功能:
1、引入 maven api 依赖:
<packaging>maven-plugin</packaging>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.6.3</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.5.2</version>
<scope>provided</scope>
</dependency>
</dependencies>
2、编写简单 Mojo 类:继承 AbstractMojo 类
// 指定目标方法
@Mojo(name = "log")
public class MyPlugin extends AbstractMojo {
@Parameter(property = "log.name",defaultValue = "Demo")
private Object name;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("Hello");
}
}