You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java编写的Gradle插件中将目录添加至类路径?

问题

我有一个任务会在build目录下创建一个子目录,该目录内包含一个文件。我正尝试通过Java编写的Gradle插件将此目录添加至类路径。

当前使用的代码如下:

public class Myplugin implements Plugin<Project> {
    @Override
    public void apply(Project target) {
        SourceSetContainer sourceSetContainer = target.getExtensions().getByType(SourceSetContainer.class);
        SourceSet main = sourceSetContainer.findByName("main");
        assert main != null;
        // Next line is adding 'my-directory' to the classpath
        main.setRuntimeClasspath(main.getRuntimeClasspath().plus(target.getLayout().getBuildDirectory().dir("my-directory").get().getAsFileTree()));
    }
}

这会导致类路径中出现的是目录内的文件(如下方最后一行所示):

/Users/MYUSER/git/my-repo/build/classes/java/main, 
/Users/MYUSER/git/my-repo/build/classes/kotlin/main, 
/Users/MYUSER/git/my-repo/build/classes/groovy/main, 
/Users/MYUSER/git/my-repo/build/tmp/kapt3/classes/main, 
/Users/MYUSER/git/my-repo/build/resources/main, 
... Bunch of JAR  files ...
/Users/MYUSER/git/my-repo/build/my-directory/my-file.yml   <-----

但我希望类路径中仅显示该目录而非其中的文件,如下所示:

/Users/MYUSER/git/my-repo/build/classes/java/main, 
/Users/MYUSER/git/my-repo/build/classes/kotlin/main, 
/Users/MYUSER/git/my-repo/build/classes/groovy/main, 
/Users/MYUSER/git/my-repo/build/tmp/kapt3/classes/main, 
/Users/MYUSER/git/my-repo/build/resources/main, 
... Bunch of JAR  files ...
/Users/MYUSER/git/my-repo/build/my-directory   <-----

请问该如何实现?

解决方案

问题出在你使用了getAsFileTree(),这个方法会把目录下的所有文件作为文件树添加到类路径,最终类路径里会列出目录内的每个文件。要直接添加目录本身,你需要创建一个仅包含该目录的FileCollection,而不是文件树。

修改后的代码如下:

public class Myplugin implements Plugin<Project> {
    @Override
    public void apply(Project target) {
        SourceSetContainer sourceSetContainer = target.getExtensions().getByType(SourceSetContainer.class);
        SourceSet main = sourceSetContainer.findByName("main");
        assert main != null;
        
        // 获取目标目录
        Directory myDir = target.getLayout().getBuildDirectory().dir("my-directory").get();
        // 创建包含该目录的FileCollection
        FileCollection dirCollection = target.files(myDir);
        
        // 将目录添加到运行时类路径
        main.setRuntimeClasspath(main.getRuntimeClasspath().plus(dirCollection));
    }
}

关键说明

  • 使用target.files(myDir)可以创建一个包含该目录本身的文件集合,而不是遍历目录内的文件。
  • 这样添加后,Gradle会将整个目录路径加入类路径,而不是目录下的单个文件,符合你的需求。

内容的提问来源于stack exchange,提问作者devxgb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:52:39