我们是否可以选择任何选项来读取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”的模型。
答案 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
中,并在命令行中执行它(分级诊断)以输出所有plugins
,configurations
和存在的tasks
的名称在build.gradle
文件中:
task diagnostics {
doLast {
println project.plugins
println project.tasks*.name
println project.configurations
}
}
这些链接将帮助您检查如何导航到gradle project
对象内部的不同属性:
对于其他插件公开的属性和方法,您必须先访问该插件,然后再从中参阅其各自的文档。最后,插件可以将称为extensions的内容直接注册到项目对象中,因此您可以将其作为project
的直接属性来获取。
希望这会有所帮助。