mvn compile 和mvn package,mvn install之间的差异

--为啥子junit run 的时候老是报class not found的错呢

最近发现一个问题,在pom.xml文件中把junit的包scope设置为test之后,Junit的testcase居然执行不起来了,居然会有这么奇怪的事情?

出现问题的操作步骤

1.原本项目的junit包是没有指定scope的,那默认情况就是compile,执行junit testcase没有问题。

2.将junit的包scope改为test,自动编译之后,执行junit testcase没有问题。

3.命令行执行 mvn clean compile重新编译项目之后,执行junit testcase出现class not found错误。

分析问题

一开始并没有多想,只是觉得改了scope就不能执行,那改回去自然就好了。于是修改回去,自动编译,执行testcase没有问题,再次执行mvn clean compile后,发现testcase又不能执行了,于是发现事情并有那么简单。(实际上是很简单的,只是自己挖坑自己跳)

既然是class not found,那就看是下是不是真的没这个类,看了一下编译的目录确实没有,而且test-classs整个目录都没有,那么问题应该出在编译。同时之前通过mvn clean install之后,发现是可以执行的,查看编译目录也确实编译出来了test-classs,到这里原因就已经清楚,mvn clean compile命令清除了原来的test-class,但是却没有编译出现的目录来,于是就出现了testcase不能执行的问题。

看起来是一个package scope的问题,实际上是编译动作的问题。

如果不是自己手贱执行了一下命令行重新编译,这个问题是不会出现的,因为eclipse的自动编译(auto building)是可以编译出test-class的,只是mvn clean compile命令只编译main下面的source  code。

终于可以回到主题mvn compile,package,install的差异,这里还加上eclipse的自动编译和clean一起比较。

mvn compile 编译source code,编译范围只包含main下的内容,如果也想编译test,可以单独执行mvn test-compile。

mvn package 编译source code并按pom的定义打包,编译范围包含mian和test

mvn install 编译source code并按pom的定义打包并发布到本地仓库,编译范围包含mian和test

eclipse auto building 按时间戳编译被更新的文件

eclipse clean  清除所有现有编译结果,全部重新编译。(eclipse的项目常有不编译的情况,clean可以解决很多问题)

 

mvn clean compile 依次执行了clean、resources、compile等3个阶段

mvn clean package依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段。
mvn clean install依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8个阶段。

mvn clean deploy依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy等9个阶段。
---------------------
以上加粗部分引自原文:https://blog.csdn.net/zhaojianting/article/details/80324533

啰嗦了很多,本来是一个很小的问题,但是却暴露出自己对于mvn编译理解不够清晰的问题,以此长个记性。

参考文档maven build lifecycle:

http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

你可能感兴趣的:(其他)