繁体   English   中英

是否可以让“groovyc”只生成存根? (Java+Groovy+Kotlin联合编译)

[英]Can 'groovyc' be told to just generate stubs? (Joint-compile of Java+Groovy+Kotlin)

我正在尝试在所有 Java、Groovy 和 Kotlin 之间进行联合/混合编译。 我目前正在研究一个理论,即如果可以使 groovyc 仅在第一阶段发出存根文件,那应该是可能的。

它可以? 否则,是否有关于从 Groovy 源代码中创建此类功能的指示?

下面是完全混合编译的思路:

  1. 让 Groovyc 为其所有类创建 Java 存根。 AFAIU,它会逐个文件“盲目”执行此操作,而不会看到任何其他来源。 (这是关键,这个问题是关于什么的:让 groovyc(或它的一部分)只生成存根)。
  2. 让 Kotlinc 编译 Kotlin 文件,基于 Java 的 Java 文件类型和 Groovy 的 Java 存根(通过将它们添加到 kotlinc 的类路径)
  3. 让 Javac 编译 Java 文件,基于 Groovy 的 Java 存根类型和 Kotlin 的类文件(通过将它们添加到 javac 的类路径,或为 Java 存根使用 -sourcepath)。
  4. 让 Groovyc 编译 Groovy 文件,基于 Java 类文件的类型和 Kotlin 类文件(通过将它们添加到 groovyc 的类路径)。

这相对容易以编程方式执行,但目前命令行不支持。 对于程序化使用,您需要类似 [1] 的内容,但将引用行上的阶段更改为 SEMANTIC_ANALYSIS。 您还需要按照 [2] 保留存根。

要从命令行启用此功能,FileSystemCompiler 需要了解完成阶段,并且需要让 [3] 中的 unit.compile() 语句了解该阶段。 但我自己并没有真正尝试过这些改变。

[1] https://github.com/apache/groovy/blob/master/src/test/groovy/bugs/Groovy6086Bug.groovy#L63

[2] https://github.com/apache/groovy/blob/master/src/test/groovy/bugs/Groovy9031.groovy#L33

[3] https://github.com/apache/groovy/blob/master/src/main/java/org/codehaus/groovy/tools/FileSystemCompiler.java#L309-L317

使用 Gradle 或 Maven 等构建工具。

它们有一个标准的项目文件布局,它指定了目录结构和命名约定。 您会将 groovy 源文件放在 /src/groovy/ 下,将 java 源文件放在 /src/java/ 下,kotlin 也类似。

使用选择的构建工具初始化项目目录并准备基础构建配置。 如果构建配置告诉工具存在多种语言,那么它们将在编译时自动了解彼此。 更重要的是,如果您使用 IntelliJ(甚至是免费版本)等 IDE,编辑器将了解构建配置并了解多种语言,并提供导入建议和类/方法完成。

Groovy 调用 Java 是我每天使用的东西,Java 到 Groovy 也是可能的,但你需要了解 Groovy 的工作原理,因为有许多 Groovy 编码习惯用法不能直接从 Java 调用,但标准类工作得很好。

类似的限制适用于 Kotlin。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM