2011-07-01 54 views
27

Khi tôi cố gắng triển khai tai nghe, tai web trên máy chủ thủy tinh. Tôi đã thêm một phụ thuộc vào khách hàng ejb vào dự án web. Tai ejb triển khai thành công. Nhưng khi tôi cố gắng triển khai web-ear, nó ném một ngoại lệ.sun.reflect.annotation.TypeNotPresentExceptionProxy lỗi khi triển khai web-tai

sun.reflect.annotation.TypeNotPresentExceptionProxy 
java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy 
    at sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:653) 
    at sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:460) 
    at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:286) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:222) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:69) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:52) 
    at java.lang.Class.initAnnotationsIfNecessary(Class.java:3070) 
    at java.lang.Class.getAnnotations(Class.java:3050) 
    at org.glassfish.apf.impl.AnnotationProcessorImpl.processAnnotations(AnnotationProcessorImpl.java:285) 
    at org.glassfish.apf.impl.AnnotationProcessorImpl.process(AnnotationProcessorImpl.java:195) 
    at org.glassfish.apf.impl.AnnotationProcessorImpl.process(AnnotationProcessorImpl.java:134) 
    at com.sun.enterprise.deployment.archivist.Archivist.processAnnotations(Archivist.java:606) 
    at com.sun.enterprise.deployment.archivist.Archivist.readAnnotations(Archivist.java:459) 
    at com.sun.enterprise.deployment.archivist.Archivist.readAnnotations(Archivist.java:432) 
    at com.sun.enterprise.deployment.archivist.Archivist.readRestDeploymentDescriptors(Archivist.java:408) 
    at com.sun.enterprise.deployment.archivist.Archivist.readDeploymentDescriptors(Archivist.java:383) 
    at com.sun.enterprise.deployment.archivist.Archivist.open(Archivist.java:246) 
    at com.sun.enterprise.deployment.archivist.Archivist.open(Archivist.java:255) 
    at com.sun.enterprise.deployment.archivist.Archivist.open(Archivist.java:216) 
    at com.sun.enterprise.deployment.archivist.ApplicationFactory.openArchive(ApplicationFactory.java:165) 
    at org.glassfish.javaee.core.deployment.DolProvider.load(DolProvider.java:180) 
    at org.glassfish.javaee.core.deployment.DolProvider.load(DolProvider.java:93) 
    at com.sun.enterprise.v3.server.ApplicationLifecycle.loadDeployer(ApplicationLifecycle.java:826) 
    at com.sun.enterprise.v3.server.ApplicationLifecycle.setupContainerInfos(ApplicationLifecycle.java:768) 
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:368) 
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240) 
    at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:370) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:355) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:370) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1067) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:96) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1247) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1235) 
    at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:465) 
    at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:222) 
    at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:168) 
    at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:234) 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822) 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719) 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013) 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225) 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
    at java.lang.Thread.run(Thread.java:662) 

Bất kỳ ý tưởng nào?

Trả lời

21

Đã có ngoại lệ tương tự gần đây với JUnit. Tình hình là như thế này:

@SuiteClasses({MyTestClass.class}) 
public class MySuite { 
    ... 
} 

Vấn đề là JVM đã không thể xử lý MyTestClass vì nó đã mất tích phụ thuộc trong classpath (một tập tin JAR đã mất tích). Nhưng ngoại lệ không cung cấp thông tin về lớp nào bị thiếu.

Giải pháp là để tạm thêm một khối khởi tạo tĩnh để MySuite, mà instantiates MyTestClass:

@SuiteClasses({MyTestClass.class}) 
public class MySuite { 
    static { 
     new MyTestClass(); 
    } 
} 

điều này gây ra JVM để chạy các khối tĩnh đầu tiên, cố gắng nhanh chóng MyTestClass, tìm hiểu các lớp còn thiếu và báo cáo một ngoại lệ thích hợp. Sau đó, bạn có thể thêm phụ thuộc bị thiếu và loại bỏ khối tĩnh tạm thời.

