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

mzmfm0qo  于 2023-02-02  发布在  Java
关注(0)|答案(1)|浏览(205)

我们是否可以选择在Java程序中读取build.gradle文件的内容。我可以使用下面的代码在maven中执行类似的操作。现在,我将查看在gradle中执行相同操作的选项。我尝试使用Gradle-tooling-API,如下所述,但出现了一些错误(不确定我是否遵循了正确的方法)。
使用MavenXpp 3Reader阅读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中出现异常。未知模型异常:此生成中没有类型为“CustomModel”的模型。
原因:org.gradle.tooling.provider.model.未知模型异常:没有构建器可用于构建类型为“org.gradle.sample.toolingapi. CustomModel”的模型。

2sbarzqh

2sbarzqh1#

整个build.gradle文件在构建的initialization phase期间转换为project对象:
项目与“build.gradle”文件之间存在一对一的关系。在构建初始化期间,Gradle会为参与构建的每个项目汇编一个项目对象
因此,您可以在build.gradle文件转换后,在执行阶段通过访问编程project对象模型,从build.gradle访问任何配置(隐式或显式
您可以在定制的gradle插件中或build.gradle中的简单gradle类型中执行此操作(看起来像递归;但这就是为什么要划分阅读文件和访问project对象的阶段)。
将以下任务粘贴到您的build.gradle中,并在命令行中执行(gradle诊断),以输出build.gradle文件中存在的所有pluginsconfigurationstasks的名称:

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

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

对于由其他插件公开的属性和方法,你必须先访问插件,然后参考它们各自的文档,最后插件可以直接注册extensions到项目对象中,这样你就可以直接访问project的属性。

相关问题