【问题标题】:Use class from built jar in custom gradle task在自定义 gradle 任务中使用内置 jar 中的类
【发布时间】:2019-06-23 07:44:50
【问题描述】:

我的 gradle 项目需要为剩余的构建过程生成代码。应该生成代码的工具是一个 jar 文件,它也内置在同一个 gradle 项目中。

我想编写一个处理代码生成步骤的自定义任务。这个任务显然必须依赖于正在构建的 jar 文件,这很简单。

现在我想在自定义任务中访问我的 jar 文件中的类,我只是不知道如何告诉 gradle Parser 类可从构建的 jar 文件中获得。请参阅以下示例,了解我想在我的任务中执行的操作:

task generateCode(dependsOn: ':dmlproject:build') {

    doLast {
        DmlParser parser = new DmlParser();
        parser.doStuff();
    }  
}

Gradle 不知道 DmlParser 类可以在 dmlproject jar 文件中找到,我如何告诉 gradle 在哪里可以找到它?这可能吗?

我知道在我至少构建一次 dmlproject 之前这是否根本不起作用,因为没有 jar 文件也没有 DmlParser 类。但是在第一次构建之后,应该可以使事情正常进行,不是吗?

编辑: 即使我不能引用构建在同一个项目中的 jar 文件中的类,我也想知道如何访问磁盘上的 jar 文件中的类,或者从 maven 存储库下载的类。

【问题讨论】:

    标签: gradle bootstrapping


    【解决方案1】:

    原答案

    如果您需要编写复杂的构建逻辑来增强您的构建,您不能在主构建中执行此操作。这样做的原因是 Gradle 需要在执行开始之前配置项目。所以 Gradle 需要知道 configuration timeDmlParser 类,但您的构建会在执行时创建它。

    解决此问题的方法是引入buildSrc build。这是项目目录中的一个单独构建,您可以使用它来实现其他复杂的构建逻辑。只需在项目目录中创建一个名为buildSrc 的新目录,然后将创建DmlParser 的逻辑移到那里。这样您就可以在主构建中使用DmlParser

    编辑

    如果你想添加一个已经被构建的jar,你需要使用buildscript block来将jar添加到构建脚本的类路径中:

    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'
        }
    }
    

    然后就可以引用已经添加到classpath中的jar中定义的类了。

    【讨论】:

    • 感谢您的回答,我不知道 buildSrc 概念。但是我仍然想知道如何引用 jar 文件中的类(假设 jar 文件已经从外部存储库构建/下载)
    • 我已经扩展了我的答案以涵盖这一点。
    • 非常感谢,我当时走在正确的轨道上,但我尝试将其添加为正常的项目依赖项,这当然不起作用。那么我将不得不将解析器视为外部组件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 2021-12-21
    相关资源
    最近更新 更多