在自定义gradle任务中使用内置jar中的类

时间:2019-06-23 07:44:50

标签: gradle bootstrapping

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

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

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

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

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

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

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

编辑: 即使我无法引用同一项目中内置的jar文件中的类,我也想知道如何访问磁盘上的jar文件或从maven存储库下载的jar文件中的类。

1 个答案:

答案 0 :(得分: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'
    }
}

然后,您可以引用已添加到类路径中的jar中定义的类。