首页 > 代码库 > 程序必修改课之maven实用命令

程序必修改课之maven实用命令


总结一下我在工作中用的比较多的一些Maven命令.
1. mvn clean 这个命令可以清理maven编译的target目录.
扩展:我们在建目录结构时一般都会建议一个<packaging>pom</packaging>的parent工程,这样我们在parent目录中运行mvn clean命令即可清理所有的子工程的target.
目录结构举例:
...... 
    <groupId>com.tgb.lk</groupId>
    <artifactId>lk-example-parent</artifactId>
    <packaging>pom</packaging>
    <modules>
        <module>../lk-example-core</module>
        <module>../lk-example-web</module>
        <module>../lk-example-api</module>
        <module>../lk-example-common</module>
    </modules>
......

2.mvn package 这个命令可以打出安装包(jar,war,ear等),在构建时会下载相应的jar(注意:这时不一定能关联下载pom,若想关联下载相关的pom需要使用mvn dependency:tree命令)

3.mvn dependency:tree这个命令可以把pom之间的引用关系展示出来,会自动下载相关的pom(注意:这个命令不一定下载关联所有引用的jar).
命令的结果举例:
技术分享

扩展:直接在命令行中运行该命令显示在黑窗口中,不便于查找,我们可以用mvn dependency:tree>1.txt 将内容输出到文件中,这样可以在文件中直接查找.

4.mvn dependency:copy-dependencies 这个命令可以将在pom中直接引入和间接引入的jar全部关联出来复制到./target/dependency文件夹下.
扩展:我们可以用该命令的输出结果并结合mvn dependency:tree帮我们解决jar版本冲突问题.
例如(下面的这个错误你可能经常碰到哦~),我们的pom中这样写
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.3.16.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
            <version>2.3.16.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-json-plugin</artifactId>
            <version>2.3.16.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.1.2.RELEASE</version>
        </dependency>
发现调试的时候总是运行时报错,通过mvn dependency:copy-dependencies查看到引用的jar中spring的版本有4.1.2.RELEASE还有3.0.5.RELEASE的版本
技术分享
技术分享
技术分享
此时我们可以断定是spring版本冲突造成的错误了,但是哪些jar导致间接引入了3.0.5的版本呢?通过mvn dependency:tree可以帮我们定位到间接引用的出处,如下:
[INFO] +- org.apache.struts:struts2-core:jar:2.3.16.3:compile
[INFO] |  +- org.freemarker:freemarker:jar:2.3.19:compile
[INFO] |  +- ognl:ognl:jar:3.0.6:compile
[INFO] |  |  \- javassist:javassist:jar:3.11.0.GA:compile
[INFO] |  +- commons-fileupload:commons-fileupload:jar:1.3.1:compile
[INFO] |  \- commons-io:commons-io:jar:2.2:compile
[INFO] +- org.apache.struts.xwork:xwork-core:jar:2.3.16.3:compile
[INFO] |  +- org.apache.commons:commons-lang3:jar:3.1:compile
[INFO] |  +- asm:asm:jar:3.3:compile
[INFO] |  \- asm:asm-commons:jar:3.3:compile
[INFO] |     \- asm:asm-tree:jar:3.3:compile
[INFO] +- org.javassist:javassist:jar:3.18.2-GA:compile
[INFO] +- org.apache.struts:struts2-spring-plugin:jar:2.3.16.3:compile
[INFO] |  +- org.springframework:spring-context:jar:3.0.5.RELEASE:compile
[INFO] |  |  +- org.springframework:spring-aop:jar:3.0.5.RELEASE:compile
[INFO] |  |  |  \- aopalliance:aopalliance:jar:1.0:compile
[INFO] |  |  +- org.springframework:spring-expression:jar:3.0.5.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-asm:jar:3.0.5.RELEASE:compile
[INFO] |  \- org.springframework:spring-web:jar:4.1.2.RELEASE:compile
[INFO] +- org.apache.struts:struts2-json-plugin:jar:2.3.16.3:compile
[INFO] +- org.springframework:spring-core:jar:4.1.2.RELEASE:compile

通过以上结果可以分析出是由于org.apache.struts:struts2-spring-plugin:jar:2.3.16.3这个jar间接引出的3.0.5的版本,怎么能解决呢,三种思路:
1.在pom引用中加入排除,如<dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-context</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
这样写了对于程序不需要此jar的即可解决,但本例中的spring-context.jar是程序运行必须引入的.所以考虑第2种
2. <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>4.1.2.RELEASE</version>
            </dependency>

5.mvn dependency:analyze 这个命令可以我们分析依赖.
技术分享

扩展:eclipse由于maven插件集成的不是太好,有些jar间接关联出的jar不能被加载,导致在eclipse运行报错,通过此命令就能帮我们找出那些jar是代码编译时就必须引入而你没有在pom中声明引入的.

暂时先整理这些,以后再继续补充.


技术分享
技术分享

程序必修改课之maven实用命令