记第一次使用maven3.2 jstl1.2时包找不到和包冲突的解决

来源:互联网 发布:刘雨晴淘宝店东西假吗 编辑:程序博客网 时间:2024/06/07 01:55

初学javaweb,在看孙卫琴老师的javaweb开发15章讲JSTL core标签库的时候跑了一下书上的代码,window10,java 1.8,cmd+tomcat8.15,(刚开始,不想用IDE,所以都是cmd)。书本代码目录结构

|--ch15: namelist.jstp, out.jsp

|--META-INF: context.xml

|--src

|-- mypack: CounterBean.java

|--WEB-INF: web.xml

|-- classes

|--mypack:null

|-- lib: jstl.jar, standard.jar

 chrome访问http://localhost:8080/ch15/out.jsp运行出错,大概是找不到jstl-el表达式出错的问题。这里详细的错误不记得了。我检查了代码确定没有错,/lib/jstl是1.1的包,按照网上说的jstl1.1就是这么放的,应该没问题。继续搜,发现好多讲了从jstl1.0到jstl1.2需要把out.jsp等使用tag的开始行<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>改为<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>,检查没有问题。

然后干脆换1.2吧,就把上述lib下面的两个jar文件删除了,从apache官网http://tomcat.apache.org/download-taglibs.cgi下载了jstl1.2的h包, 发现 网页 上有4 个, 不管了全下,然后放在lib目录下,reload ch15, 发现还是类似的错误。有点不开心。然后仔细看了一下官方的教程https://www.apache.org/dist/tomcat/taglibs/taglibs-standard-1.2.5/README_bin.txt,截图如下

咦,发现貌似少了xalan和serializer是吧,于是就跑http://www.mvnrepository.com/这下载了最新版本的上面两个包放在了lib下,reload在访问,还是不行...这个时候就有点gg了。然后呢,网上还有说把jstl包放在%CATALINA_HOME%/lib然后删除lib下面的包的,照做,预感中的继续不对啊。这个时候就有点无奈了,睡觉了。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

第二天再战,留意到这个网搜的时候各种解决办法都提到了maven(由于现在第一个项目刚开始,后面maven估计少不了),于是就抱着顺带maven看能不能搞定的想法配置了maven。安装和PATH设置不说了,包括更早的jre PATH配置什么的。cmd下mvn -version没问题的话基本就行,到了建立web-app时(其实这里还是有各种问题的,网上说的好多都是用IDE的,还好后面还是找到了用cmd来的,非常感谢,详细见文末尾链接)。这里就直接把过程说完吧。按照下面的来:

cmd到放置工程的目录(我的在myproj/),执行

mvn archetype:generate -DgroupId=cn.luxh.app -DartifactId=mych15 -DarchetypeArtifactId=maven-archetype-webapp -DinteractivMode=false

这个过程可能有点,注意看下上面的mych15是新的工程名,然后把书本原始工程目录(或者原工程目录)ch15下的所有文件拷贝到mych15\src\main\webapp下,删除mych15\src\main\webapp\WEB-INF\classes\mypack\和mych15\src\main\webapp\WEB-INF\lib\下面的所有文件,然后把mych15\src\main\webapp\src的mypack文件夹剪切到mych15\src\main\java\下(这是可能没有\java,手动建立),然后删除mych15\src\main\webapp\src。

