現在、実行時にプロジェクト成果物からクラスにアクセスし、注釈を取得する必要があるプラグインを作成しています。
/**
* Generate document for services
*
* @author Ali Irawan
*
* @goal doc
* @requiresDependencyResolution compile
* @phase generate-sources
*/
public class GeneratePlugin extends AbstractMojo {
/**
* project
*
* @parameter expression = "${project}";
*/
protected MavenProject project;
/**
* scanPackage
*
* @parameter
*/
private String scanPackage;
@Override
public void execute() throws MojoExecutionException {
getLog().info("My Maven Plugin Started");
getLog().info("Scanning package: " + scanPackage);
// PluginDescriptor pluginDescriptor = (PluginDescriptor) super.getPluginContext().get("pluginDescriptor");
try {
ClassLoader original = Thread.currentThread().getContextClassLoader();
Collection urls = new ArrayList();
Set<Artifact> artifacts = project.getArtifacts();
Iterator<Artifact> iterator = artifacts.iterator();
while(iterator.hasNext()){
Artifact entry = iterator.next();
urls.add(entry.getFile().toURI().toURL());
}
urls.add(new File(project.getBuild().getOutputDirectory()).toURI().toURL());
Thread.currentThread().setContextClassLoader(new URLClassLoader((URL[]) urls.toArray(new URL[urls.size()]),original));
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("com.goijo.mona.services.AuthenticationService");
getLog().info("Class name: " + clazz.getName());
// This always return 0, don't know why ?
getLog().info("Annotation : " + clazz.newInstance().getClass().getAnnotations().length);
// Restore class loader
Thread.currentThread().setContextClassLoader(original);
getLog().info("MyMaven Plugin Stopped");
} catch (Exception e) {
e.printStackTrace();
getLog().error(e.getMessage());
}
}
}
次に、このプラグインを他のプロジェクトで使用します
<plugin>
<groupId>com.my</groupId>
<artifactId>my-maven-plugin</artifactId>
<version>1.0.0-SNAPSHOT</version>
<configuration>
<scanPackage>com.my.services</scanPackage>
</configuration>
</plugin>
を使用してmvnゴールを実行しようとすると
mvn my:doc
この出力を生成します
[INFO] Scanning package: com.goijo.mona.services
[INFO] Class name: com.my.services.AuthenticationService
[INFO] Annotation : 0
私のクラス com.my.services.AuthenticationService にはすでに注釈が付けられているため、注釈が常に 0 である理由を誰でも助けることができます
@InfoIn( ... )
public class AuthenticationService {
}
そして、アノテーションはすでに RetentionPolicy に設定されています
@Target(value=ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface InfoIn {
public Info[] value();
}