0

我们是否可以选择在 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();    
}   

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

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

4

1 回答 1

1

整个文件在构建的初始化阶段build.gradle被翻译成一个对象:project

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

因此,您可以在文件翻译后,在执行阶段build.gradle通过访问程序project对象模型来访问您的任何配置(隐式或显式)build.gradle

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

将以下任务粘贴到您的文件中build.gradle并在命令行中执行(gradle 诊断)以输出 allplugins以及文件中存在configurations的名称:tasksbuild.gradle

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

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

对于其他插件公开的属性和方法,您必须先访问该插件,然后从那里参考它们各自的文档。最后,插件可以将已知的扩展注册到项目对象中,因此您可以将它们作为project.

希望这可以帮助。

于 2019-05-21T09:21:04.693 回答