Maven in action

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: Maven in action
  • 设置编译插件的支持的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: 表示为是中央仓库的镜像,任何对中央仓库的请求都会被转发到该镜像。
  • *: 所有的请求都会被转发到该镜像。

<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属性的分类
  1. 内置属性
  • ${basedir}: 项目根目录
  • ${version} 项目版本
  1. POM属性: 可以引用POM文件中对应元素的值
  • ${project.artifactId}
  • ${project.build.sourceDirecory}
  • ${project.build.finalName}
  1. 自定义属性: 用户在<properties>中定义的属性
  2. Settings属性,与POM属性类似,不过读取的是conf/settings.xml文件中的值
  • ${settings.localRepository}
  1. Java属性: 可以使用mvn help:system查看所有Java系统属性
  • ${user.home}
  1. 环境变量属性,都是以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的方式
  1. 命令行激活 -Pdev, local
  2. settings文件激活/conf/settings.xml,对所有Maven都有效

<activeProfiles>
  <activeProfile>dev</activeProfiles>
</activeProfiles>
  1. 基于系统属性
  2. 基于操作系统
  3. 基于文件存在与否
  4. 默认激活

<profile>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>


# 其他

  • 查看依赖树 mvn dependency:tree
  • 跳过测试
  • 跳过测试运行
  1. 设置跳过测试 mvn package -DskipTests
  2. surefire-plugin插件设置skipTests
  • 跳过测试编译和运行
  1. mvn package -Dmaven.test.skip=true
  2. 设置编译时过滤:

<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>


相关文章
|
Java Maven Android开发
eclipse 中 maven的pom.xml文件发生错误:CoreException: Could not get the value for parameter compilerId for plugin execution default-compile: PluginResolutionException: Plugin org.apache.maven...
eclipse 中 maven的pom.xml文件发生错误:CoreException: Could not get the value for parameter compilerId for plugin execution default-compile: PluginResolutionException: Plugin org.apache.maven...
666 0
eclipse 中 maven的pom.xml文件发生错误:CoreException: Could not get the value for parameter compilerId for plugin execution default-compile: PluginResolutionException: Plugin org.apache.maven...
|
7月前
|
Java
springboot打包错误:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resource
springboot打包错误:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resource
88 0
|
7月前
|
Java Maven
Maven打包出错Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test
Maven打包出错Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test
418 0
|
Java Maven Android开发
成功解决maven打war包报错:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2
成功解决maven打war包报错:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2
|
Java Maven Android开发
Maven-Could not resolve artifact org.apache.maven.archetypes:maven-archetype-quickstart:jar:1.1
Maven-Could not resolve artifact org.apache.maven.archetypes:maven-archetype-quickstart:jar:1.1
105 0
|
Java Maven
maven只是经手,不是触发:org.apache.maven.lifecycle.LifecycleExecutionException
maven只是经手,不是触发:org.apache.maven.lifecycle.LifecycleExecutionException
197 0
|
Java Maven
maven中的maven clean、maven package命令的使用
maven中的maven clean、maven package命令的使用
maven中的maven clean、maven package命令的使用
|
Java 程序员 测试技术
Maven的build生命周期和常用plugin
Maven的build生命周期和常用plugin
Maven的build生命周期和常用plugin