java - 在 maven 插件中扫描 java 类路径

标签 java reflection maven-2 classpath maven-plugin

我想做的是编写一些 Maven 插件,它扫描应用程序类以寻找特定接口(interface)的实现(它也可能是带有一些注释的类)并根据结果生成一些代码。我已成功实现在生成源阶段运行的插件并将源代码写入生成源目录。

问题在于使用某些注释扫描特定接口(interface)实现/类的类路径。 我正在使用 Reflections库以下列方式扫描类:

private Set<Class< ? extends MyInterface >> scan(final String packageName) {
  final Reflections reflections = new Reflections(packageName);  
  return reflections.getSubTypesOf(MyInterface.class);
}

不幸的是,此方法返回空集。当我在扩展 org.apache.maven.plugin.AbstractMojo 的类中打印我的类路径时(与我在其中使用的相同 Reflections )我得到以下结果:

/home/pd5108/apache-maven-2.2.1/boot/classworlds-1.1.jar

我想使用 Reflections 查找的类存在于依赖 JAR 以及配置插件的模块中。查看打印出来的类路径,似乎此时(生成源阶段)maven 中定义的依赖项在类路径中都不可用 - 可能它们会在下一阶段添加。真的吗?我可以使用任何其他方法吗?

这是类路径的打印方式:

URL[] urls = ((URLClassLoader)sysClassLoader).getURLs();

for(int i=0; i< urls.length; i++) {
  System.out.println(urls[i].getFile());
}

最佳答案

必需的 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;

所有依赖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());
    }

现在我们需要使用反射 API 来扫描这些 JAR,以寻找合适的类。 在这一点上,我认为没有其他办法,因为我在 generate-sources 阶段工作,下一阶段的工件值尚未计算。

关于java - 在 maven 插件中扫描 java 类路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9021099/

相关文章:

java - 从另一个类调用 'requestWindowFeature'

c# - 如何动态评估 C# 代码?

java - 如何为 Maven 安装的 jar 编写 POM 文件?

java - Java中的字符串...参数

java - 我如何编写一个每个人都看到的公共(public)计时器?

java - 如何为没有源代码的类生成 JavaDoc 文档?

php - 类反射 : Missing Properties

java - 是否有替代语法(或脚本语言)来简化 Maven pom 文件?

java - 如何将源上传到本地 Maven 存储库

maven-2 - 用于解决 "Maven doesn' t 适用于我的问题的算法