1

Giải pháp:

  1. Kết nối với debug đến máy chủ Glassfish
  2. Đặt điểm break vào dòng
    • java.lang.Class.initAnnotationsIfNecessary (Class.java:3070)
  3. Triển khai ứng dụng của bạn.

Trong khi triển khai, bạn sẽ dừng lại nhiều lần tại điểm ngắt này. Xem tài liệu tham khảo này và ghi nhớ thông tin cuối cùng trước khi lỗi triển khai phát sinh. Chú thích kiểm tra quá mức trong "" lớp học "cuối cùng. Bạn cũng có thể đặt điểm ngắt vào phương thức AnnotationParser.parseClassArray, nhưng nó được biên dịch mã và điểm ngắt trên phương thức là rất chậm. (Trong trường hợp của tôi với điểm break phương pháp cuối cùng tôi không thể depoy ứng dụng).

33

Tôi nghĩ rằng cách tốt nhất là để đặt một điểm break trong constructor của java.lang.TypeNotPresentException và kiểm tra số thứ hai của loại Throwable biết nguyên nhân gốc rễ

+0

Trong trường hợp của tôi, nguyên nhân gốc là: java.lang.ClassNotFoundException: com.github.springtestdbunit.DbUnitTestExecutionListener –

+0

Cảm ơn bạn, lab! Tôi đặt excpetion trong TypeNotPresentExceptionProxy và nhận ClassNotFoundException vì vậy tôi phát hiện ra lớp nào bị thiếu. – rwitzel

+0

Xin chào, làm thế nào để bạn đặt điểm ngắt đó trong lớp TypeNotPresentExceptionProxy được biên dịch bằng cách sử dụng trình gỡ lỗi Eclipse? (Làm việc với máy chủ ứng dụng WAS Liberty Prifle) Cảm ơn! – icordoba

1

này cũng có thể xảy ra trong tình huống sau đây:

dự án A là một số thư viện, một dự án maven trong nhật thực của bạn. Lớp học có tên là org.exmaple.Foo có trong thư mục src/test/java/.

trong dự án của bạn B nơi xảy ra lỗi, bạn đang cố truy cập lớp này. Nhưng điều này là không thể.

Eclipse sẽ không phàn nàn vì nó "biết" cả hai lớp. Nếu bạn đang chạy mvn clean install trên dự án không hoạt động maven sẽ cung cấp cho bạn thông báo lỗi thích hợp.

Tôi nghĩ rằng sự xáo trộn này có thể xảy ra từ Kepler nhưng tôi không chắc chắn. Ít nhất nó vẫn còn hiện diện trong Luna :)

0

Vấn đề xung đột với tệp Jar. Xác minh danh sách các tệp jar bên trong thư mục lib tệp chiến tranh. Loại bỏ các tệp jar không cần thiết và xung đột. Sau đó triển khai sẽ thành công.

2

Chúng tôi thực sự chỉ chạy vào cùng một Ngoại lệ. Chúng tôi có một dự án mà chúng tôi hiện đang chuyển từ Java sang Kotlin. Trong dự án, tất cả các lớp kiểm tra được viết bằng Kotlin và do đó chúng tôi đặt tên cho thư mục src/test/kotlin. Chúng tôi cũng đã định cấu hình pom của mình theo phần 'Biên dịch Kotlin và nguồn Java' trong số Kotlin documentation.

Những gì chúng ta đã quên mất là định nghĩa thư mục thử nghiệm được mô tả trong 'chỉ Biên dịch Kotlin mã nguồn' phần:

<build> <testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory> </build>

Nó cũng đã được một chút bối rối rằng IntelliJ tự động biên soạn biên soạn tất cả các lớp học thử nghiệm theo yêu cầu và sau đó cũng xây dựng maven đã thành công. Chỉ sau khi xảy ra mvn clean test số TypeNotPresentExceptionProxy.

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