Ank*_*kur 30 java dependencies tomcat
我收到以下错误:
INFO:validateJarFile(C:\ dev\server\tomcat6\webapps Sempedia\WEB-INF\lib\servlet-api.jar) - jar未加载.参见Servlet Spec 2.3,sectoin 9.7.2.违规类:javax/servlet/Servlet.class
那里的现有资源说它是由于与servlet.jar的冲突或在我的情况下命名为servlet-api.jar文件.我已经从/ webapps文件夹中删除了所有其他项目,我已经获取了tomcat6/lib目录中的servlet-api.jar文件,并将其添加到项目构建路径中,所以我看不到它是怎么回事仍然是一场冲突.
当我尝试运行应用程序时,我得到以下堆栈跟踪.
org.apache.jasper.JasperException:无法为JSP编译类:
生成的java文件中的第22行发生错误方法getJspApplicationContext(ServletContext)未定义类型JspFactory
堆栈跟踪:
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92)org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler. java:439)org.apache.jasper.compiler.Compiler.compile(Compiler.java:334)org.apache.jasper.compiler.Compiler.compile(Compiler.java:312)org.apache.jasper.compiler.Compiler. compile(Compiler.java:299)org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:586)org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)org.apache.jasper.servlet. JspServlet.serviceJspFile(JspServlet.java:342)org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)javax.servlet.http.HttpServlet.service(httpServlet.java:717)
Bal*_*usC 40
这是类路径污染的标志.JSP/Servlet API库依赖于appserver实现,属于Tomcat/lib文件夹中Tomcat 6的情况,不应该在其他地方移动或复制.正如您现在遇到的那样,它是可移植性问题和类加载冲突的秘诀.webapp中的库在类加载中具有优先权.如果在servlet-api.jar那里遇到它,它反过来在那里寻找它的依赖,但它们显然在那里缺失.
您必须从webapp中删除任何特定于appserver的库Webapp/WEB-INF/lib.您应该只在其中放置特定于webapp的库.将appserver特定的库保留在appserver自己的默认类路径中,这是Tomcat/lib您的情况.保持不变.您最多可以添加您希望在其中的所有Web应用程序之间共享的库,或者甚至更好地为其配置shared.loaderin Tomcat/conf/catalina.properties.
还可以从JDK/lib和JRE/lib文件夹中删除任何特定于appserver和webapp的库(如果有).我经常看到一些初学者移动/复制那里的库,因为"否则它不会编译".您永远不应该在那里复制非JRK/JRE特定的库.这也是便携性问题的秘诀.javac使用with编译类时,应使用-cp参数指定依赖库.
更新:如果是IDE(您在谈论"构建路径"时似乎使用了一个IDE),则需要将Web项目与应用程序服务器相关联.例如,在Eclipse中,您可以选择在创建动态Web项目期间执行此操作.您需要在项目创建之前在Eclipse中集成服务器实例.您可以通过Servers视图执行此操作(假设您使用Eclipse进行Java EE开发人员,否则进行升级).您也可以通过项目属性中的Servers条目更改它.选择一个您想用作"默认"服务器的服务器,然后将其库自动包含在项目的构建路径中.绝对没有必要在其他地方复制/移动它们.另请参见如何在Eclipse项目中导入javax.servlet API?
Rae*_*ald 20
正如其他答案所说,这是因为您的WAR包含servlet API类,但它不应该这样做.
如果您使用Maven构建项目,则需要告诉Maven在编译和测试时使servlet API可用,但不要将其包含在WAR中.正如关于依赖范围的Maven文档所述,您应该使用providedServlet API的范围:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
如果某些依赖项将Servlet API作为编译依赖项引入,您可能还必须明确地将Servlet API排除为传递依赖项:
<dependency>
<groupId>com.example</groupId>
<artifactId>frob-driver-core</artifactId>
<version>1.0.1</version>
<exclusions>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
</exclusions>
</dependency>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
82272 次 |
| 最近记录: |