omn*_*nom 11 java reflection maven-2 classpath maven-plugin
我要做的是编写一些Maven插件,它扫描应用程序类,寻找特定接口的实现(它可能是带有一些注释的类),并根据结果生成一些代码.我已经成功实现了在generate-sources阶段运行的插件,并将源代码编写到generated-sources目录.
问题在于使用某些注释扫描具有特定接口实现/类的类路径.我使用Reflections库以下列方式扫描类:
private Set<Class< ? extends MyInterface >> scan(final String packageName) {
final Reflections reflections = new Reflections(packageName);
return reflections.getSubTypesOf(MyInterface.class);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,此方法返回空集.当我在类扩展中打印我的类路径时org.apache.maven.plugin.AbstractMojo(我正在使用Reflection),我得到以下结果:
/home/pd5108/apache-maven-2.2.1/boot/classworlds-1.1.jar
我希望使用Reflections找到的类存在于dependend JAR以及配置插件的模块中.看看打印出来的类路径,似乎此时(生成源阶段)maven中定义的依赖关系在类路径上都不可用 - 可能它们会在下一阶段添加.真的吗?我还可以使用其他方法吗?
以下是打印类路径的方法:
URL[] urls = ((URLClassLoader)sysClassLoader).getURLs();
for(int i=0; i< urls.length; i++) {
System.out.println(urls[i].getFile());
}
Run Code Online (Sandbox Code Playgroud)
必需的MOJO类字段:
/**
* The project currently being built.
*
* @parameter expression="${project}"
* @readonly
* @required
*/
private MavenProject project;
/** @parameter expression="${localRepository}" */
protected ArtifactRepository m_localRepository;
/**@parameter default-value="${localRepository}" */
private org.apache.maven.artifact.repository.ArtifactRepository
localRepository;
/** @parameter default-value="${project.remoteArtifactRepositories}" */
private java.util.List remoteRepositories;
/** @component */
private org.apache.maven.artifact.factory.ArtifactFactory artifactFactory;
/** @component */
private org.apache.maven.artifact.resolver.ArtifactResolver resolver;
Run Code Online (Sandbox Code Playgroud)
解析所有依赖项JAR:
final List<Dependency> dependencies = project.getDependencies();
for (Dependency d : dependencies) {
final Artifact artifact =
artifactFactory.createArtifactWithClassifier(d.getGroupId(),
d.getArtifactId(), d.getVersion(), d.getType(),
d.getClassifier());
try {
resolver.resolve(artifact, remoteRepositories,
localRepository );
} catch (ArtifactResolutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ArtifactNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
File artifactFile = artifact.getFile();
System.out.println(artifactFile.getAbsolutePath());
}
Run Code Online (Sandbox Code Playgroud)
现在我们需要使用反射API扫描这些JAR,以寻找合适的类.在这一点上,我认为没有其他办法,因为我在generate-sources阶段工作,并且尚未计算下一阶段的工件值.
| 归档时间: |
|
| 查看次数: |
4262 次 |
| 最近记录: |