V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tool2d
V2EX  ›  Java

Kotlin 和 Java 的交叉引用如何编译?

  •  
  •   tool2d · 253 天前 · 1252 次点击
    这是一个创建于 253 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个 github 开源软件,里面 kt 文件引用了 java 的 class ,而 java 文件引用了 kt 的 class 。

    作者没给 maven 具体配置信息,只给了源代码。我自己配置了一下,先编译 java ,会报错找不到 kt 的 class 。而先编译 kt ,又会报错找不到 java 的 class 。

    实在是郁闷了。最终我用作者提供的预编译 jar ,先命令行编译 kt ,后编译 java 成功了。但我很好奇,如何才能正确设置混合编译的先后顺序?
    5 条回复    2023-08-18 17:39:37 +08:00
    yazinnnn
        1
    yazinnnn  
       253 天前   ❤️ 1
    一般 kotlin compiler(maven 或 gradle)插件能默认处理这种情况吧
    tool2d
        2
    tool2d  
    OP
       253 天前
    @yazinnnn 我用的是 maven 插件,按照教程改了几次 pom.xml 文件,都没成功。

    正常用插件编译( mvn compile ),java 优先级高,报错 kt class 找不到,编译失败。
    改用 kt 优先编译(mvn kotlin:compile), 报错 java class 找不到。

    强烈怀疑有个源文件优先级什么的,但我不清楚怎么处理。
    mxalbert1996
        3
    mxalbert1996  
       253 天前 via Android   ❤️ 1
    https://kotlinlang.org/docs/maven.html#compile-kotlin-and-java-sources
    重点是 kotlin 的 plugin 要在 java 的 plugin 之前,并且 sourceDirs 里要加上 java 源代码的路径
    tool2d
        4
    tool2d  
    OP
       253 天前
    @mxalbert1996 感谢,可以了,还是官方文档靠谱。

    我一直在修改 compile 项目,而忽略了 Replacing default-compile as it is treated specially by Maven 这句,一定要设置 skip 才行。

    默认行为始终是编译所有 java 文件,加这句才能先处理 kt 文件。
    aosan926
        5
    aosan926  
       253 天前
    正好前两天在 Jenkins 打包也碰到了这个问题,目前搜到的解决方案有两个:
    1. 执行 mvn clean kotlin:compile package -Dmaven.test.skip=true (本地测试可以)
    2. 跟 #3 一样,改 pom.xml ,先是 kotlin-maven-plugin ,然后是 spring-boot-maven-plugin ,最后是 maven-compiler-plugin (当前采用)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2922 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:25 · PVG 22:25 · LAX 07:25 · JFK 10:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.