3

私はこの注釈を書きました

    @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クライアントプロジェクトでテストし、すべて動作しましたが、既存のSpring(フルMavenビルド)プロジェクトで使用しようとすると動作しません...誰か助けてもらえますか?? TNX

4

2 に答える 2

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 で問題が発生する可能性があるため、まだ行っていない場合は、注釈プロセッサと注釈を別の Maven プロジェクトに抽出することをお勧めします。

于 2013-03-29T16:11:12.653 に答える
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>
于 2013-03-29T16:39:02.790 に答える