2012-12-07 27 views
5

Tôi hiện đang cố gắng thay đổi xây dựng của chúng tôi từ một quy trình thủ công (MyEclipse/export as war) thành một Maven Build tự động.Tomcat 7.0.29 vấn đề bộ nạp lớp servlet-api

Ứng dụng chiến tranh được xây dựng bởi MyEclipse triển khai và hoạt động tốt trên bản cài đặt Tomcat 7.0.29 của chúng tôi (Windows 7). Trong đường dẫn xây dựng MyEclipse, chúng ta đã cấu hình một thư viện người dùng (tomcat), chứa tất cả các lọ từ $CATALINA_HOME/lib.

Chúng tôi có một số trình nghe và bộ lọc servlet sử dụng lớp javax.servlet.http. * (HttpSessionEvent, v.v.). Chúng được đóng gói theo số WEB-INF\classes\com\mycompany\filters

Khi triển khai chiến tranh do Maven xây dựng, tôi nhận được NoClassDefFoundError trên lớp HttpSessionEvent. Tôi đã làm một dấu vết với -verbose: lớp JVM tùy chọn và tôi thấy rằng lớp cuối cùng được nạp là bộ lọc của tôi từ thư mục c:\apache\webapps\myapp\WEB-INF\classes\com\mycompany\filters. Sau đó tôi cố gắng tải/tìm HttpSessionEvent và không thể làm như vậy.

Tất nhiên, servlet-api.jar là trong thư mục $CATALINA_HOME\lib của tôi.

Trong pom.xml của tôi, tôi có sự phụ thuộc này

<dependency> 
     <groupId>org.apache.tomcat</groupId> 
     <artifactId>tomcat-servlet-api</artifactId> 
     <version>7.0.29</version> 
     <scope>provided</scope> 
    </dependency> 

Tôi không có file servlet-api.jar khác bất cứ nơi nào trong con đường của tôi/classpath (doublechecked thư mục lib/ext và thư mục xác nhận của jdk và jre của tôi cũng)

phụ thuộc maven của tôi: cây trông như thế này:

[INFO] +- log4j:log4j:jar:1.2.15:compile 
[INFO] | \- javax.mail:mail:jar:1.4:compile 
[INFO] +- jstl:jstl:jar:1.2:compile 
[INFO] +- org.jdom:jdom:jar:1.1:provided 
[INFO] +- com.sun.xml.rpc:jaxrpc-impl:jar:1.1.3_01:provided 
[INFO] | +- javax.xml:jaxrpc-api:jar:1.1:provided 
[INFO] | +- com.sun.xml.messaging.saaj:saaj-impl:jar:1.3:provided 
[INFO] | | \- javax.xml.soap:saaj-api:jar:1.3:provided 
[INFO] | +- com.sun.xml.rpc:jaxrpc-spi:jar:1.1.3_01:provided 
[INFO] | \- com.sun.xml.fastinfoset:FastInfoset:jar:1.0.2:provided 
[INFO] +- org.apache.lucene:lucene-core:jar:3.6.0:compile 
[INFO] +- org.springframework:spring-context:jar:3.1.0.RELEASE:compile 
[INFO] | +- org.springframework:spring-beans:jar:3.1.0.RELEASE:compile 
[INFO] | +- org.springframework:spring-core:jar:3.1.0.RELEASE:compile 
[INFO] | | \- commons-logging:commons-logging:jar:1.1.1:compile 
[INFO] | +- org.springframework:spring-expression:jar:3.1.0.RELEASE:compile 
[INFO] | \- org.springframework:spring-asm:jar:3.1.0.RELEASE:compile 
[INFO] +- org.springframework:spring-web:jar:3.1.0.RELEASE:compile 
[INFO] | \- aopalliance:aopalliance:jar:1.0:compile 
[INFO] +- org.springframework:spring-orm:jar:3.1.0.RELEASE:compile 
[INFO] | +- org.springframework:spring-jdbc:jar:3.1.0.RELEASE:compile 
[INFO] | \- org.springframework:spring-tx:jar:3.1.0.RELEASE:compile 
[INFO] +- org.springframework:spring-aop:jar:3.1.0.RELEASE:compile 
[INFO] +- org.springframework:spring-test:jar:3.1.0.RELEASE:test 
[INFO] +- org.aspectj:aspectjrt:jar:1.7.1:compile 
[INFO] +- org.aspectj:aspectjweaver:jar:1.7.1:compile 
[INFO] +- javax.faces:javax.faces-api:jar:2.1:compile 
[INFO] +- com.sun.faces:jsf-impl:jar:2.1.15:compile 
[INFO] +- org.primefaces:primefaces:jar:3.4.2:compile 
[INFO] +- org.richfaces.core:richfaces-core-api:jar:4.2.3.Final:compile 
[INFO] | \- com.google.guava:guava:jar:11.0.2:compile 
[INFO] |  \- com.google.code.findbugs:jsr305:jar:1.3.9:compile 
[INFO] +- org.richfaces.ui:richfaces-components-ui:jar:4.2.3.Final:compile 
[INFO] | \- org.richfaces.ui:richfaces-components-api:jar:4.2.3.Final:compile 
[INFO] +- org.apache.tomcat:tomcat-servlet-api:jar:7.0.29:provided 
[INFO] +- org.slf4j:slf4j-log4j12:jar:1.7.2:compile 
[INFO] | \- org.slf4j:slf4j-api:jar:1.7.2:compile 
[INFO] +- org.hibernate:hibernate-core:jar:3.6.2.Final:compile 
[INFO] | +- antlr:antlr:jar:2.7.6:compile 
[INFO] | +- commons-collections:commons-collections:jar:3.1:compile 
[INFO] | +- dom4j:dom4j:jar:1.6.1:compile 
[INFO] | +- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Final:compile 
[INFO] | +- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.0.Final:compile 
[INFO] | \- javax.transaction:jta:jar:1.1:compile 
[INFO] +- org.hibernate:hibernate-entitymanager:jar:3.6.2.Final:compile 
[INFO] | +- cglib:cglib:jar:2.2:compile 
[INFO] | | \- asm:asm:jar:3.1:compile 
[INFO] | \- javassist:javassist:jar:3.12.0.GA:compile 
[INFO] +- org.hibernate:hibernate-validator:jar:4.1.0.Final:compile 
[INFO] | \- javax.validation:validation-api:jar:1.0.0.GA:compile 
[INFO] +- org.apache.commons:commons-email:jar:1.2:compile 
[INFO] | \- javax.activation:activation:jar:1.1:compile 
[INFO] +- junit:junit:jar:4.11:test 
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test 
[INFO] \- com.h2database:h2:jar:1.3.170:test 

