【问题标题】:Can a Maven plugin use build dependencies?Maven 插件可以使用构建依赖项吗?
【发布时间】:2019-12-19 10:44:36
【问题描述】:

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

【问题讨论】:

  • 请详细说明您要解决什么样的问题...最好是 POM 文件和类等示例。
  • 如果你得到反射错误意味着你没有走正确的路,因为与项目依赖分开的插件依赖之间存在差异......没有代码插件我无能为力这里..

标签: maven maven-plugin


【解决方案1】:

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

想法 1

您说您正在尝试使用Class.forName(...) 之类的内容加载生成的文件,但由于缺少依赖关系而失败。您能否分享一下您正在尝试对生成的文件做什么?也许值得用 ASM/JAVAASSIST 之类的东西来分析字节码。这些库通常不进行反射。

想法 2

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

总而言之,我不知道如何做你想做的事,坦率地说,这是有原因的:如果你的插件被设计为使用依赖 X 的一个版本并且应用程序本身使用相同的版本怎么办?版本 Y 的依赖。这最终会导致依赖冲突并使插件过于脆弱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多