Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Jenkins Grails插件启动的Grails测试没有';t拾取gradle构建生成的jar_Java_Jenkins_Gradle_Grails_Groovy - Fatal编程技术网

Java 从Jenkins Grails插件启动的Grails测试没有';t拾取gradle构建生成的jar

Java 从Jenkins Grails插件启动的Grails测试没有';t拾取gradle构建生成的jar,java,jenkins,gradle,grails,groovy,Java,Jenkins,Gradle,Grails,Groovy,我有一个大型项目,我正在帮助从Grails2.5迁移到Grails3和Gradle。短期内,我们正在将大部分业务代码迁移到与框架无关的gradle模块中,然后将它们导入Grails2.5,最终计划迁移到完全的grails-3构建 迁移方法计划是: 创建gradle模块并将大部分代码移到这些模块中 让grails执行gradle构建 Gradle将每个模块的构建结果放入/lib目录 Grails在类路径上找到它们并使用它们 我没有在BuildConfig.groovy中指定依赖项,我只是使用gr

我有一个大型项目,我正在帮助从Grails2.5迁移到Grails3和Gradle。短期内,我们正在将大部分业务代码迁移到与框架无关的gradle模块中,然后将它们导入Grails2.5,最终计划迁移到完全的grails-3构建

迁移方法计划是:

  • 创建gradle模块并将大部分代码移到这些模块中

  • 让grails执行gradle构建

  • Gradle将每个模块的构建结果放入/lib目录

  • Grails在类路径上找到它们并使用它们

  • 我没有在
    BuildConfig.groovy
    中指定依赖项,我只是使用grails代码中的类,在应用程序启动的编译阶段,所有东西都在那里

这在本地非常有效。我可以从源代码管理重新签出项目开始,执行
grailsrunapp--refresh dependencies
(或
testapp),并查看构建的结果。我发现,
--refresh dependencies
是一个神奇的grails巫术,它告诉grails它可能会在它的
lib/`目录中找到它需要的一些类

这对詹金斯不起作用。我正在使用Jenkins Gradle插件。Jenkins无法解析我的(单身,POC)类:

以下是我尝试过的:

  • 我选中了Jenkins的复选框,将
    --refresh dependencies
    标志添加到所有构建周期命令中

  • lib/
    目录中还有另外3个jar,已签入git源代码管理。Grails可以找到没有问题的

  • 我已经在gradle模块构建的末尾添加了一个print语句,告诉我
    /lib
    目录中有什么,并且我知道gradle正在生成的依赖项和签入源代码管理的依赖项。它们似乎在那里,并且路径与预期的工作区路径匹配


有什么想法吗?希望地球上有人处理过类似的问题,我们解决了这个问题。由于gradle的缓存,构建在本地工作,而由于Jenkins正在使用新的存储库,构建在远程失败

考虑到从git repo的干净拉入开始,执行单个grails命令来构建gradle模块并拉入依赖项的要求,我们的解决方案是首先使用
gradlew
shell脚本来构建gradle,如果gradle构建失败则失败:

(exec ./modules/gradlew -p modules build jar publishToMavenLocal);  gradlew_return_code=$?

if [ "$gradlew_return_code" -eq "0" ]; then
    echo "Gradle build task success!"
else
    echo "Gradle build task failed with return code $gradlew_return_code; aborting."
    exit -1
fi
缺点是:

  • 所有从事该项目的开发人员都必须使用
    /grailsw
    (而不是
    grails
    )来执行任何grails任务,并且所有jenkins构建都已相应地修改

  • 任何模块内的任何可传递依赖项也必须添加到
    BuildConfig.groovy
    中,以便grails在运行时将它们放在类路径上。未能在
    BuildConfig.groovy
    中添加依赖项不会引发编译时错误,但会在运行时由于没有类定义而崩溃

然而,模块化构建的好处,特别是它已经给代码组织带来的规则,以及知道我们的应用程序代码的很大一部分是框架无关的,这些不便是值得的

希望这能帮助其他人

(exec ./modules/gradlew -p modules build jar publishToMavenLocal);  gradlew_return_code=$?

if [ "$gradlew_return_code" -eq "0" ]; then
    echo "Gradle build task success!"
else
    echo "Gradle build task failed with return code $gradlew_return_code; aborting."
    exit -1
fi