簡體   English   中英

在maven插件中掃描java classpath

[英]scanning java classpath in the 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());
}

必需的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階段工作,並且尚未計算下一階段的工件值。

<dependencies>部分中定義了工件依賴項,在<plugin><dependencies>下定義了<plugin><dependencies>

插件依賴項被添加到類路徑中,而我不確定工件依賴項。 您是否嘗試在<plugin><dependencies>下添加插件依賴項?

可能更快/更安全/更容易讓插件配置列出您想要基於的代碼生成的類。 然后你只需將它添加到pom就可以了。 不需要反思,它肯定會加快插件的運行速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM