如何在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
相关产品推荐
相关产品推荐

