复合构建中的Gradle插件类路径

时间:2017-12-22 08:48:35

标签: java gradle

我有两个项目 - 第一个是简单的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任务。

0 个答案:

没有答案