我在阅读Gradle文档时肯定遗漏了一些东西,因为这感觉就像一个常见的用例。基本上,我有两个项目 - MyApp和MyLib。 MyApp将使用MyLib.jar作为依赖项。反过来,MyLib有自己的依赖jar - 在构建时,MyLib的build.gradle指定了这些。最后,MyLib.jar将只包含非依赖.class文件,因此MyApp将需要在编译时下载MyLib.jar的依赖项。
如何告诉MyApp的build.gradle包含MyLib.jar然后下载MyLib的依赖jar而不在MyApp的build.gradle中指定这些jar?我觉得MyApp的build.gradle不应该知道传递依赖。我理解通常,build.gradle会查看远程Maven / Ivy仓库并读取相应的xml以下载相应的传递依赖项,但我不想将MyLib上传到Maven / Ivy存储库。理想情况下,我想将MyLib.jar与一些描述符文件一起分发 - 例如pom.xml - 列出传递依赖项,但不一定打包为"存储库"。请参阅下图,了解我所指的内容:
请注意,我计划分发MyLib.jar,而不是作为一组来源,而是作为一个封闭的jar,所以我不想设置多项目Gradle构建。此外,MyLib的依赖项可以在MavenCentral / etc存储库中找到,也可以在文件系统中与MyLib.jar一起存放。
答案 0 :(得分:2)
您可以将您的库发布到本地隔离的maven存储库,然后分发该存储库(例如,作为存档),然后可以由gradle或maven使用。
注意:我正在使用gradle 2.11。
要为您的库创建存储库,我们将使用gradle的maven-publish plugin。您的图书馆的build.gradle
将如下所示:
apply plugin: 'java'
apply plugin: 'maven-publish'
group = 'com.stackoverflow.phillip' // change it
version = '1.0' // whatever
dependencies {
// ...
}
publishing {
publications {
maven(MavenPublication) {
from components.java
// uncomment if you want to change artifact id (the default equals to project directory name)
//artifactId 'my-lib'
}
}
repositories {
maven {
url 'file:local-repo' // path is relative to project root
}
}
}
运行gradle publish
后,将创建一个目录local-repo
。该目录将是一个实际的maven存储库,只包含一个工件 - 您的库。当然,会有pom
描述您的库的依赖关系。
现在,您可以在另一个项目的build.gradle
中使用该存储库,例如:
repositories {
mavenCentral()
maven { url 'file:path/to/local-repo' } // path is relative to project root
}
dependencies {
compile 'com.stackoverflow.phillip:my-lib:1.0'
}