美文网首页
Maven 命令行打包 和 pom.xml的常用配置

Maven 命令行打包 和 pom.xml的常用配置

作者: 寻Sweet | 来源:发表于2021-08-16 10:29 被阅读0次

    maven 命令行打包

    mvn -v, --show-version

    现在最新的maven版本是 3.6,我这里用的还是 2017 年下载的 3.1.1 版本(虽然有点过时,但是大版本不变,指令基本一样)


    image.png
    image.png

    mvn -h, --help
    使用 help 命令可以看到 maven 命令的帮助文档,下面主要介绍两个常用的指令 —— D 和 P。


    image.png
    mvn -D, --define <arg>
    mvn -DpropertyName=propertyValue clean package 可以用来临时定义属性和值。如果 pom.xml 中已经有该属性,那么会替换掉 pom.xml 中的值。

    如果需要定义多个变量,可以用空格分隔
    mvn -DpropA=valueA -DpropB=valueB -DpropC=valueC clean package

    当然这个属性也可以直接在 pom.xml 文件下配置

        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <android.sdk.path>C:\software\android\sdk</android.sdk.path>
            <maven.test.skip>true</maven.test.skip>
            <maven.javadoc.skip>true</maven.javadoc.skip>
        </properties>
       </project>
    

    mvn -P, --activate-profiles <arg>
    P 表示 Profiles 配置文件,需要在 <profile> 标签中指定 <id> 才能用 -P 使之生效。

    假如 pom.xml 如下:

        ...
        <profiles>
            <profile>
                <id>test</id>
                ...
            </profile>
            <profile>
                <id>dev</id>
                ...
            </profile>
            <profile>
                <id>prod</id>
                ...
            </profile>
        </profiles>
        ...
    </project>
    

    那么打包时执行 mvn clean package -P prod 将只激活 prod 环境的 profile 配置(也就是说此时 test 和 dev 的配置不会生效)
    mvn package 与 mvn install 的区别

    命令 含义
    mvn clean 删除 target 目录
    mvn package 把 jar 打到本项目的 target 目录下
    mvn install 把 jar 打到本项目的 target 目录下,之后再将它安装到本地的 maven 仓库中

    mvn 打包插件的执行顺序
    我这里用的是 maven 3.1.1 打包 android 项目

    --- maven-clean-plugin:2.5:clean (default-clean)
    --- maven-install-plugin:2.4:install (default-install)
    >>> maven-javadoc-plugin:2.6.1:javadoc (default-cli)
    <<< maven-javadoc-plugin:2.6.1:javadoc (default-cli)
    ---  maven-javadoc-plugin:2.6.1:javadoc (default-cli)
    --------------------------------------------------------------
    --- maven-clean-plugin:2.5:clean (default-clean)
    --- maven-resources-plugin:2.6:copy-resources (copy-src)
    --- android-maven-plugin:3.8.0:generate-sources (default-generate-sources)
    --- maven-resources-plugin:2.6:copy-resources (default-resources)
    --- maven-compiler-plugin:2.3.1:compile (default-compile)
    --- android-maven-plugin:3.8.0:proguard (default-proguard)
    --- maven-resources-plugin:2.6:testResources (default-testResources)
    --- maven-compiler-plugin:2.3.1:testCompile (default-testCompile)
    --- maven-surefire-plugin:2.14:test (default-test)
    --- maven-jar-plugin:2.6:jar (default-jar)
    --- android-maven-plugin:3.8.0:apklib (default-apklib)
    --- maven-install-plugin:2.3.1:install-file (custom-install)
    --- maven-antrun-plugin:1.3:run (to-lib-directory)
    >>> maven-javadoc-plugin:2.9:javadoc (default-cli)
    --- maven-resources-plugin:2.6:copy-resources (copy-src)
    --- android-maven-plugin:3.8.0:generate-sources (default-generate-sources)
    <<< maven-javadoc-plugin:2.9:javadoc (default-cli)
    ---  maven-javadoc-plugin:2.9:javadoc (default-cli)
    

    插件说明

    插件 说明
    maven-clean-plugin 删除已有target目录
    maven-resources-plugin 复制和替换文件
    maven-compiler-plugin 编译所有源文件生成class文件至target\classes目录下
    maven-surefire-plugin 运行测试用例
    maven-jar-plugin 对编译后生成的文件进行打包,包名称默认为:artifactId-version-SNAPSHOT.jar,保存在 target 目录下
    maven-javadoc-plugin 生成文档
    android-maven-plugin 生成、混淆 Android 的类文件(apklib是和aar差不多,都是将类和资源打在一起)

    实战

    案例一

    使用 mvn 打包,并跳过测试,然后生成文档,使用 dev 配置

    @echo off
    mvn clean package -Dmaven.test.skip=true javadoc:javadoc -Pdev
    

    案例二
    将模块A生成的 jar,复制到模块B的 libs 目录下。
    安装模块到 maven 仓库。

    @echo off
    copy /y "moduleA/target/target.jar" "moduleB/libs/baseA.jar"
    call mvn install:install-file -Dfile=baseA.jar -DgroupId=com.example -DartifactId=baseA -Dversion=1.0.1 -Dpackaging=jar
    

    默认情况下,cmd 的命令发起调用后就立即返回了。而 CALL 是一个调用外部批处理程序的指令,类似于函数调用的执行逻辑,它会一直等到函数执行结束才返回。

    pom.xml的常用配置

    denpendencyManagement 与 pluginManagement

    denpendencyManagement是用于管理项目jar包依赖,pluginManagement是用于管理plugin。
    它们的作用是列出依赖的jar包或者plugin包,让子pom来决定是否引用。

    对不同的配置赋予不同的属性

        <profile>
            <id>dev</id>
            <properties>
                <mysql.url>http://localhost:3306</mysql.url>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <mysql.url>http://192.168.1.10:3306</mysql.url>
            </properties>
        </profile>
    </profiles>
    

    activation 元素用来指定激活条件。当没有指定条件,然后指定 activeByDefault 为 true 的时候,就表示没有指明 profile 的情况下默认激活。也就是说 mvn package 将使用 dev 的配置,而 mvn package -P prod 的时候使用的才是 prod 的配置。

    根据不同配置使用不同的源文件、

    <profiles>
        <profile>
            <id>dev</id>
            <properties>  
             <debug.enable>true</debug.enable>  
            </properties> 
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <id>copy-id</id>
                        <goals>
                            <goal>copy-goal</goal>
                        </goals>
                        <phase>validate</phase>
                        <configuration>
                            <outputDirectory>${basedir}/src/com/companyName/global/</outputDirectory>
                            <resources>
                                <directory>${basedir}/profiles/dev/</directory>
                                <filtering>true</filtering>
                                <includes>
                                    <include>**/*.java</include>
                                </includes>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </profile>
    </profiles>
    

    然后在 profiles/dev 目录下新建 java 文件

    (略)
        private boolean isDebugEnable = ${debug.enable}
        (略)
    

    执行打包命令 mvn clean package -DskipTests -Pdev,就可以看到 /profiles/dev 目录下的 java 文件全部被复制到了 /src/com/companyName/global 目录下了,并且 isDebugEnable 的值也被替换了。

    配置项说明:

    parse 用来指明具体在 maven 的哪个生命周期执行该任务

    <center>maven 的生命周期表</center>

    生命周期阶段 描述
    validate 验证项目是否正确,并且所有必要的信息可用于完成构建过程
    initialize 建立初始化状态,例如设置属性
    generate-sources 产生任何的源代码包含在编译阶段
    process-sources 处理源代码,例如,过滤器值
    generate-resources 包含在包中产生的资源
    process-resources 复制和处理资源到目标目录,准备打包阶段
    compile 编译该项目的源代码
    process-classes 从编译生成的文件提交处理,例如:Java类的字节码增强/优化
    generate-test-sources 生成任何测试的源代码包含在编译阶段
    process-test-sources 处理测试源代码,例如,过滤器任何值
    test-compile 编译测试源代码到测试目标目录
    process-test-classes 处理测试代码文件编译生成的文件
    test 运行测试使用合适的单元测试框架(JUnit)
    prepare-package 执行必要的任何操作的实际打包之前准备一个包
    package 提取编译后的代码,并在其分发格式打包,如JAR,WAR或EAR文件
    pre-integration-test 完成执行集成测试之前所需操作。例如,设置所需的环境
    integration-test 处理并在必要时部署软件包到集成测试可以运行的环境
    pre-integration-test 完成集成测试已全部执行后所需操作。例如,清理环境
    verify 运行任何检查,验证包是有效的,符合质量审核规定
    install 将包安装到本地存储库,它可以用作当地其他项目的依赖
    deploy 复制最终的包到远程仓库与其他开发者和项目共享

    inherited 用来指明 execution 是否传递到子 pom.xml 里
    filtering属性用来表示资源文件中的 “EL表达式占位符” 是否需要被替换,true为需要替换

    相关文章

      网友评论

          本文标题:Maven 命令行打包 和 pom.xml的常用配置

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