美文网首页
Maven in action

Maven in action

作者: 垃圾简书_吃枣药丸 | 来源:发表于2020-12-10 15:09 被阅读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: 表示为是中央仓库的镜像,任何对中央仓库的请求都会被转发到该镜像。
      • *: 所有的请求都会被转发到该镜像。
 <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} 项目版本
    2. POM属性: 可以引用POM文件中对应元素的值
      • ${project.artifactId}
      • ${project.build.sourceDirecory}
      • ${project.build.finalName}
    3. 自定义属性: 用户在<properties>中定义的属性
    4. Settings属性,与POM属性类似,不过读取的是conf/settings.xml文件中的值
      • ${settings.localRepository}
    5. Java属性: 可以使用mvn help:system查看所有Java系统属性
      • ${user.home}
    6. 环境变量属性,都是以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>

相关文章

网友评论

      本文标题:Maven in action

      本文链接:https://www.haomeiwen.com/subject/cjbhgktx.html