web-dev-qa-db-ja.com

web-earをデプロイする際のsun.reflect.annotation.TypeNotPresentExceptionProxyエラー

Ejd-ear、web-earをglassfishサーバーにデプロイしようとしています。 Webプロジェクトにejbクライアント依存関係を追加しました。 ejb-earは正常にデプロイされます。しかし、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)

何か案は?

38
Oops

最善の方法は、Java.lang.TypeNotPresentExceptionのコンストラクターにブレークポイントを置き、Throwable型の2番目の引数をチェックして根本原因を知ることだと思います

53

最近、JUnitでも同じ例外が発生しました。状況は次のとおりでした。

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

問題は、JVMがクラスパスの依存関係が欠落していたため(別のJARファイルが欠落していたため)MyTestClassを処理できなかったことです。しかし、例外はどのクラスが欠落しているかに関する情報を提供しませんでした。

解決策は、一時的に MySuiteに静的初期化ブロックを追加し、MyTestClassをインスタンス化することでした。

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

これにより、JVMは最初に静的ブロックを実行し、MyTestClassのインスタンス化を試み、欠落しているクラスを見つけて、適切な例外を報告します。その後、不足している依存関係を追加して、一時的な静的ブロックを削除できます。

23
tfager

実際、同じ例外に遭遇しました。現在、Java=からKotlinに転送するプロジェクトがあります。このプロジェクトでは、すべてのテストクラスはKotlinで記述されているため、フォルダーにsrc/test/kotlinという名前を付けました。 Kotlinドキュメント の「KotlinおよびJava sources)のコンパイル」セクションに従ってください。

忘れていたのは、「Kotlinのみのソースコードのコンパイル」セクションで説明したテストディレクトリの定義です。

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

また、IntelliJ自動コンパイルがすべてのテストクラスを必要に応じてコンパイルし、その後mavenビルドが成功したことも少し混乱しています。 mvn clean testの後にのみTypeNotPresentExceptionProxyが発生しました。

2
Stefan Tomm

解決:

  1. Glassfishサーバーにデバッグで接続します
  2. 行にブレークポイントを入れます
    • Java.lang.Class.initAnnotationsIfNecessary(Class.Java:3070)
  3. アプリケーションをデプロイします。

展開中、このブレークポイントで数回停止します。 this referenceを参照し、展開エラーが発生する前の最後を覚えておいてください。最後の「this」クラスの注釈をチェックするよりも。 AnnotationParser.parseClassArrayメソッドにブレークポイントを配置することもできますが、これはコンパイルされたコードであり、メソッドのブレークポイントは非常に遅いです。 (メソッドブレークポイントの場合、私はついにアプリケーションをデポできませんでした)。

1
Cherry

これは、次の状況でも発生する可能性があります。

プロジェクトAは、EclipseのMavenプロジェクトであるライブラリです。 org.exmaple.Fooディレクトリにあるsrc/test/Java/というクラスがあります。

エラーが発生したプロジェクトBで、このクラスにアクセスしようとしています。しかし、これは不可能です。

Eclipseは、両方のクラスを「知っている」ため文句を言いません。動作しないプロジェクトでmvn clean installを実行している場合、mavenは適切なエラーメッセージを表示します。

このエラーはケプラー以来発生する可能性があると思いますが、わかりません。少なくともそれはルナにまだ存在しています:)

1
Zarathustra

この問題は、Jarファイルと競合しています。 warファイルのlibフォルダー内のjarファイルのリストを確認します。不要で競合するjarファイルを削除します。その後、展開が成功します。

0
surender reddy

TypeNotPresentExceptionProxyエラーは特定の依存関係に固有のものではなく、各プロジェクトのクラスパスに依存します。したがって、Maven依存関係ツリーを確認してください。たとえば、JUnitに2つの依存関係があるため、クラスパスにJUnitアノテーションの2つのバージョンがあったときに、このエラーに一度陥りました。

クラス「Java.lang.Class」のメソッドのいくつかにブレークポイントを配置できます。

例えば:

Java.lang.Class.getAnnotation 
Java.lang.Class.getAnnotations 

その後、どのクラスが問題の原因かを見つけることができます...クラス内で注釈を検索し、クラスパスのあいまいさを確認します。

0
Ariel Carrera