以 Maven 项目作为 Gradle 源依赖项的 Git 存储库

Ros*_*sny 6 gradle gradle-plugin

本文介绍了 Gradle 4.10+ 的一个有趣功能,称为源依赖项:

https://blog.gradle.org/introducing-source-dependency

它允许使用 Git(例如 GitHub)源代码存储库来构建依赖项。然而,它似乎只支持 Gradle 项目作为源依赖项。是否也可以使用 Maven 项目,如果可以,请展示一个示例。

build.gradle当我尝试在 Maven 项目中使用此功能时,Gradle 尝试在那里找到该文件(我在使用该--info选项运行 Gradle 时看到它)并失败,并显示如下错误消息:

Git repository at https://github.com/something/something.git did not contain a project publishing the specified dependency.

Bjø*_*ter 10

简短的回答

\n

... 没有”。

\n

在幕后,源依赖项是复合构建。这些需要是 Gradle 项目,因为外部项目与主项目合并。

\n

长答案

\n

...是:“是的,但很难”。

\n

实际上,您链接到的同一篇博客文章中提到了它(强调我的):

\n
\n

源依赖性使这些用例更易于实现。Gradle 负责自动检查依赖项的正确版本,确保在需要时构建二进制文件。它在构建运行的任何地方都会执行此操作。签出的项目\xe2\x80\x99甚至不需要现有的 Gradle 构建。 此示例显示 Gradle 构建通过插件注入 Gradle 构建来消耗两个没有构建系统的源依赖项。注入的配置可以执行常规 Gradle 插件可以执行的任何操作,例如包装现有的 CMake 或 Maven 构建。

\n
\n

因为听起来在 Maven 和 Gradle 项目之间建立源依赖关系的桥梁并不是世界上最重要的事情,所以我尝试了一下。除了传递依赖之外,我让它正常工作。您基本上需要执行上面链接的示例中所示的操作,但您不是构建本机库,而是调用 Maven(例如,使用 Gradle 的 Maven 插件)。

\n

然而,我最终得到的脚本足够复杂,我建议您自己构建 Maven 项目,将其部署到本地 Maven 存储库,然后将该存储库添加到 Gradle 项目。

\n

<编辑>

\n

答案太棒了

\n

好的,下面是实际操作方法。该功能的文档很少,并且似乎主要针对本机项目(例如 C++ 或 Swift)。

\n

根项目设置

\n

以应用了 Java 插件的普通 Gradle 项目为例。我在一个空文件夹中执行了“gradle init”。假设在此项目中,您依赖于一个名为 `` 的库,稍后您希望将其包含为源依赖项:

\n
// [root]/build.gradle\ndependencies {\n    implementation \'org.example:my-maven-project:1.1\'\n}\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,此处定义的版本号必须与存储库中的 Git 标记匹配。这是将要签出的代码修订版。

\n

然后在设置文件中,我们为其定义一个源依赖关系映射:

\n
// [root]/settings.gradle\nrootProject.name = \'my-project\'\n\nincludeBuild(\'plugins\') // [1]\n\nsourceControl {\n    gitRepository("https://github.com/jitpack/maven-simple") { // [2]\n        producesModule("org.example:my-maven-project") // [3]\n        plugins {\n            id "external-maven-build" // [4]\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • [1]:这包括一个名为的 Gradle 项目plugins,稍后将对此进行解释。
  • \n
  • [2]:这只是我随便找的一个Maven项目,比较简单。替换为您拥有的实际存储库。
  • \n
  • [3]:这是我们为其定义源构建的 Maven 模块的名称(与依赖项块中的相同)
  • \n
  • [4]:这里定义了一个自定义设置插件,名为项目external-maven-build中定义的plugins,稍后会解释。
  • \n
\n

插件项目结构

\n

在根项目中,我们定义了一个新的 Gradle 项目。同样,您可以将gradle init其初始化为 Groovy(或您喜欢的任何项目)。删除所有生成的源和测试。

\n
// [root]/plugins/settings.gradle\n// Empty, but used to mark this as a stand-alone project (and not part of a multi-build)\n
Run Code Online (Sandbox Code Playgroud)\n
// [root]/plugins/build.gradle\nplugins {\n    id \'groovy\'\n    id \'java-gradle-plugin\' // [1]\n}\n\nrepositories {\n    gradlePluginPortal() // [2]\n}\n\ndependencies {\n    implementation "gradle.plugin.com.github.dkorotych.gradle.maven.exec:gradle-maven-exec-plugin:2.2.1" // [3]\n}\n\ngradlePlugin {\n    plugins {\n        "external-maven-build" { // [4]\n            id = "external-maven-build"\n            implementationClass = "org.example.ExternalMavenBuilder"\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • [1]:在这个项目中,我们定义了一个新的 Gradle 插件。这是执行此操作的标准方法。
  • \n
  • [2]:为了调用 Maven,我使用另一个第 3 方插件,因此我们需要添加 Gradle 插件门户作为存储库。
  • \n
  • [3]:这是用于调用Maven的插件。我对它不太熟悉,也不知道它的生产准备情况如何。我注意到的一件事是它不会对输入和输出进行建模,因此没有对最新检查的内置支持。但这可以追溯添加。
  • \n
  • [4]:定义自定义插件。请注意,它的 ID 与根项目中的设置文件中使用的 ID 相同。
  • \n
\n

插件实现类

\n

现在有趣的事情来了。我选择在 Groovy 中执行此操作,但也可以在任何受支持的 JVM 语言中执行此操作。

\n

该插件结构与任何其他 Gradle 插件一样。需要注意的一件事是,它是一个设置插件,而您通常使用项目插件。这是必需的,因为我们基本上是在运行时定义 Gradle 项目,这需要作为初始化阶段的一部分完成。

\n
// [root]/plugins/src/main/groovy/org/example/ExternalMavenBuilder.groovy\npackage org.example\n\nimport com.github.dkorotych.gradle.maven.exec.MavenExec\nimport org.gradle.api.Plugin\nimport org.gradle.api.artifacts.ConfigurablePublishArtifact\nimport org.gradle.api.initialization.Settings\n\nclass ExternalMavenBuilder implements Plugin<Settings> {\n    void apply(Settings settings) {\n        settings.with {\n            rootProject.name = \'my-maven-project\' // [1]\n            gradle.rootProject {\n                group = "org.example" //[2]\n                pluginManager.apply("base") // [3]\n                pluginManager.apply("com.github.dkorotych.gradle-maven-exec") // [4]\n\n                def mavenBuild = tasks.register("mavenBuild", MavenExec) {\n                    goals(\'clean\', \'package\') // [5]\n                }\n\n                artifacts.add("default", file("$projectDir/target/maven-simple-0.2-SNAPSHOT.jar")) { ConfigurablePublishArtifact a ->\n                    a.builtBy(mavenBuild) // [6]\n                }\n            }\n        }\n    }\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • [1]: 必须与 Maven 模块名称匹配
  • \n
  • [2]:必须匹配Maven模块组
  • \n
  • [3]:定义“构建”和“清理”等任务
  • \n
  • [4]: 使调用Maven更容易的第3方插件
  • \n
  • [5]:有关选项,请参见https://github.com/dkorotych/gradle-maven-exec-plugin
  • \n
  • [6]:将 Maven 输出添加为“默认”配置中的工件
  • \n
\n

请注意,它不会对传递依赖项进行建模,并且由于缺少输入和输出,它永远不会是最新的。

\n

这是我玩了几个小时所得到的结果。我认为它可以推广为发布到 Gradle 门户的通用插件。但我认为我的任务已经太多了。如果有人想从这里继续,我会祝福你:)

\n