Maven in action
2020-12-10 本文已影响0人
垃圾简书_吃枣药丸
- 设置编译插件的支持的java版本
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<groupId>org.apache.maven.plugins</groupId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
- package打包生成的jar包的文件名:
- 默认为:
artifact-version.jar
- 手动修改: 设置finalName
- 默认为:
<build>
<!--设置编译的jar包的文件名-->
<finalName>maven-learn</finalName>
</build>
-
编译成可执行的jar: 使用
maven-shade-plugin
插件 -
约定:
- 源代码文件夹:
src/main/java
- 测试代码文件夹:
src/test/java
- 源代码文件夹:
-
生成maven的项目结构-快速创建项目骨架
mvn archetype:generate
-
使用maven属性定义变量
<!--属性-->
<properties>
<java.version>1.8</java.version>
</properties>
六、依赖范围
在编译源代码和编译测试代码时可能需要不同的依赖,可通过
<scope>
来控制不同环境的classpath
- 几种classpath:
- 编译classpath
- 运行classpath
- 测试classpath
-
scope
-
compile
: 编译/运行/测试 -
test
: 测试 -
provided
: 编译/测试。运行时不需要的依赖,如Servlet-api -
runtime
: 运行/测试。编译时不需要,如JDBC驱动的实现 -
system
: 与provided
的效果一致,但是该依赖需要手动指定依赖文件的本地路径,不具有可移植性。 -
import
: 不会对三种classpath产生影响。
-
# 依赖调解
- 最近者优先:
- A->B->C(1.0)
- A->C(2.0)
因为A->C的路径更短,所以会解析C(2.0)
- 引入依赖的物理顺序
- A->B->C(1.0)
- A->D->C(2.0)
因为在POM文件中C(1.0)定义的比较靠前,所以会解析C(1.0)
# 可选依赖
A->B->C(Optional)
A依赖于B,B依赖于C,但是C被标记为可选的,所以在A项目中,不会引入C。(SpringBoot-autoconfiguration中大量使用了该属性)
# 排除依赖 exclusion
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.3.0.RELEASE</version>
<!--排除依赖-->
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
# 超级POM
# 仓库
# 本地仓库
- 所在位置:
~/.m2/repository
- 修改仓库位置:修改 conf/settings.xml
<settings>
Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
</settings>
# 为项目设置其他仓库
- 在项目的pom.xml中设置:
- central为中央仓库的id,如果自定义的repository使用了这个id,将无法从中央仓库拉取依赖。
<repositories>
<repository>
<id>aliyun</id>
<name>阿里云</name>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<!--是否启用-->
<enabled>true</enabled>
<!--检查频率-->
<updatePolicy>always</updatePolicy>
</snapshots>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<layout>default</layout>
</repository>
</repositories>
# 远程仓库的认证
- 有些远程仓库,需要提供用户名密码进行验证,通过后才能访问。
- 对于用户名密码的设置,不能直接写在pom.xml,而需要写在conf/settings.xml,这样被认为更安全,不容易泄露。
<server>
<!-- 该id需要与pom.xml中repository设置的id对应起来 -->
<id>aliyun</id>
<username>admin</username>
<password>admin123</password>
</server>
# 将依赖发布到远程仓库
- 注意id与conf/settings.xml servers/server/id对应
<!--发布依赖-->
<distributionManagement>
<repository>
<id>pro-release</id>
<name>正式版</name>
<url>http://127.0.0.1/release</url>
</repository>
<snapshotRepository>
<id>proj-snapshot</id>
<name>快照版</name>
<url>http://127.0.0.1/snapshot</url>
</snapshotRepository>
</distributionManagement>
- 发布命令:
mvn deploy
# 镜像
如果仓库X能提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。
选择合适的镜像可以帮助我们加快依赖的下载。
- 配置镜像 conf/settings.xml
- mirrorOf:
-
central
: 表示为是中央仓库的镜像,任何对中央仓库的请求都会被转发到该镜像。 -
*
: 所有的请求都会被转发到该镜像。
-
- mirrorOf:
<mirrors>
<mirror>
<id>tencent</id>
<name>tencent maven mirror</name>
<url>https://mirrors.tencent.com/nexus/repository/maven-public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
<mirror>
<id>aliyun</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
十四、 Maven属性与Profile
1. Maven属性
- 定义:
<properties>
- 作用:消除重复,统一管理
- Maven属性的分类
- 内置属性
-
${basedir}
: 项目根目录 -
${version}
项目版本
-
- POM属性: 可以引用POM文件中对应元素的值
${project.artifactId}
${project.build.sourceDirecory}
${project.build.finalName}
- 自定义属性: 用户在
<properties>
中定义的属性 - Settings属性,与POM属性类似,不过读取的是
conf/settings.xml
文件中的值${settings.localRepository}
- Java属性: 可以使用
mvn help:system
查看所有Java系统属性${user.home}
- 环境变量属性,都是以
env.
开头${env.JAVA_HOME}
- 内置属性
2. 环境与Profile,为不同的环境启用不同的配置
- 配置文件: db.properties
url=${db.url}
username=${db.username}
password=${db.password}
- pom.xml 中设置profile,将不同环境的配置写在不同profile的properties标签下。
<profiles>
<profile>
<id>futao</id>
<properties>
<db.url>http://baidu.com</db.url>
<db.username>futao</db.username>
<db.password>123456</db.password>
</properties>
</profile>
<profile>
<id>hyy</id>
<properties>
<db.url>http://hyy.com</db.url>
<db.username>hyy</db.username>
<db.password>123456hyy</db.password>
</properties>
</profile>
</profiles>
- 还需要一步:
在默认情况下,maven只会给我们替换pom文件中的属性${xxx}
,如果要解析资源文件中的Maven属性,需要开启资源过滤。
资源文件处理是maven-resource-plugin
插件的工作,默认情况下,该插件只会将主资源目录的文件(测试资源的文件)复制到主代码编译输出的目录中(测试代码编译输出的目录中)。如果需要解析资源文件中的属性,需要进行以下设置:
<build>
<resources>
<resource>
<!--解析资源文件-替换maven属性-->
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
- 使用指定的profile编译,根据profile替换Maven属性。
-Penv
mvn clean package -Pfutao
- 激活profile的方式
- 命令行激活
-Pdev, local
- settings文件激活/conf/settings.xml,对所有Maven都有效
- 命令行激活
<activeProfiles>
<activeProfile>dev</activeProfiles>
</activeProfiles>
- 基于系统属性
- 基于操作系统
- 基于文件存在与否
- 默认激活
<profile>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
# 其他
- 查看依赖树
mvn dependency:tree
- 跳过测试
- 跳过测试运行
- 设置跳过测试
mvn package -DskipTests
- surefire-plugin插件设置skipTests
- 设置跳过测试
- 跳过测试编译和运行
- mvn package -Dmaven.test.skip=true
- 设置编译时过滤:
- 跳过测试运行
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<!--跳过测试-->
<skip>true</skip>
</configuration>
</plugin>
<properties>
<java.version>1.8</java.version>
<!--跳过测试-->
<maven.test.skip>true</maven.test.skip>
<!--跳过javadoc-->
<maven.javadoc.skip>true</maven.javadoc.skip>
</properties>