扫描maven插件中的java类路径

扫描maven插件中的java类路径,java,reflection,maven-2,classpath,maven-plugin,Java,Reflection,Maven 2,Classpath,Maven Plugin,我试图做的是编写一些Maven插件,它扫描应用程序类,寻找特定接口的实现(也可能是带有注释的类),并根据结果生成一些代码。我已经成功地实现了在GenerateSources阶段运行的插件,并将源代码写入GeneratedSources目录 问题在于扫描带有注释的特定接口实现/类的类路径。 我使用库以以下方式扫描类: private Set<Class< ? extends MyInterface >> scan(final String packageName) {

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

问题在于扫描带有注释的特定接口实现/类的类路径。 我使用库以以下方式扫描类:

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

让plugin config列出您想要生成代码的类可能会更快/更安全/更容易。然后你只要把它加入pom,你就完成了。无需反射,它肯定会加快插件的运行。

部分中定义了工件依赖项,在
部分中定义了插件依赖项


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

必需的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());
    }
final List dependencies=project.getDependencies();
对于(依赖项d:依赖项){
最终工件=
artifactFactory.createArtifactWithClassifier(d.getGroupId(),
d、 getArtifactId(),d.getVersion(),d.getType(),
d、 getClassifier());
试一试{
解析(工件、远程存储库、,
本地存储库);
}捕获(工件解析异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(artifactnotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
File artifactFile=artifact.getFile();
System.out.println(artifactFile.getAbsolutePath());
}
现在我们需要使用反射API扫描这些JAR,寻找合适的类。
在这一点上,我认为没有别的办法,因为我工作在<代码>生成源< /代码>下一阶段的相位和工件值尚未计算。因为我有很多类实现这个接口,并且在代码生成中考虑了所有这些类,所以我希望避免“静态”地键入它们。此外,这些类经常被添加/删除。您可以使用一个shell脚本来执行类似于grep all java files for“implements X”的操作,然后解析类名并构建它们的属性文件。然后让您的插件使用该属性文件来了解要为哪些类生成额外代码。如果您不在unix上,我想您可以在java中模拟grep,但速度会慢得多。根据您的建议,我添加了一个“插件依赖项”,现在它在打印出来的类路径下不可见(奇怪),但反射库检测到正确实现MyInterface的类!有没有办法在插件依赖项中包含工件依赖项?我希望避免复制粘贴整个部分:/@PiotrekDe也许您可以创建一个jar项目,其中包含所有必要的依赖项,您可以将这些依赖项用作POM和插件的依赖项。我不确定这是否值得付出痛苦。。。
 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());
    }