2013-03-29 106 views
3

我寫THI註釋定義註解處理器

@Retention(RetentionPolicy.SOURCE) 
public @interface Encrypt { 

} 

和它的處理器...

@SupportedAnnotationTypes("it.trecube.annotation.Encrypt") 
@SupportedSourceVersion(SourceVersion.RELEASE_7) 
public class EncryptProcessor extends AbstractProcessor{ 

    public EncryptProcessor(){ 
     super(); 
    } 


    @Override 
    public boolean process(Set<? extends TypeElement> annotations, 
      RoundEnvironment roundEnv) { 
     String className = null; 
     String packageName = null; 
     String fqClassName = null; 
     for (Element elem : roundEnv.getElementsAnnotatedWith(Encrypt.class)) { 
      if (elem.getKind() == ElementKind.CLASS) { 
       //    Encrypt encrypt = elem.getAnnotation(Encrypt.class); 
       //    String message = "annotation found in " + elem.getSimpleName(); 
       //    processingEnv.getMessager().printMessage(Kind.NOTE, message); 
       TypeElement classElement = (TypeElement) elem; 
       PackageElement packageElement = (PackageElement) classElement.getEnclosingElement(); 

       processingEnv.getMessager().printMessage(
         Diagnostic.Kind.NOTE, 
         "annotated class: @Encrypt" , elem); 

       className = classElement.getSimpleName().toString(); 
       packageName = packageElement.getQualifiedName().toString(); 
       fqClassName = classElement.getQualifiedName().toString(); 

       if (fqClassName != null) { 
        processingEnv.getMessager().printMessage(
          Diagnostic.Kind.NOTE, 
          "fqClassName: "+fqClassName , elem); 
        Properties props = new Properties(); 
        URL url = this.getClass().getClassLoader().getResource("velocity.properties"); 
        try { 
         props.load(url.openStream()); 
        } catch (IOException e) { 
         processingEnv.getMessager().printMessage(
           Diagnostic.Kind.ERROR, 
           "annotated class: " + classElement.getQualifiedName()+"->\n"+ 
             e.getMessage(), elem); 
         e.printStackTrace(); 
         return true; 
        } 
        VelocityEngine ve = new VelocityEngine(props); 
        ve.init(); 

        VelocityContext vc = new VelocityContext(); 

        vc.put("className", className); 
        vc.put("packageName", packageName); 


        Template vt = ve.getTemplate("encrypt.vm"); 
        File file = new File("src/main/java/"+fqClassName.replace(".", "/")+"_Encrypt.aj"); 
        try { 
        BufferedWriter bw = new BufferedWriter(new FileWriter(file)); 

         processingEnv.getMessager().printMessage(
           Diagnostic.Kind.NOTE, 
           "creating source file: " + file.getAbsolutePath()); 


         processingEnv.getMessager().printMessage(
           Diagnostic.Kind.NOTE, 
           "applying velocity template: " + vt.getName()); 

         vt.merge(vc, bw); 

         bw.close(); 
        } catch (IOException e) { 
         processingEnv.getMessager().printMessage(
           Diagnostic.Kind.ERROR, 
           "applying velocity error: " + vt.getName()+"->\n"+e.getMessage()); 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 
     return true; // no further processing of this annotation type 
    } 

我測試過的所有成行家客戶項目和所有的工作,但是當我嘗試使用它到現有的春天(完整的maven構建)項目不工作... 有人可以幫助我嗎? Tnx

+1

說,這是行不通的,當你能更具體?你面臨哪個問題?你能報告堆棧跟蹤嗎? – Fabio

回答

1

解決增加這個...

  <plugin> 
       <groupId>org.bsc.maven</groupId> 
       <artifactId>maven-processor-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>process</id> 
         <goals> 
          <goal>process</goal> 
         </goals> 
         <phase>generate-sources</phase> 
        </execution> 
       </executions> 
      </plugin> 
2

您是否在您有註釋處理器的項目中創建了META-INF/services/javax.annotation.processing.Processor文件?該文件應包含處理器的完全限定名稱。此外,與Maven,指定通過配置maven-compiler-plugin在構建要使用的註釋處理器:

<plugin> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <configuration> 
     <annotationProcessors> 
      <annotationProcessor>com.mycompany.MyAnnotationProcessor</annotationProcessor> 
     </annotationProcessors> 
    </configuration> 
</plugin> 

另外,具有在同一個項目註解處理器爲你使用它可能會導致一些問題的行家,所以如果你還沒有做到這一點,我建議你將你的註解處理器和註解提取到一個單獨的maven項目中。

+0

我認爲問題是maven ...「mvn clean compile」命令的輸出說 ... [INFO] Nothing to compile - all classes are up ... 所以沒有做任何事 在測試客戶端中,所有的工作只在編譯時發生...... – user1066888

+0

如果'mvn clean compile'says'Nothing to compile',那麼你的maven項目肯定有問題。你確定你的文件夾結構是正確的嗎?如果'mvn compile'根本找不到任何源文件,這隻會發生在我身上。 – NilsH

+0

p.s.註釋和批註。處理器在單獨的項目中 – user1066888