tôi đã tìm kiếm về vấn đề này trong một thời gian trên internet, và từ những gì tôi đã đọc phải có một số điều cần làm với trình nạp lớp tomcat. Rất có thể có điều gì đó sai trái với việc đóng gói chiến tranh của tôi. Tuy nhiên, tôi chưa tìm được giải pháp nào.

Mọi con trỏ sẽ được đánh giá cao!

+0

Tôi có thể sao chép dự án và xóa mọi thứ trừ một servlet hoặc bộ lọc duy nhất và thử nếu nó hoạt động. Và/hoặc cố gắng triển khai nó đến một công cụ khác, Jetty chẳng hạn. – biziclop

Trả lời

0

Bạn đã kiểm tra WEB-INF/lib của chiến dịch được xây dựng hoàn toàn chắc chắn servlet-api.jar không có ở đó? Phụ thuộc Maven có phạm vi phù hợp miễn là tôi có thể nói.

phần build của bạn trong pom.xml nên tương tự như sau:

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.2</version> 
      <configuration> 
       <warName>war_name</warName> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

Và không có, không đặt servlet-api.jar trong thư mục ứng dụng web của bạn WEB-INF/lib. Ngoài ra, tôi không nghĩ rằng bạn cần thư viện người dùng tomcat. Các thư viện duy nhất bạn cần là JRE System Library xx và Maven Dependencies.

+0

Cảm ơn bạn đã trả lời. Vâng, tuyệt đối, cuộc chiến được xây dựng không chứa servlet-api.war. Và thực sự, không nên đặt servlet-api.jar vào thư mục WEB-INF/lib, nó sẽ bị bỏ qua trong mọi trường hợp bởi tomcat. Phiên bản plugin chiến tranh của tôi là 2.1.1, tôi sẽ kiểm tra xem phiên bản 2.2 có sửa lỗi này không (có vẻ lạ) – avhv

+0

Bất kỳ sự khác biệt nào liên quan giữa .war được xây dựng bởi MyEclipse và phiên bản do Maven xây dựng? (bằng cách này bạn có chạy 'mvn clean' gần đây không?) –

+0

Vâng, chiến tranh được xây dựng bởi MyEclipse chứa nhiều lọ hơn, như công cụ apache commons, lucene ... Tôi có thể thiếu một số jars trong maven build của tôi, nhưng thực tế là dự án đã biên dịch sẽ không có nhiều người trong số họ. BTW, tôi đã cố gắng xóa tất cả các lọ khỏi thư mục WEB-INF/lib đã phát nổ, sao chép tất cả các lọ từ cuộc chiến MyEclipse và triển khai lại. Điều đó cũng không hoạt động (NoClassDefFoundError trên HttpSessionEvent). – avhv

0

Classloading in Tomcat điều này sẽ giúp bạn hiểu.

Nơi jar của bạn trong /WEB-INF/lib

Application Classloader - Một bộ nạp lớp được tạo ra cho mỗi ứng dụng web mà là triển khai trong một trường hợp Tomcat duy nhất.Tất cả các lớp chưa được đóng gói và các tài nguyên trong thư mục/WEB-INF/classes của ứng dụng web của bạn, các lớp và tài nguyên trong tệp JAR trong thư mục/WEB-INF/lib của ứng dụng web của bạn, được hiển thị trên web này ứng dụng, nhưng không áp dụng cho những ứng dụng khác.

+0

Cảm ơn, những gì tôi hiểu được từ liên kết đó là webapp của tôi nhận được trình tải lớp "Webapp" (sẽ tải các lớp từ WEB-INF/classes và WEB-INF/lib/*. Jar). Trình nạp lớp kế thừa từ trình nạp lớp "Chung", có thể tải lớp HttpSessionEvent tốt. Hay trình nạp lớp webapp của tôi không ủy quyền cho trình nạp lớp cha mẹ khi nó không tìm thấy một lớp (điều đó sẽ không có ý nghĩa gì cả)? – avhv

+1

'$ CATALINA_HOME \ ** libs **' có vẻ không đúng tên thư mục '$ CATALINA_HOME \ lib' không hợp lệ trong câu hỏi? Nó là một sai lầm hoặc thực sự lọ được đặt trong thư mục libs? Trong trường hợp đó, trình nạp lớp phổ biến sẽ không thể tìm lớp. –

+0

Xin lỗi, lỗi của tôi (typo), $ CATALINE_HOME = C: \ apache-tomcat-7.0.29 và nó nằm trong thư mục C: \ apache-tomcat-7.0.29 \ lib – avhv

Các vấn đề liên quan