2011-07-01 59 views
27

當我嘗試在glassfish服務器上部署ejd-ear,web-ear時。 我在web項目中添加了ejb客戶端依賴項。 ejb-ear已成功部署。但是當我嘗試部署web-ear時,它會引發異常。sun.reflect.annotation.TypeNotPresentException當部署web-ear時出現代理錯誤

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) 

任何想法?

回答

21

最近與JUnit有相同的異常。 的情況是這樣的:

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

問題是,JVM無法處理MyTestClass,因爲它是在classpath中缺少的依賴關係(另一個JAR文件失蹤)。但是這個例外沒有提供哪類缺失的信息。

的解決辦法是暫時添加靜態初始化塊MySuite,實例化MyTestClass:

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

這將導致JVM先運行靜態塊,嘗試實例MyTestClass,找出缺少類報告一個適當的例外。然後,您可以添加缺少的依賴項並刪除臨時靜態塊。

1

解決方案:

  1. 連接與調試到Gla​​ssFish服務器
  2. 認沽破發點成線
    • java.lang.Class.initAnnotationsIfNecessary(Class.java:3070)
  3. 部署您的應用程序。

在部署過程中,您將在此中斷點停止多次。請參閱參考並記住上次部署前發生的錯誤。除了檢查最後的「這個」類中的註釋。 你也可以把斷點放到AnnotationParser.parseClassArray方法中,但是它的編譯代碼和斷點上的方法是很慢。 (在我的方法中斷點,我終於無法申請)。

33

我認爲最好的辦法是把一個破發點中java.lang.TypeNotPresentException的構造和檢查Throwable類型的第二個參數就知道根本原因

+0

在我的情況下,根本原因是:java.lang.ClassNotFoundException:com.github.springtestdbunit.DbUnitTestExecutionListener –

+0

謝謝你,實驗室!我在TypeNotPresentExceptionProxy中設置了excpetion,並得到了ClassNotFoundException,所以我發現哪個類丟失了。 – rwitzel

+0

您好,如何使用Eclipse調試器在編譯的TypeNotPresentExceptionProxy類中放置該斷點? (使用WAS Liberty Prifle應用程序服務器)謝謝! – icordoba

1

這也可能發生在以下情況:

項目A是一些圖書館,它是日食中的maven項目。 它有一個名爲org.exmaple.Foo的類,位於src/test/java/目錄中。

在您的項目中出現錯誤的位置您嘗試訪問此類。但這是不可能的。

Eclipse不會抱怨,因爲它「知道」這兩個類。 如果你正在運行mvn clean install的項目不起作用,maven會給你一個正確的錯誤信息。

我覺得這個錯誤可能發生自開普勒,但我不知道。至少它仍然存在於Luna :)

0

該問題與Jar文件衝突。驗證war文件lib文件夾內的jar文件列表。刪除不必要和衝突的jar文件。然後部署將會成功。

2

我們剛剛遇到了同樣的異常。我們目前有一個項目從Java轉移到Kotlin。在這個項目中,所有的測試類都是用Kotlin編寫的,因此我們將這個文件夾命名爲src/test/kotlin。我們還根據Kotlin documentation中的「編譯Kotlin和Java源代碼」部分配置了我們的pom。

我們已經忘記了是在「只編譯科特林源代碼」部分中描述的測試目錄定義:

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

它也一直比較混亂的的IntelliJ自動彙編編譯所有的測試類根據需要,之後Maven構建也成功了。只有在發生 mvn clean test之後。

相關問題