Maven插件可以使用构建依赖项吗?

时间:2019-12-19 10:44:36

标签: maven maven-plugin

我有一个在流程类阶段运行的自定义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>

1 个答案:

答案 0 :(得分:1)

我想分享一些解决此问题的方法。

想法1

您说您正在尝试使用Class.forName(...)之类的方式加载生成的文件,由于缺少依赖性,此操作失败。您能否分享您要对生成的文件进行的确切操作?也许值得使用ASM / JAVAASSIST之类的东西来分析字节码。这些库通常不进行反射。

想法2

另一种方法如下: 您可以从插件内访问pom.xml的所有依赖项。因此,您可以构建依赖项列表以使用(在内存中,直接从插件开始)启动其他反应器进程,或者创建实际jar位置的类路径,然后使用该类路径生成另一个Java进程。

总的来说,我不知道要做什么,坦率地说,这是有原因的:如果您的插件设计为使用依赖项X的一个版本,而应用程序本身使用的是相同版本,该怎么办?版本Y的依赖关系。这将导致依赖关系冲突,并使插件过于脆弱。