我的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文件中的类。
答案 0 :(得分:1)
如果需要编写复杂的构建逻辑以增强构建,则不能在主构建中执行此操作。这是因为Gradle需要在执行开始之前配置项目。因此Gradle需要知道configuration time的DmlParser
类,但是您的构建会在执行时创建它。
解决此问题的方法是引入buildSrc
build。这是项目目录中的一个独立构建,可用于实现其他复杂的构建逻辑。只需在项目目录中创建一个名为buildSrc
的新目录,然后在其中移动创建DmlParser
的逻辑。这样,您可以在主版本中使用DmlParser
。
如果要添加已经构建的jar,则需要使用buildscript
block才能将jar添加到构建脚本的类路径:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'
}
}
然后,您可以引用已添加到类路径中的jar中定义的类。