这是一个比较曲折的故事~~,过程比较郁闷。
今天在项目中需要用到jstl,于是就上 http://mvnrepository.com/ 搜索,一搜出来一大片,关于jstl的实现乱七八糟。
一开始没有多想,就选择了第一个(其实这个版本对应的jar文件已经没了,但是我选择时没有仔细看,直接复制粘贴到项目中了),这就为我下来的错误埋下了伏笔。
配置好依赖(jsp-api和servlet-api的依赖都配了),运行项目,报错:Failed to load or instantiate TagLibraryValidator class: org.apache.taglibs.standard.tlv.JstlCoreTLV。
不能加载JstlCoreTLV
这个类,打开Libraries查看,类是存在的:
然后我就开始了各种Google,各种百度。网上大多是在讲依赖和jar包冲突的问题,仔细检查了一下,并没有这两种情况。
接着搜~~,然后搜到了有人说可能是,pom文件依赖只引入的接口标准,而并没有引入具体实现。是吗?好像不是!
唔~~~ 凌乱了。不知道怎么回事了。我只好试着换个其他版本看看。
1 | <!-- jstl --> |
更换完成后,一运行,OK了 没问题了。
但是 为什么呢?????打开这个版本的jar文件结构和刚才的没有什么区别啊? 于是我决定看一下这两个jar文件具体有什么区别。
两个jar文件,管用的大小404KB,报错的400KB,看来是有点区别的,为什么一个大一个小?会不会是在下载的过程中jar包数据没有下载完整,于是决定手动下载试试,这个时候发现了本文开头说到的问题 http://mvnrepository.com/ 和 http://repo1.maven.org/maven2 上面都没有该版本的jar文件。
那么我的jar文件是从哪里下载的呢?因为我使用的阿里云的maven仓库,肯定是从阿里云下载的了。随便打开了几个类,发现问题了……
400K的javax.servlet.jsp.jstl.jstl
版本
404K的javax.servlet.jstl
版本
至此已经发现问题的根源所在了。
后记
我试着将mvn的远程仓库配置成 http://mvnrepository.com/ 或 http://repo1.maven.org/maven2 jar文件是无法成功下载到本地仓库的,Eclipse都会直接提示找不到jar的错,编译就会报错,但是用阿里云的远程maven仓库就不会,仔细看了一下,原来阿里云的maven仓库中javax.servlet.jsp.jstl.jstl
有三个仓库,默认的Central
仓库中也是只有sources
的jar的,但是另外两个仓库HongKong Nexus
和 jcenter
中都有jstl-1.2.jsr
估计那个400K的jar就是从这两个仓库中下载下来的,这样不大好。~不大好