2012-04-10 10 views
13

の対象になりません、私は、Java 7に既存のコードベースを切り替えて、私はこの警告得続ける:警告:最後のラウンドで作成されたタイプのファイル「[ここに挿入クラスは]」注釈処理

warning: File for type '[Insert class here]' created in the last round 
    will not be subject to annotation processing. 

をクイック検索では、誰もこの警告に当たらないことがわかります。

それはどちらかのjavacコンパイラのソースに記載されていないです:OpenJDKの\ langtools \ SRC \共有\クラス\ comの日の\ツール\ \のjavac \処理\ JavacFiler.java

private JavaFileObject createSourceOrClassFile(boolean isSourceFile, String name) throws IOException { 
    checkNameAndExistence(name, isSourceFile); 
    Location loc = (isSourceFile ? SOURCE_OUTPUT : CLASS_OUTPUT); 
    JavaFileObject.Kind kind = (isSourceFile ? 
           JavaFileObject.Kind.SOURCE : 
           JavaFileObject.Kind.CLASS); 

    JavaFileObject fileObject = 
     fileManager.getJavaFileForOutput(loc, name, kind, null); 
    checkFileReopening(fileObject, true); 

    if (lastRound) // <-------------------------------TRIGGERS WARNING 
     log.warning("proc.file.create.last.round", name); 

    if (isSourceFile) 
     aggregateGeneratedSourceNames.add(name); 
    else 
     aggregateGeneratedClassNames.add(name); 
    openTypeNames.add(name); 

    return new FilerOutputJavaFileObject(name, fileObject); 
} 

から

何これはどういう意味ですか、この警告をクリアするためにどのような措置を取ることができますか?

ありがとうございました。

+1

この質問を読んだとき、最初はファイルを閉じることができなかったためだと思いました。これをテストするために、私はファイルを作成、書き込んだり閉じたりしなかったシンプルなプロセッサを作成しました。私はそれを走らせた。それは、同様だが異なる警告を与えた。 – emory

答えて

2

OpenJDK test caseプロセッサがprocessorOver()を使用して最後のラウンドで正確に新しいファイルを書き込むため、この警告が生成されました。

public boolean process(Set<? extends TypeElement> elems, RoundEnvironment renv) { 
     if (renv.processingOver()) { // Write only at last round 
      Filer filer = processingEnv.getFiler(); 
      Messager messager = processingEnv.getMessager(); 
      try { 
       JavaFileObject fo = filer.createSourceFile("Gen"); 
       Writer out = fo.openWriter(); 
       out.write("class Gen { }"); 
       out.close(); 
       messager.printMessage(Diagnostic.Kind.NOTE, "File 'Gen' created"); 
      } catch (IOException e) { 
       messager.printMessage(Diagnostic.Kind.ERROR, e.toString()); 
      } 
     } 
     return false; 
    } 

私はオリジナルのサンプルコードを少し修正しました。診断ノート "File Gen 'created"を追加し、 "*"マスクを "org.junit.runner.RunWith"に置き換え、戻り値を "true"に設定しました。我々は、ログからの私のカスタムノートを削除した場合、それはそのファイル「ゲン」を伝えるのは難しいです

Round 1: 
input files: {ProcFileCreateLastRound} 
annotations: [org.junit.runner.RunWith] 
last round: false 
Processor AnnoProc matches [org.junit.runner.RunWith] and returns true. 
Round 2: 
input files: {} 
annotations: [] 
last round: true 
Note: File 'Gen' created 
Compilation completed successfully with 1 warning 
0 errors 
1 warning 
Warning: File for type 'Gen' created in the last round will not be subject to annotation processing. 

実際には「ラウンド2」で作成された - 最後のラウンド:プロデュースコンパイラのログでした。したがって、基本的なアドバイスが適用されます:疑問がある場合 - ログを追加してください。 http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javac.html

「注釈処理」について

