繁体   English   中英

在Gradle插件里面配置Gradle插件

[英]Configure Gradle Plugin inside Gradle plugin

我想创建一个自定义 Gradle 插件,它将封装 Checkstyle 和 PMD 配置。 因此,其他项目可以只应用一个自定义插件,而无需担心任何额外的配置。

我应用checkstyle插件。

plugins {
    id 'java-gradle-plugin'
    id 'checkstyle'
}

然后我将它应用到我的自定义插件中。

public class CustomPlugin implements Plugin<Project> {
    public void apply(Project project) {
        project.getPluginManager().apply(CheckstylePlugin.class);
    }
}

当我尝试构建项目时出现错误。

Unable to find: config/checkstyle/checkstyle.xml

如何覆盖其他插件的属性? 例如,我想更改默认的checkstyle.xml路径。 我可以在插件项目本身的build.gradle中手动完成。 但是在这种情况下,其他应用该插件的项目将不会默认定义此配置(我测试过)。

编辑 1:

我设法用ChecktyleExtension配置了checkstyle插件。

public class MetricCodingRulesGradlePluginPlugin implements Plugin<Project> {
    public void apply(Project project) {
        project.getPluginManager().apply("checkstyle");
        project.getExtensions().configure(CheckstyleExtension.class, checkstyleExtension -> {
            checkstyleExtension.setConfigFile(new File("style/checkstyle.xml"));
        });
    }
}

checkstyle.xml放在插件项目中。 当我尝试在任何其他项目中应用它时, checkstyle会在当前项目目录而不是插件目录中搜索它。 有可能克服这个问题吗? 我不希望该插件的用户将任何其他文件放入他们的项目中。

编辑 2:

我将配置文件放入resources文件夹并尝试读取内容。

public class MetricCodingRulesGradlePluginPlugin implements Plugin<Project> {
    public void apply(Project project) {
        project.getPluginManager().apply("checkstyle");
        project.getExtensions().configure(CheckstyleExtension.class, checkstyleExtension -> {
            URL url = getClass().getClassLoader().getResource("style/checkstyle.xml");
            System.out.println("URL: " + url);
            try {
                checkstyleExtension.setConfigFile(
                    Paths.get(url.toURI())
                        .toFile()
                );
            } catch (URISyntaxException e) {
                throw new RuntimeException(e);
            }
        });
    }
}

当我将插件应用到另一个项目时,出现以下错误:

URL: jar:file:/Users/user/.gradle/caches/jars-9/8f4176a8ae146bf601f1214b287eb805/my-plugin-0.0.1-SNAPSHOT.jar!/style/checkstyle.xml

Caused by: java.nio.file.FileSystemNotFoundException
    at com.sun.nio.zipfs.ZipFileSystemProvider.getFileSystem(ZipFileSystemProvider.java:171)
    at com.sun.nio.zipfs.ZipFileSystemProvider.getPath(ZipFileSystemProvider.java:157)

Java 由于某种原因无法从jar存档中读取文件。 有什么方法可以克服这个错误?

您需要将checkstyle.xml捆绑在插件的resources文件夹中,这样当您发布它时,您始终可以从插件代码中访问它。

基本上,您需要将配置放在插件的src/main/resources/checkstyle.xml下,然后像这样访问它:

URL resourceURL = getClass().getClassLoader().getResource("checkstyle.xml");
if (resourceURL != null) {
  File resourceFile = File(resourceURL.getFile());
  checkstyleExtension.setConfigFile(resourceFile);
} 

还要记住,如果您将插件作为.jar ,则需要事先将checkstyle.xml解压到一个临时文件中。 大致:

File temp = File.createTempFile(".checkstyle", ".xml")
try (FileOutputStream out = new FileOutputStream(temp)) {
  try (InputStream resourceStream = getClass().getClassLoader().getResourceAsStream("checkstyle.xml")) {
    byte[] buffer = new byte[1024];
    int bytes = resourceStream.read(buffer);
    while (bytes >= 0) {
      out.write(buffer, 0, bytes);
      bytes = resourceStream.read(buffer);
    }
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM