以编程方式访问 build.gradle 内容
Access build.gradle contents programmatically
我们是否可以选择在 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' 的模型。
整个 build.gradle
文件在构建 initialization phase 期间被翻译成一个 project
对象:
There is a one-to-one relationship between a Project and a "build.gradle" file. During build initialisation, Gradle assembles a Project object for each project which is to participate in the build
因此,在翻译 build.gradle
文件之后,在 execution phase
您可以在自定义的 gradle 插件中或在 build.gradle
中的简单 gradle 类型中执行此操作(似乎是递归的;但这就是为什么您有阶段来界定阅读文件并访问 project
对象)。
将以下任务粘贴到您的 build.gradle
中并在命令行(gradle 诊断)中执行它以输出所有 plugins
、configurations
和名称tasks
存在于 build.gradle
文件中:
task diagnostics {
doLast {
println project.plugins
println project.tasks*.name
println project.configurations
}
}
这些链接将帮助您检查如何导航到 gradle project
对象内的不同属性:
对于其他插件公开的属性和方法,您必须先访问该插件,然后参考它们各自的文档,然后从那里进行操作。最后,插件可以将所谓的 extensions 注册到项目对象中,因此您可以将它们作为 project
.
的直接属性访问
希望这对您有所帮助。
我们是否可以选择在 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' 的模型。
整个 build.gradle
文件在构建 initialization phase 期间被翻译成一个 project
对象:
There is a one-to-one relationship between a Project and a "build.gradle" file. During build initialisation, Gradle assembles a Project object for each project which is to participate in the build
因此,在翻译 build.gradle
文件之后,在 execution phase
您可以在自定义的 gradle 插件中或在 build.gradle
中的简单 gradle 类型中执行此操作(似乎是递归的;但这就是为什么您有阶段来界定阅读文件并访问 project
对象)。
将以下任务粘贴到您的 build.gradle
中并在命令行(gradle 诊断)中执行它以输出所有 plugins
、configurations
和名称tasks
存在于 build.gradle
文件中:
task diagnostics {
doLast {
println project.plugins
println project.tasks*.name
println project.configurations
}
}
这些链接将帮助您检查如何导航到 gradle project
对象内的不同属性:
对于其他插件公开的属性和方法,您必须先访问该插件,然后参考它们各自的文档,然后从那里进行操作。最后,插件可以将所谓的 extensions 注册到项目对象中,因此您可以将它们作为 project
.
希望这对您有所帮助。