- 设置编译插件的支持的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-apiruntime
: 运行/测试。编译时不需要,如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
: 表示为是中央仓库的镜像,任何对中央仓库的请求都会被转发到该镜像。*
: 所有的请求都会被转发到该镜像。
<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>