我正在编写一个自定义gradle插件,它会根据它在应用它的项目中找到的代码为我生成一些代码。 为此,我需要找到扩展特定类的所有类。 问题是扩展的类没有加载到类路径中,因为它是另一个项目的依赖项。
目前我的自定义任务
public class GenerateCodeTask extends DefaultTask {
@TaskAction
public void generateCode() throws MalformedURLException, ClassNotFoundException {
File buildDir = new File(getProject().getBuildDir(), "classes/main");
File root = new File(getProject().getProjectDir(), "src/main/generated");
URLClassLoader classLoader = new URLClassLoader(new URL[]{buildDir.toURL()});
Class itemClass = classLoader.loadClass("net.minecraft.item.Item");
Reflections reflections = new Reflections(classLoader);
Set<Class<?>> items = reflections.getSubTypesOf(itemClass);
}
}
这是插件
public class EasymodsPlugin implements Plugin<Project> {
@Override
public void apply(Project p) {
Task t = p.getTasks().create("generateCode", GenerateCodeTask.class);
t.dependsOn(p.getTasks().getByPath("compileJava"));
}
}
这是我得到的错误
java.lang.ClassNotFoundException:net.minecraft.item.Item
我知道问题是没有加载包含该类的库,这会导致异常。 我想要的是能够将我的项目的所有依赖项加载到类加载器中,所以我可以使用反射来查找项目中的所有“项目”(我需要生成代码)
问候Failender
答案 0 :(得分:0)
我想你差不多了。
您需要compileClasspath
属性。我将其作为输入参数传递给任务,然后从中构建类加载器:
在插件中
Set<File> ccp = project.getConfigurations().getByName("compileClasspath").getFiles();
task.classpath = ccp;
任务中:
@InputFiles
Iterable<File> classpath;
此属性添加的是:
project_id/build
目录下生成的项目所依赖的类的路径。 (因此,无需手动构建路径)因此,如果您的班级是类型1:
如果您有不同的子项目,那就更好了:一个拥有原始类的子项目,另一个拥有生成的类的子项目。
所以第二个取决于第一个:
dependencies {
compile project(':my_project_with_classes_to_extend')
}
在第二种情况下,您只需将库作为dep添加到项目中,它将找到该类。
并重新连接任务,以便在调用任务之前确定第一个项目已构建(仅在第二个项目build.gradle的根级别):
我认为那不是真正为您服务的部分,显然,compileJava和build并不完全相同。至少,compileJava也不适合我。
myGeneratorTask.dependsOn( ":my_project_with_classes_to_extend:build" )
compileJava.dependsOn( "myGeneratorTask" )