読み出し部と、コンパイラオプションでより多くの情報を取得しよう:
-XprintProcessorInfo をもこのページに関する有用な情報を少しです


プロセッサに処理を依頼された注釈に関する情報を出力します。
-XprintRounds初期および後続の注釈処理ラウンドに関する情報を印刷します。

+0

うん、それは私が質問(おそらく上記の情報に入れておくべきである)に尋ねる前にそれをした。それは有用な何かをもたらすようには見えなかった。最後のラウンドに入ったら、それ以上の入力ファイルがないと言い、警告を送信します。 – user1324792

+0

この警告を発する最小限のテストケースを分離できますか?おそらく上記のコンパイラオプションの助けを借りて。私はOpenJDKのソースで1つのテストケースを見つけました: "openjdk \ langtools \ test \ tools \ javac \ diags \ examples \ ProcFileCreateLastRound" [Googleコードの同じフォルダへのリンク](http://code.google.com/p/jsr308 -langtools/source/browse/test/tools/javac/diags/examples/ProcFileCreateLastRound /?name = jdk7-b135)を入力します。しかし、私はまだ警告がその場所に置かれた理由を理解できませんでした。 –

+0

私は元の答えに問題の原因を追加しました。それが他のものであれば、テストケースが表示されるまで私はもっと教えてくれませんでした。 –

0

私は、Java 7コンパイラオプションの周りつついて、私はこれを見つけた:

-implicit:{クラス、どれも} は、暗黙的にロードされたソースファイルのクラスファイルの生成を制御します。クラスファイルを自動的に生成するには、-implicit:classを使用します。クラスファイルの生成を抑止するには、-implicit:noneを使用します。このオプションを指定しない場合、デフォルトでは自動的にクラスファイルが生成されます。この場合、アノテーション処理を行うときに、そのようなクラスファイルが生成された場合、コンパイラは警告を発行します。このオプションが明示的に設定されている場合、警告は発行されません。 「型の検索」を参照してください。

Source

あなたは試してみて、暗黙的にクラスファイルを宣言することができます。

+0

ここでの問題は、アノテーション処理であり、クラス生成ではありません。この特定のコードベースは、クラス生成に依存します。明示的 - 暗示的:クラスが生成されないため、実際にはビルドが中断されません。 -implicit:classは警告に影響しません。 – user1324792

2

警告

警告:最後のラウンドで作成されたタイプのファイル「[ここに挿入クラスは]」

はあなたが注釈を実行していたことを意味注釈処理の対象になりません処理ツールが既に「最後のラウンドで」決定したにも関わらず、新しいクラスまたはソースファイルを作成する場合は、javax.annotation.processing.Filer実装(javax.annotation.processing.ProcessingEnvironmentを通じて提供されます)を使用します。

生成されたファイル自体に注釈プロセッサによって無視される注釈が含まれている可能性があるため(これはさらにラウンドを実行しないため)、問題(警告)がある可能性があります。

以上、この平均値とどのような手順は、私はこの警告をクリアするために取ることができない何あなたの質問

の最初の部分に答えるべき?

可能性はどのような手順を取るために(あなたが:-)はしていない、まだ自分でこれを考え出しましたか)?注釈プロセッサを確認してください:

1)annotaionプロセッサの最後のラウンドで、実際にfiler.createClassFile/filer.createSourceFileを使用する必要がありますか?通常は、

for (TypeElement annotation : annotations) { 
... 
} 

(メソッド処理中)のようなコードブロック内でファイラーオブジェクトを使用します。これにより、注釈プロセッサは最後のラウンドにはなりません(最後のラウンドは常に注釈のセットが空白です)。

2)実際に最後のラウンドで生成されたファイルを書き込むことを避けることができず、これらのファイルがソースファイルの場合は、注釈プロセッサを騙し、ファイラーオブジェクトのメソッド "createResource"を使用します(場所として "SOURCE_OUTPUT" )。

関連する問題