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.groovysourcesSets.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 后出现问题的主要内容,如果未能解决你的问题,请参考以下文章

服务中的 Grails 消息源错误

使 WordPress 用户元数据可用于 Rest-API

如何从 grails 3.1.8 中的外部文件加载数据源配置?

外部化 Grails 数据源配置

如何从grails 3.1.8中的外部文件加载数据源配置?

我可以在没有数据源的情况下配置 Grails 吗?