Grails 应用程序(配置文件 rest-api)在 Java 之前编译 Groovy 后出现问题
Posted
技术标签:
【中文标题】Grails 应用程序(配置文件 rest-api)在 Java 之前编译 Groovy 后出现问题【英文标题】:Grails app (profile rest-api) went haywire after compiling Groovy before Java 【发布时间】:2018-07-02 04:35:11 【问题描述】:在我的Grails
应用程序中,我通过添加此代码,明确使它在Java
之前编译Groovy
,
sourceSets
main
groovy
// override the default locations, rather than adding additional ones
srcDirs = ['src/main/groovy', 'src/main/java']
java
srcDirs = [] // don't compile Java code twice
到build.gradle
。
添加这个sn-p后,应用开始报主类,
...
...
:findMainClass FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':findMainClass'.
> Illegal null value provided in this collection: [null]
当我运行gradle clean build
。
我试图像下面这样提供这个主类,
springBoot
mainClass = "foo.bar.Application" // The one in the grails-app/init
但还没有遇到另一个错误。
...
...
:classes
:findMainClass
:bootRunError: Could not find or load main class foo.bar.Application
任何帮助将不胜感激。
版本:
Gradle,3.4.1 Grails,3.2.8 Groovy,2.4.7 Java,1.8【问题讨论】:
为什么要使用 Groovy 编译器编译 Java 源代码? @SzymonStepniak,我不必这样做。有没有其他方法可以在 Java 之前强制 Groovy 编译? 嗯,你有什么问题要解决吗?您的 Java 源代码知道 Groovy 源文件并直接使用它们,反之亦然。您的src/main/java
不能添加到sourcesSets.main.groovy
,因为它包含Groovy 编译器无法编译的Java 文件。您可以尝试在main
闭包中更改sourcesSets.main.groovy
和sourcesSets.main.java
的顺序,但我猜Gradle 并不关心main
体内的顺序。
问题是,Gradle 没有编译我的 Java 类并抱怨其中的 Groovy 类的引用。另一方面,IntelliJ 很好。我尝试过的解决方案似乎很流行,可能对 Grails 不是很有效。
Groovyc 在看到 .java 文件时会退回到 Javac。甚至鼓励将 .java 文件放入 .groovy 源根目录中,这样通常就不必处理来自运行的两个不同编译器的循环依赖。
【参考方案1】:
Java 不能原生使用 groovy 类。在实现互操作性之前,必须将它们编译为 JVM 字节码。如果你想在 java 中使用可重用的 groovy 代码,最简单的方法是将 groovy 库独立打包成 JAR 文件(jvm 字节码),并将其用作 JAR 依赖项。执行此操作时,您还需要 groovy sdk jar,以便 java“理解”groovy 签名。
【讨论】:
这将是开发的噩梦。实际上,我可以接受我所得到的——因为它不是在嵌入式容器中运行。 Spring Boot 由于某种原因无法加载主类。如果我以传统方式部署在 Tomcat 中,应用程序应该可以工作。以上是关于Grails 应用程序(配置文件 rest-api)在 Java 之前编译 Groovy 后出现问题的主要内容,如果未能解决你的问题,请参考以下文章