--为啥子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