[英]org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class
[英]Spring/Java org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [C:\launchCodeFiles\src\main\java\RunMario.java]
我正在学习 Java 并被告知要学习 Spring。 我正在编写一个简单的程序并收到此错误消息(我使用的是 IntelliJ Idea IDE):
first line of main
2015-05-06 11:37:38 INFO ClassPathXmlApplicationContext:510 - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1e717c2: startup date [Wed May 06 11:37:38 CDT 2015]; root of context hierarchy
2015-05-06 11:37:38 INFO XmlBeanDefinitionReader:317 - Loading XML bean definitions from class path resource [ApplicationContext.xml]
2015-05-06 11:37:39 WARN ClassPathXmlApplicationContext:487 - Exception encountered during context initialization - cancelling refresh attempt
Exception in thread "main" org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [C:\launchCodeFiles\src\main\java\RunMario.java] for bean with name 'obstacle1' defined in class path resource [ApplicationContext.xml]; nested exception is java.lang.ClassNotFoundException: C:\launchCodeFiles\src\main\java\RunMario.java
org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [C:\launchCodeFiles\src\main\java\RunMario.java] for bean with name 'obstacle1' defined in class path resource [ApplicationContext.xml]; nested exception is java.lang.ClassNotFoundException: C:\launchCodeFiles\src\main\java\RunMario.java
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1328)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1328)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:622)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:622)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:591)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:591)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1397)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1397)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:968)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:968)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:735)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:735)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at RunMario.main(RunMario.java:17)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at RunMario.main(RunMario.java:17)
at java.lang.reflect.Method.invoke(Method.java:497)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
Caused by: java.lang.ClassNotFoundException: C:\launchCodeFiles\src\main\java\RunMario.java
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.reflect.Method.invoke(Method.java:497)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
Caused by: java.lang.ClassNotFoundException: C:\launchCodeFiles\src\main\java\RunMario.java
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:249)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:395)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1320)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:249)
... 15 more
at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:395)
at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1349)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1320)
... 15 more
Process finished with exit code 1
我的 ApplicationContext.xml 文件如下。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="obstacle1" class="C:\launchCodeFiles\src\main\java\RunMario.java">
<constructor-arg name= "marioObstacles" ref="obstacle"/>
</bean>
<bean id="obstacle" class="C:\launchCodeFiles\src\main\java\MarioObstacles.java">
<constructor-arg name="obstacle" value="0"/>
</bean>
</beans>
我从项目面板复制并粘贴了 RunMario 类文件路径,因此它应该是完全限定的路径。 这是 RunMario.java 文件:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Scanner;
public class RunMario {
private MarioObstacles marioObstacles;
public RunMario(MarioObstacles marioObstacles) {
this.marioObstacles = marioObstacles;
}
public static void main(String[] arguments) {
// RunMario runMario1 = new RunMario(MarioObstacles.getInstance());
System.out.println("first line of main");
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
System.out.println("just out of context");
RunMario obj = (RunMario) context.getBean("obstacle1");
obj.start();
}
public void start() {
System.out.println("first line of start");
BuildOstacles pyramid = marioObstacles.pyramid();
pyramid.setHeight(runMario());
pyramid.buildPyramid();
System.out.println(pyramid);
System.out.println("exiting start");
}
public static int runMario() {
System.out.println("entering runMario");
int height;
do {
Scanner scan = new Scanner(System.in);
System.out.println("Please enter a whole number between 1 and 10");
height = scan.nextInt();
} while (height < 1 || height > 10);
return height;
}
}
我花了2天时间寻找答案。 我似乎无法弄清楚。
有什么建议?
您需要完全限定的类名是对的,但在这种情况下,这意味着包位置,例如com.yourapp.RunMario
,而不是文件路径。
根据您的代码,您没有定义任何包(也就是说,您的RunMario
类顶部没有package
)。 定义包是最佳实践,但在您这样做之前,您的完全限定类只是RunMario
。
换句话说,你在哪里
<bean id="obstacle1" class="C:\launchCodeFiles\src\main\java\RunMario.java">
<constructor-arg name= "marioObstacles" ref="obstacle"/>
</bean>
<bean id="obstacle" class="C:\launchCodeFiles\src\main\java\MarioObstacles.java">
<constructor-arg name="obstacle" value="0"/>
</bean>
它应该是
<bean id="obstacle1" class="RunMario">
<constructor-arg name= "marioObstacles" ref="obstacle"/>
</bean>
<bean id="obstacle" class="MarioObstacles">
<constructor-arg name="obstacle" value="0"/>
</bean>
我没有看到RunMario.java
类的任何包。 我可以看到java类在父目录中。
所以而不是声明
<bean id="obstacle" class="C:\launchCodeFiles\src\main\java\MarioObstacles.java">
声明为
<bean id="obstacle" class="MarioObstacles">
问题出在您的应用程序上下文文件中; 你指出了java源而不是你的类的编译你应该以这种方式编写你的application-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="obstacle1" class="RunMario">
<constructor-arg name= "marioObstacles" ref="obstacle"/>
</bean>
<bean id="obstacle" class="MarioObstacles">
<constructor-arg name="obstacle" value="0"/>
</bean>
</beans>
注意类必须是完全限定的(包+类名)
如果您不遵循包结构,则使用以下一个
<bean id="obstacle" class="MarioObstacles">
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.