2011-12-17 12 views
5

sau khi nâng cấp lên phiên bản mới nhất của nhật thực Helios 3,6, M2E 1.0, WTP 3.2.5 và cố gắng chạy maven của tôi dự án sử dụng JSF 2.1.3mùa xuân 3 trên tomcat 7, tôi đang nhận các ngoại lệ sau đây:

java.lang.ClassNotFoundException: javax.servlet.jsp.el.ImplicitObjectELResolver$ImplicitObjects$4 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1678) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1523) 
    at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:2006) 
    at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:1969) 
    at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1858) 
    at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1826) 
    at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1812) 
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1306) 
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:896) 
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:322) 
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) 
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5103) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:148) 
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033) 
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:774) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:148) 
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033) 
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:291) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:148) 
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:148) 
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:727) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:148) 
    at org.apache.catalina.startup.Catalina.start(Catalina.java:621) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322) 
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:450) 

java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.getExpressionFactory()Ljavax/el/ExpressionFactory;" the class loader (instance of org/apache/catalina/loader/WebappClassLoader) of the current class, com/sun/faces/config/ConfigureListener, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, javax/servlet/jsp/JspApplicationContext, have different Class objects for the type javax/el/ExpressionFactory used in the signature 
    at com.sun.faces.config.ConfigureListener.registerELResolverAndListenerWithJsp(ConfigureListener.java:693) 
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:243) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4723) 
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5226) 
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5221) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 
Dec 17, 2011 4:56:04 PM org.apache.catalina.core.StandardContext listenerStart 
SEVERE: Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener 
java.lang.RuntimeException: java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.getExpressionFactory()Ljavax/el/ExpressionFactory;" the class loader (instance of org/apache/catalina/loader/WebappClassLoader) of the current class, com/sun/faces/config/ConfigureListener, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, javax/servlet/jsp/JspApplicationContext, have different Class objects for the type javax/el/ExpressionFactory used in the signature 
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:292) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4723) 
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5226) 
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5221) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.getExpressionFactory()Ljavax/el/ExpressionFactory;" the class loader (instance of org/apache/catalina/loader/WebappClassLoader) of the current class, com/sun/faces/config/ConfigureListener, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, javax/servlet/jsp/JspApplicationContext, have different Class objects for the type javax/el/ExpressionFactory used in the signature 
    at com.sun.faces.config.ConfigureListener.registerELResolverAndListenerWithJsp(ConfigureListener.java:693) 
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:243) 
    ... 8 more 

sau đây là m y cấu hình cho maven:

<dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.0.1</version> 
     <scope>provided</scope> 
     </dependency> 


     <dependency> 
     <groupId>com.sun.faces</groupId> 
     <artifactId>jsf-api</artifactId> 
     <version>2.1.3</version> 
     </dependency> 

     <dependency> 
     <groupId>com.sun.faces</groupId> 
     <artifactId>jsf-impl</artifactId> 
     <version>2.1.3</version> 
     </dependency> 

     <dependency> 
      <groupId>jstl</groupId> 
      <artifactId>jstl</artifactId> 
      <version>1.2</version> 
     </dependency> 

Tôi có thiếu tệp jar hoặc sử dụng phiên bản không tương thích của bình không?

vui lòng thông báo, cảm ơn.

UPDATE: những gì tôi nhận được cho đến nay là tôi nhận được các ứng dụng chạy tốt bằng cách loại bỏ sự phụ thuộc sau đây từ tập tin pom:

<dependency> 
      <groupId>javax.servlet.jsp</groupId> 
      <artifactId>javax.servlet.jsp-api</artifactId> 
      <version>2.2.1</version> 
      <scope>provided</scope> 
      </dependency> 

      <dependency> 
      <groupId>javax.el</groupId> 
      <artifactId>javax.el-api</artifactId> 
      <version>2.2.2</version> 
      <scope>provided</scope> 
      </dependency> 

tôi nghĩ rằng họ đang mâu thuẫn với các lọ được cung cấp bởi thùng đựng hàng.

GÌ TÔI CÓ CẦN PHẢI BIẾT:

1- Đừng tôi đã thêm các phụ thuộc: javax.servlet.jsp-api, javax.el-api đến tập tin pom của tôi theo quy định hoặc tôi không cần phải thêm chúng ở tất cả? 2- Nếu tôi phải thêm hai phụ thuộc này, thì tôi nên thêm chúng như thế nào theo cách mà chúng sẽ không xung đột với lọ tomcat, nghĩa là phiên bản nào và tôi có nên đánh dấu sự phụ thuộc như được cung cấp hay không?

và câu hỏi quan trọng nếu tôi phải thêm chúng, tại sao tôi phải làm điều đó, tầm quan trọng của việc thêm chúng là gì vì chúng được cung cấp bởi vùng chứa, tôi hiểu rằng tôi cần thêm javax.servlet-api sự phụ thuộc và đánh dấu nó như được cung cấp vì tôi đang sử dụng servlets trong một số lớp học.

+3

Tôi không có anh chàng Maven, vì vậy tôi không biết cách sửa lỗi này, nhưng ít nhất tôi cũng có thể nói rằng ngoại lệ cho biết bạn đã có nhiều tệp JAR API EL trong đường dẫn thời gian chạy webapp cuối cùng (lớp xung đột là gói 'javax.el'). Nếu bạn chắc chắn rằng Maven đang làm đúng công việc của mình, thì bạn cần phải xác minh xem bạn đã không * đặt thủ công mọi thứ trong '/ WEB-INF/lib',' Tomcat/lib', 'JRE/lib', 'JRE/lib/ext' và bất kỳ đường dẫn nào khác được bao phủ bởi classpath thời gian chạy của webapp. Bản thân Tomcat 7 đã có sẵn API/API thích hợp EL 2.2, vì vậy bạn không cần phải cung cấp chính nó (hoặc bằng Maven). – BalusC

+0

@BalusC vì vậy bạn có nghĩa là tôi nên loại bỏ el phụ thuộc được đánh dấu là cung cấp, và chỉ bao gồm các jsp-api và servlet-api như được cung cấp? –

+0

Như đã nói, tôi không phải là anh chàng Maven. Tôi không có ý kiến. Bạn cần phải xác minh xem WAR được xây dựng bởi Maven có ổn không và nếu bạn không lộn xộn các đường dẫn thư viện đã nói ở trên với các tệp JAR EL API trùng lặp. – BalusC

Trả lời

2

Bạn chỉ nên thêm những phụ thuộc này nếu bạn yêu cầu chúng trong mã của bạn có nghĩa là chúng được yêu cầu biên dịch mã của bạn. Nếu bạn không sử dụng các lớp JSP hoặc EL trong mã của mình, bạn có thể loại bỏ các phụ thuộc. Vì vậy, bạn có thể kiểm tra nếu bạn cần các phụ thuộc bằng cách chỉ cần loại bỏ chúng. Nếu mã của bạn vẫn biên dịch, bạn không cần chúng. :)

Nếu bạn cần chúng, bạn chắc chắn nên thêm chúng làm phụ thuộc provided vì các lớp được cung cấp bởi Tomcat trong thời gian chạy. Chỉ cần đảm bảo rằng các phiên bản của các phụ thuộc phù hợp với các phiên bản do Tomcat cung cấp. Sau đó, bạn sẽ không có bất kỳ vấn đề. Các phụ thuộc được cung cấp chỉ được sử dụng để biên dịch mã của bạn nhưng chúng không được đóng gói vào tệp WAR kết quả, đó là OK, vì Tomcat cung cấp chúng.

1

Tôi đã có một vấn đề tương tự: Tôi đã có thể chạy một dự án trong một máy tính, nhưng trong một số khác, tôi đã có được ClassNotFoundException được mô tả trong câu hỏi.

Sự khác biệt duy nhất giữa 2 môi trường là phiên bản của máy chủ tomcat: 7.0.26 trong máy tính đang hoạt động và 7.0.16 trong máy tính khác. Tôi đã cài đặt cùng một phiên bản trong cả hai máy tính (7.0.26) và nó đã giải quyết được vấn đề.

Tôi hy vọng câu trả lời này có thể hữu ích cho ai đó.