Gradle项目依赖项不引用SNAPSHOT jar

时间:2015-06-09 09:31:29

标签: jar gradle dependencies

我正在尝试在多项目Gradle构建中创建一个胖jar文件,如下所示:

root
  +-- project1
  +-- project2

project1提供了基本功能,然后project2使用它来创建可执行jar。可执行JAR需要包含依赖项中的所有代码,以便它可以独立运行。

对于外部依赖项,这很好用。在project2中,我创建了一个新配置:

apply plugin: 'maven'
apply plugin: 'java'

configurations {
  // configuration for JARs that need to be included in the final packaging
  includeInJar
}

然后添加依赖项:

dependencies {
  includeInJar 'com.fasterxml.jackson.core:jackson-databind:2.2.3'
  ...

  configurations.compile.extendsFrom(configurations.includeInJar)
}

然后包装看起来像这样:

jar {
  manifest {
    attributes "Main-Class": "com.acme.project1.MyTest"
  }
  // import all dependencies into the Jar so that it can be run easily
  from {
    configurations.includeInJar.collect {
      it.isDirectory() ? it : zipTree(it)
    }
  }
}

使用外部依赖项中的所有文件正确构建jar。问题伴随着对project1的项目依赖:

includeInJar project(':project1')

当存在这种情况时,我在尝试组装JAR时遇到错误,因为它不能找到project1 project1-0.4.0.jar目录中的jar(例如build/libs)存在。消息是正确的,因为project1构建了一个SNAPSHOT jar(例如project1-0.4.0-SNAPSHOT.jar)。

问题是,为什么在项目构建SNAPSHOT jar时配置会引用非SNAPSHOT jar?我能改变什么才能找到正确的罐子?

2 个答案:

答案 0 :(得分:0)

作为评论:

在我看来,胖子并不是一个很棒的模式。也许Gradle application plugin符合您的需求?

答案 1 :(得分:0)

我找到了自己问题的答案。

问题是我们在项目级别有一些额外的脚本,在配置阶段结束时显然会对版本进行更改。

组装胖罐配置时,使用'普通'版本。然后在构建jar之前将其更改为-SNAPSHOT版本。

from { ... }代码包装到doFirst { ... }中,将其包装到构建阶段就足以解决问题了,尽管真正的修复显然是为了避免在第一个代码中间更改版本的地方。