问题特征
使用IDE(文本以Eclipse为例)集成Maven开发项目,执行Maven的clean命令后
,原来编译的结果被清掉,然后在编辑、编译源代码或运行时报“xxx
.class cannot be resolved to a type”错误,Eclipse的Package
Explorer窗口出现大量的红叉。同时上层依赖项目也出现红叉,感觉整个
Eclipse都要崩溃了。
原因
这种现象是被Eclipse之外的命令清除了结果,Eclipse不能找到编译文件,
因此需要重新编译。
解决办法
Eclipse菜单中找到Project -> Build automatically,并确定是勾选的,其
次点击Project -> Clean…菜单命令项,在弹出的对话框中找到工程,如果
是多个工程依赖开发,可以选择“Clean all projects”,然后点击“OK”
按钮。此过程Eclipse会清除项目中编译的.class文件,同时重新编译工程(
类似于jBuild中的Rebuild功能)。
详细解释
1.我们知道,Maven可以托管项目的整个生命周期,它从验证、源代码管理、
编译、测试、打包、分发、部署(安装)整个系列过程都会参与。
2.Maven默认的编译结果是target目录下,m2e插件将Eclipse默认的编译结果
由默认的bin重置到了target目录,两者共用一个编译结果目录,并且都具有
编译角色,因此Maven的clean命令实际也把Eclipse的编译结果清除了。
3.在代码编写阶段,Eclipse就需要被调用类的编译结果,用来语法检查、代
码提示。被Maven clean后,又不能及时自动编译(尤其是多项目依赖),当
然报错。
当然,实践过程中,首要是排除项目中的错误,如果项目中存在错误,
Eclipse也不会自动编译的。通过Problems窗口可以看到错误报告(可在菜单
Windows -> show views中找到并显示),报告中有错误,务必先修复,否则
无法强制Eclipse编译。
一般情况下,自己代码语法错误较少,Maven项目错误大部分都是pom.xml配
置引起的,所以必须学习好Maven。
2 . maven的clean问题:
在Maven项目中进行单元测试,但mvn clean后重新mvn install项目,再次进
行单元测试,会有以下的错误,Class not found
com.core.order.service.impl.OrderServic
在Maven项目中进行单元测试,但mvn clean后重新mvn install项目,再次进
行单元测试,会有以下的错误,,
<span style="font-family:KaiTi_GB2312;font-size:18px;">Class not
found com.core.order.service.impl.OrderServiceImplTest
java.lang.ClassNotFoundException:
com.core.order.service.impl.OrderServiceImplTest at
java.net.URLClassLoader$1.run(URLClassLoader.java:366) at
java.net.URLClassLoader$1.run(URLClassLoader.java:355) at
java.security.AccessController.doPrivileged(Native Method) at
java.net.URLClassLoader.findClass(URLClassLoader.java:354) at
java.lang.ClassLoader.loadClass(ClassLoader.java:423) at
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at
java.lang.ClassLoader.loadClass(ClassLoader.java:356) at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClass
(RemoteTestRunner.java:693) at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClasses
(RemoteTestRunner.java:429) at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
(RemoteTestRunner.java:452) at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
(RemoteTestRunner.java:683) at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run
(RemoteTestRunner.java:390) at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main
(RemoteTestRunner.java:197)</span>
主要是因为mvn install时,默认会排除打包测试类,导致工程中的测试类
没有编译成.class文件,所以才会报上述错误。
因此,可以通过
eclipse->project->clean
重新编译下,再次运行单元测试就可以成功了。
使用IDE(文本以Eclipse为例)集成Maven开发项目,执行Maven的clean命令后
,原来编译的结果被清掉,然后在编辑、编译源代码或运行时报“xxx
.class cannot be resolved to a type”错误,Eclipse的Package
Explorer窗口出现大量的红叉。同时上层依赖项目也出现红叉,感觉整个
Eclipse都要崩溃了。
原因
这种现象是被Eclipse之外的命令清除了结果,Eclipse不能找到编译文件,
因此需要重新编译。
解决办法
Eclipse菜单中找到Project -> Build automatically,并确定是勾选的,其
次点击Project -> Clean…菜单命令项,在弹出的对话框中找到工程,如果
是多个工程依赖开发,可以选择“Clean all projects”,然后点击“OK”
按钮。此过程Eclipse会清除项目中编译的.class文件,同时重新编译工程(
类似于jBuild中的Rebuild功能)。
详细解释
1.我们知道,Maven可以托管项目的整个生命周期,它从验证、源代码管理、
编译、测试、打包、分发、部署(安装)整个系列过程都会参与。
2.Maven默认的编译结果是target目录下,m2e插件将Eclipse默认的编译结果
由默认的bin重置到了target目录,两者共用一个编译结果目录,并且都具有
编译角色,因此Maven的clean命令实际也把Eclipse的编译结果清除了。
3.在代码编写阶段,Eclipse就需要被调用类的编译结果,用来语法检查、代
码提示。被Maven clean后,又不能及时自动编译(尤其是多项目依赖),当
然报错。
当然,实践过程中,首要是排除项目中的错误,如果项目中存在错误,
Eclipse也不会自动编译的。通过Problems窗口可以看到错误报告(可在菜单
Windows -> show views中找到并显示),报告中有错误,务必先修复,否则
无法强制Eclipse编译。
一般情况下,自己代码语法错误较少,Maven项目错误大部分都是pom.xml配
置引起的,所以必须学习好Maven。
2 . maven的clean问题:
在Maven项目中进行单元测试,但mvn clean后重新mvn install项目,再次进
行单元测试,会有以下的错误,Class not found
com.core.order.service.impl.OrderServic
在Maven项目中进行单元测试,但mvn clean后重新mvn install项目,再次进
行单元测试,会有以下的错误,,
<span style="font-family:KaiTi_GB2312;font-size:18px;">Class not
found com.core.order.service.impl.OrderServiceImplTest
java.lang.ClassNotFoundException:
com.core.order.service.impl.OrderServiceImplTest at
java.net.URLClassLoader$1.run(URLClassLoader.java:366) at
java.net.URLClassLoader$1.run(URLClassLoader.java:355) at
java.security.AccessController.doPrivileged(Native Method) at
java.net.URLClassLoader.findClass(URLClassLoader.java:354) at
java.lang.ClassLoader.loadClass(ClassLoader.java:423) at
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at
java.lang.ClassLoader.loadClass(ClassLoader.java:356) at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClass
(RemoteTestRunner.java:693) at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClasses
(RemoteTestRunner.java:429) at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
(RemoteTestRunner.java:452) at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
(RemoteTestRunner.java:683) at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run
(RemoteTestRunner.java:390) at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main
(RemoteTestRunner.java:197)</span>
主要是因为mvn install时,默认会排除打包测试类,导致工程中的测试类
没有编译成.class文件,所以才会报上述错误。
因此,可以通过
eclipse->project->clean
重新编译下,再次运行单元测试就可以成功了。