我写了这个注释
@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
答案 0 :(得分: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项目。
答案 1 :(得分: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>