我有两个项目 - 第一个是简单的hello world,第二个是自定义gradle插件。此插件在dir ${pluginRoot}/some-classes
中有其他类。我将它们添加到这样的依赖项中:
dependencies {
compile(files("some-classes"))
}
内部任务work
我使用这样的其他类:
Class<?> aClass = SimpleTask.class.getClassLoader().loadClass("io.github.hejcz.A");
Object o = aClass.newInstance();
Object count = aClass.getDeclaredMethod("count").invoke(o);
System.out.println(count);
为了测试,我创建了调用此行为的main方法,并打印了期望值。
然后我进行了复合构建并将此插件添加到hello world项目中,应用该插件。任务work
出现在hello world项目中。执行时我得到错误:
java.lang.ClassNotFoundException: io.github.hejcz.A
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at io.github.hejcz.SimpleTask.soutClassOnCP(SimpleTask.java:21)
at io.github.hejcz.SimpleTask.hello(SimpleTask.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.doExecute(DefaultTaskClassInfoStore.java:141)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:123)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:692)
看来这个插件不再能看到那些额外的类了。我该如何解决这个问题?
更新
经过一番调查后,我意识到hello world项目使用了包含项目生成的jar文件。这个罐子里没有那些额外的课程。将以下代码添加到插件的build.gradle
可以解决问题,但这是实现我想要的最佳方式吗?
task copyAdditionalClasses(type: Copy) {
from "some-classes"
into "build/classes/main"
}
jar.dependsOn copyAdditionalClasses
更新
在lance-java建议不复制课程后,我找到了另一种方法来做我想要的事情:
sourceSets.main.output.dir(file("some-classes"))
在打包过程中复制此目录需要Jar
任务。