我有一个大型项目,我正在帮助从Grails 2.5迁移到Grails 3和Gradle。在短期内,我们正在将大部分业务代码转移到框架无关的gradle模块中,然后将它们导入到grails2.5,最终计划转移到一个完整的grails-3构建中。
移徙办法计划是:
BuildConfig.groovy中指定依赖项,我只是使用grails代码中的类,在应用程序启动的编译阶段,所有的东西都在那里。这在当地非常有效。我可以从源代码管理中重新签出项目开始,执行grails run-app --refresh-dependencies (或grails run-app --refresh-dependencies目录)。
这不适用于詹金斯。我正在使用Jenkins Gradle插件。Jenkins无法解析我的(单个POC)类:
[groovyc] /mnt/jenkins/workspace/Java8/Steps/MyApp-Grails-2.5.2-Java8-Pull-Request-Unit-Tests
/src/groovy/com/myapp/package/SomeServiceWithADependency.groovy:
10: unable to resolve class com.myapp.module.util.MyUtil
[groovyc] @ line 10, column 1.
[groovyc] com.myapp.module.util.MyUtil
[groovyc] ^以下是我尝试过的:
--refresh-dependencies标志添加到所有构建周期命令的框lib/目录中还有另外3个jars,它们被签入git源代码管理。Grails发现那些没有问题。/lib目录中的是什么,我同时也在生成依赖项和签入源代码管理的依赖项。它们似乎在那里,并且路径与预期的工作区路径相匹配。有什么想法吗?希望地球上有人处理过类似的问题
发布于 2018-07-26 22:00:18
我们解决了这个问题。构建在本地运行是因为gradle的缓存,并且远程失败是因为Jenkins正在使用一个新的存储库。
考虑到从git的干净拉动开始,执行单个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中添加依赖项失败不会引发编译时错误,但在运行时没有类def会导致崩溃。然而,模块化构建的好处,尤其是它已经给代码组织带来的纪律,以及了解我们的应用程序代码的很大一部分是框架无关的舒适,这些都是值得的。
希望这能帮到其他人。
https://stackoverflow.com/questions/51413709
复制相似问题