2014-12-02 52 views
0

我正在使用buildSrc方法编写自定义Gradle任务(使用Java)。我想任务实际引导核心模块的Spring上下文,因此自定义任务类看起来是这样的:Gradle:从自定义任务中访问项目类和依赖关系

buildSrc/main/java/CustomTask.java:

import org.gradle.api.DefaultTask; 
import org.gradle.api.tasks.TaskAction; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 

public class CustomTask extends DefaultTask { 

    @TaskAction 
    public void run() { 
     ApplicationContext context = new ClassPathXmlApplicationContext("core-context.xml"); 
    } 
} 

但是,任务失败编译由于春天不是可用。 Spring当然是核心模块的编译依赖。

什么是最好的方式来告诉Gradle buildSrc源集取决于模块的源集? (理想情况下,不需要重复依赖声明)。

+0

你的意思是“我希望任务能够真正引导核心模块的Spring上下文”?这项任务的目的是什么? – 2014-12-02 12:47:13

+0

该任务的目的是获取Hibernate的模式更新(不运行它们)。由于一切都是用Spring配置的,我不想重复任何配置,但使用项目的自然配置。 – 2014-12-02 12:58:59

回答

0

由于该类路径是在任何任务(例如compileJava)运行之前构建的,因此无法将主版本的编译代码添加到buildscript类路径。相反,您可以实施一个基于类似装载程序的解决方案,该装载程序由sourceSets.main.runtimeClasspath组成。通常,CustomTask本身不会知道,但会得到配置与适当的类路径。

+0

哇。现在我已经将Spring&Hibernate添加到了buildSrc/build.gradle,并且设法在插件apply()中获取主源集的runtimeClasspath。换句话说,我对编译问题使用了一个不太理想的解决方案,现在我面临着运行时问题。除了自定义类加载器之外,是否真的没有其他方法将项目的运行时cp添加到构建脚本/任务cp? – 2014-12-02 13:42:03

+0

或者,您可以在单独的JVM中运行代码。这可能并不容易,但它更安全,因为没有污染Gradle(守护进程)JVM(内存泄漏等)的风险。一个使用'sourceSets.main.runtimeClasspath'填充的类加载器将已经包含Spring和Hibernate,只要它们在主构建中声明为依赖关系。 – 2014-12-02 13:50:12

+1

想更多地了解这一点,难道你不能只在主构建中添加一个主类来做你想做的事情,并使用'JavaExec'任务来运行它?这似乎简单得多。 – 2014-12-02 13:52:51

相关问题