首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Maven Artifact.getFile()返回NULLin多模块项目

Maven Artifact.getFile()返回NULLin多模块项目
EN

Stack Overflow用户
提问于 2014-01-17 13:24:45
回答 1查看 956关注 0票数 0

我正在一个多模块项目中开发一个Maven插件,这是我以后想在同一个项目中使用的。这是该项目的布局:

代码语言:javascript
复制
sk:a:1.0:pom
   |
   --sk:a0:1.0:jar (the custom plugin)
   |
   --sk:a1:1.0:pom
   |  |
   |  --sk:a11:1.0:jar (a simple JAVA jar)
   |  |
   |  --sk:a12:1.0:jar (a simple JAVA jar)
   |
   sk:a2:1.0:pom

sk:a2:1.0依赖sk:a11:1.0和sk:a12:1.0,插件sk:a0:1.0:

代码语言:javascript
复制
<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>sk</groupId>
    <artifactId>a</artifactId>
    <version>1.0</version>
  </parent>
  <artifactId>a2</artifactId>
  <dependencies>
    <dependency>
      <groupId>sk</groupId>
      <artifactId>a11</artifactId>
      <version>1.0</version>
    </dependency>
    <dependency>
      <groupId>sk</groupId>
      <artifactId>a12</artifactId>
      <version>1.0</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>sk</groupId>
        <artifactId>a0</artifactId>
        <version>1.0</version>
        <executions>
        ...
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

来自sk:a0:1.0的自定义插件在其execute()中调用

代码语言:javascript
复制
Set<Artifact> artifacts = project.getDependencyArtifacts();

方法并对所有工件进行迭代,方法如下:

代码语言:javascript
复制
for(Iterator<Artifact> iterator = artifacts.iterator(); iterator.hasNext();)
{
   Artifact artifact = iterator.next();
   getLog().info((artifact.getFile() == null ? "artifact NULL" : "artifact OK"));
}

现在它显示“工件空”。在我的插件中,我需要能够读取工件的文件(比如java.io.File)。如何获得每个依赖项的文件?

谢谢,

SK

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-17 14:19:23

看起来问题在于,在执行mojo时,Maven尚未解决项目的所有依赖关系。

因此,例如,如果您的mojo运行在compile阶段,那么maven尚未解决test依赖项(那些在pom中使用测试标记的依赖项),对于所有这些test工件,还没有可用的文件。

您可以使用@requiresDependencyResolution <required-classpath> mojo标记来告诉maven解决所需的依赖关系。

documentation中,它说明了关于这个注释的如下内容:

将此Mojo标记为要求在指定的类路径中的依赖项在执行之前被解析。

因此,在Mojo中,您可以简单地在mojo的javadoc中添加以下注释:

代码语言:javascript
复制
/**
 * @goal your-goal
 * @requiresDependencyResolution test
 */
public class YourMojo extends AbstractMojo

这将告诉maven解决test类路径中包含的所有依赖项(基本上是所有依赖项)。因此,您的artifact.getFile()调用现在应该始终返回一个文件。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21187180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档