扫描maven插件中的java类路径
我试图做的是编写一些Maven插件,它扫描应用程序类,寻找特定接口的实现(也可能是带有注释的类),并根据结果生成一些代码。我已经成功地实现了在GenerateSources阶段运行的插件,并将源代码写入GeneratedSources目录 问题在于扫描带有注释的特定接口实现/类的类路径。 我使用库以以下方式扫描类:扫描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) {
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());
}