我有一个在流程类阶段运行的自定义Maven插件。它需要加载并反映构建生成的类文件,但这意味着在插件设置中显式重新声明所有依赖项。
插件能否继承构建依赖项?
更多背景信息:
有问题的插件处理由编译阶段生成的类,并以不同的语言(即,它基本上是Java编译器)吐出每个类的等效表示。
要达到这个目的,插件需要对流程类进行反思。只要插件与类本身具有相同的依赖项,此方法就可以正常工作。否则,当类或类方法加载并引用插件类路径中未包含的类型时,您会收到反射错误(请注意,由于某些第三方问题,仅使用ASM之类的方法检查类文件二进制文件是不够的。)
示例POM:
<project>
<!-- ...boilerplate... -->
<dependencies>
<dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>myplugins</groupId>
<artifactId>my-custom-plugin-that-processes-classes</artifactId>
<!-- To process classes generated by the main build, I need to
duplicate dependencies or I'll get reflection issues.
For example if a class in my code 'X' uses a static
SLF4J logger, I will get a clinit error when I load
X for processing unless I include this. -->
<dependencies>
<dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
答案 0 :(得分:1)
我想分享一些解决此问题的方法。
想法1
您说您正在尝试使用Class.forName(...)
之类的方式加载生成的文件,由于缺少依赖性,此操作失败。您能否分享您要对生成的文件进行的确切操作?也许值得使用ASM / JAVAASSIST之类的东西来分析字节码。这些库通常不进行反射。
想法2
另一种方法如下: 您可以从插件内访问pom.xml的所有依赖项。因此,您可以构建依赖项列表以使用(在内存中,直接从插件开始)启动其他反应器进程,或者创建实际jar位置的类路径,然后使用该类路径生成另一个Java进程。
总的来说,我不知道要做什么,坦率地说,这是有原因的:如果您的插件设计为使用依赖项X的一个版本,而应用程序本身使用的是相同版本,该怎么办?版本Y的依赖关系。这将导致依赖关系冲突,并使插件过于脆弱。