在maven插件中扫描java classpath

时间:2012-01-26 16:06:13

标签: 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);
}

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

  

/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());
}

3 个答案:

答案 0 :(得分:5)

必需的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阶段工作,下一阶段的工件值尚未计算。

答案 1 :(得分:1)

<dependencies>部分中定义了工件依赖项,在<plugin><dependencies>下定义了插件依赖项。

插件依赖项被添加到类路径中,而我不确定工件依赖项。您是否尝试在<plugin><dependencies>下添加插件依赖项?

答案 2 :(得分:-2)

可能更快/更安全/更容易让插件配置列出您想要基于的代码生成的类。然后你只需将它添加到pom就可以了。不需要反思,它肯定会加快插件的运行速度。