然后(参考http://blog.csdn.net/haolongabc/article/details/50378611),修改mych15\pom.xml,在<dependencies>下加入

<dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
    </dependency>
然后再mvn compile,mvn package,把war包拷贝到%CATALINA_HOME%/webapps/下,reload再访问还是错滴,java.lang.NoClassDefFoundError。然后继续按照参考中说的再改<dependency>,如下
<dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.servlet.jsp</groupId>
                    <artifactId>jsp-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
 
        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>jstl-impl</artifactId>
            <version>1.2</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.servlet.jsp</groupId>
                    <artifactId>jsp-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.servlet.jsp.jstl</groupId>
                    <artifactId>jstl-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
说的大概是%CATALINA_HOME%/lib如果放了servlet-api,jsp-api,jstl-api了,现在需要<exclusion>一些重复引入的包,可能会冲突,此外还要注意参考里面也大概讲了为什么只要加入jstl-api和jstl-impl。到此我以为就要成功了,再mvn compile, mvn package拷贝war, reload,访问,结果是
org.apache.jasper.el.ELContextImpl cannot be cast to org.apache.jasper.runtime.ELContextImpl
果然还是惊喜不断啊。
接下来在https://stackoverflow.com/questions/12384779/org-apache-jasper-el-elcontextimpl-cannot-be-cast-to-org-apache-jasper-runtime-e中看了一下第一个回答,应该是很有道理了,说的是WEB-INF/lib下的jasper,jetty,servlet和%CATALIAN_HOME%/lib下面的这些包冲突,我一看mych15工程下的WEB-INF/lib是空的啊,好像不太是这个问题。再搜,发现好几个类似问题的回答最后都定向到了这条问答,绝望之中我就把往下翻了翻各种点赞不是很多的回答,发现了最后一条如下:

咦,难道我%CATALIAN_HOME%/webapps/下面还有其他工程有jstl冲突,不管了,一个一个查过去,终于啊,在example/WEB-INF/lib下面发现了两个1.2.5版本jstl-spec和jstl-impl包,由于不知道这个examples是哪里来的了,先剪切掉这两个jar包到桌面备份这吧。重新编译,访问,这下总可以了吧。然而还是炸了。此刻我心里这是一万只**马,甚至想到了别人说程序员***之流的话。虽然绝望,但是报错相同,说明基本上是包冲突了,继续搜吧。
接下来https://stackoverflow.com/questions/16624487/http-status-500-java-lang-noclassdeffounderror-could-not-initialize-class-org最后一条,

讲的还是冲突问题,不过这次可不是%CATALINA_HOME%/lib了,是jre/lib/ext。好,那就去找吧,果然在这个目录下找到了jsp-api.jar和jsp-servlet.jar。删了,重开,终于是正常运行了

这里说一下,这个url里面的ch15。上面在将maven建工程的时候说新的工程是mych15只是为了上面的表述和原始工程ch15区分,实际上我自己在maven建的还是ch15,所以这里拷贝war过去访问的也是ch15,。输出就是简单的jstl/core中的标签替换。
然而为什么我的jre/lib/ext里面会有jsp和servlet呢,现在这两个文件在%CATALINA_HOME%/lib目录下有了(但是不知道装上tomcat的时候是否有)。我想起来,应该是我前几天首次使用servlet和jsp的时候,不知道为啥编译的错误说包缺失是吧,然后也是网搜,然后有说吧这两个包放在/WEB-INF/lib下的额,有说放%CATALINA_HOME%/lib下的,当然还有说放在jre/lib/ext下的,然后我可能是%CATALINA_HOME%/lib和jre/lib/ext都放了,而且更加奇怪的是在使用jstl之前所有用到servlet的jsp都是正常运行,知道现在这次血崩事故。确实刚入门,java看了一周,javaweb一周,基本还是啥都不懂的状态。

总结一下:
1.maven的cmd建立简单工程和各个文件的放置,另外\src\main\resource下放的文件貌似是*.properties之类的,这个再搜搜。
2.jstl的依赖,如果用maven,可以在dependence使用
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jstl-impl</artifactId>
    <version>1.2</version>
    <exclusions>
        <exclusion>
            <artifactId>servlet-api</artifactId>
            <groupId>javax.servlet</groupId>
        </exclusion>
        <exclusion>
            <artifactId>jsp-api</artifactId>
            <groupId>javax.servlet.jsp</groupId>
        </exclusion>
        <exclusion>
            <artifactId>jstl-api</artifactId>
            <groupId>javax.servlet.jsp.jstl</groupId>
        </exclusion>
    </exclusions>
</dependency>

然后记得一定要把工程目录下的WEB-INF/lib/和jre/lib/ext下的冲突包删除了,不要再往jre/lib/ext下随意导入jar包,不知是否是这样理解的:现在是tomcat运行在jre之上,tomcat自身lib包含servlet就行了?
另外https://stackoverflow.com/questions/12384779/org-apache-jasper-el-elcontextimpl-cannot-be-cast-to-org-apache-jasper-runtime-e提到了depenency的provided关键字使用。

第一次写博客,还没学用高端编辑器...见谅。

附上参考链接:
https://stackoverflow.com/questions/12384779/org-apache-jasper-el-elcontextimpl-cannot-be-cast-to-org-apache-jasper-runtime-e
https://stackoverflow.com/questions/16624487/http-status-500-java-lang-noclassdeffounderror-could-not-initialize-class-org
http://blog.csdn.net/wabiaozia/article/details/52858458
http://blog.csdn.net/edward0830ly/article/details/8748986
http://blog.csdn.net/haolongabc/article/details/50378611



原创粉丝点击