今天配置了第一个用Hibernate做持久层的工程。按理说导入hibernate.3jar和lib下的required文件夹下的Jar包就能正常运行的,我也是这样做的,但是导入后,写完配置文件和对象关系映射文件,运行程序居然出错了。
看第一行就我们可以知道不能加载org.slf4j.impl包下的StaticLoggerBinder类,然后在打开slf4j-api-1.5.2.jar没有发现有有org.slf4j.impl包,其他jar包也没有。所以现在的问题是这个包和类在哪,上百度都说缺少slf4j-nop-1.5.2.jar(但是很少说原因)。 下载导入工程,这次能正常运行了。
但是为什么Hibernate不自带这个包呢?暂时不能理解!
但是仔细想想,从包名impl我们似乎可以想到slf4j-nop-1.5.2.jar应该是一个具体实现类的包。那么slf4j-api-1.5.2.jar下的应该就是接口了。到底是不是这样,还要观察源代码才能知道。
打开slf4j-api-1.5.2.jar的源码,可以轻易发现这样的接口:
public interface ILoggerFactory{……}
public interface IMarkerFactory{……}
public interface Marker extends Serializable{……}
public interface MarkerFactoryBinder {……}
再看看slf4j-nop-1.5.2.jar的源码,可以发现这样的实现类:
public class NOPLoggerFactory implements ILoggerFactory{……}
public class StaticLoggerBinder implements LoggerFactoryBinder{……}
public class StaticMarkerBinder implements MarkerFactoryBinder{……}
经过对比,证实了我的猜测:Hibernate的提供了api接口的包,但是没有提供impl实现包。至于为什么,我想应该是让程序员自主选择实现的方法吧,因为不止一种Jar实现了他的api接口。
这都是个人见解,如果你有不同的见解欢迎指正。