以编程方式访问build.gradle内容

时间:2019-05-21 07:53:01

标签: java gradle gradle-tooling-api

我们是否可以选择任何选项来读取Java程序中build.gradle文件的内容。我可以使用以下代码在maven中执行类似的操作。现在,我正在寻找在gradle中执行相同操作的选项。我尝试按照以下说明使用Gradle-tooling-api,但出现了一些错误(不确定我是否遵循正确的方法)。

使用MavenXpp3Reader读取pom.xml

    ```FileReader fileReader;
    try {
        fileReader = new FileReader(destPath);
    } catch (FileNotFoundException fileNotFoundException) {
        fileNotFoundException.printStackTrace();
    }
    MavenXpp3Reader reader = new MavenXpp3Reader();
    Model pomModel = reader.read(fileReader);

    //close the file reader
    fileReader.close();
    ```

尝试如下使用gradle-tooling-api,但出现以下错误。

public class ToolingApiCustomModelPlugin implements Plugin<Project> {
    private final ToolingModelBuilderRegistry registry;

    @Inject
    public ToolingApiCustomModelPlugin(ToolingModelBuilderRegistry registry) {
        this.registry = registry;
    }

    @Override
    public void apply(Project project) {
        registry.register(new CustomToolingModelBuilder());
    }

    private static class CustomToolingModelBuilder implements ToolingModelBuilder {
        @Override
        public boolean canBuild(String modelName) {
            return modelName.equals(CustomModel.class.getName());
        }

        @Override
        public Object buildAll(String modelName, Project project) {
            List<String> pluginClassNames = new ArrayList<String>();

            for(Plugin plugin : project.getPlugins()) {
                pluginClassNames.add(plugin.getClass().getName());
            }

            return new DefaultModel(pluginClassNames);
        }
    }
}

public static void main(String[] args) {
        GradleConnector connector = GradleConnector.newConnector();
        connector.forProjectDirectory(new File("./sample"));
        ProjectConnection connection = null;

        try {
            connection = connector.connect();
            ModelBuilder<CustomModel> customModelBuilder = connection.model(CustomModel.class);
            //customModelBuilder.withArguments("--init-script", "init.gradle");
            CustomModel model = customModelBuilder.get();    
}   

线程“ main”中的异常org.gradle.tooling.UnknownModelException:在此版本中没有“ CustomModel”类型的模型。

原因:org.gradle.tooling.provider.model.UnknownModelException:没有构建器可用于构建类型为“ org.gradle.sample.toolingapi.CustomModel”的模型。

1 个答案:

答案 0 :(得分:1)

在构建的initialization phase期间,整个build.gradle文件被转换为project对象:

  

项目与“ build.gradle”文件之间存在一对一的关系。在构建初始化期间,Gradle为要参与构建的每个项目组装一个Project对象

因此,您可以在execution phase期间,通过在翻译build.gradle文件后访问程序化project对象模型来访问build.gradle中的任何配置(隐式或显式)

您可以在自定义的gradle插件中,也可以在build.gradle内的简单gradle类型中执行此操作(似乎是递归的;但这就是为什么您需要分阶段来限制读取文件和访问project对象的原因)。

将以下任务粘贴到build.gradle中,并在命令行中执行它(分级诊断)以输出所有pluginsconfigurations和存在的tasks的名称在build.gradle文件中:

task diagnostics {
    doLast {
        println project.plugins
        println project.tasks*.name
        println project.configurations
    }
}

这些链接将帮助您检查如何导航到gradle project对象内部的不同属性:

对于其他插件公开的属性和方法,您必须先访问该插件,然后再从中参阅其各自的文档。最后,插件可以将称为extensions的内容直接注册到项目对象中,因此您可以将其作为project的直接属性来获取。

希望这会有所帮助。

相关问题