【问题标题】:Unresolved reference for Java file in a different flavor when referencing from kotlin从 kotlin 引用时,未解决的 Java 文件引用不同风格
【发布时间】:2018-07-24 11:01:31
【问题描述】:

问题:

这个问题可能已经从所有其他类似问题中得到了隐含的回答,但我似乎无法让它发挥作用。

  • 如果我从主源集中的 java 文件中引用另一种风格(不同源集)的特定 java 文件,它可以工作。

  • 如果我尝试从主源集中的 Kotlin 文件中引用同一个文件,它会抱怨它看不到它(“未解决的引用”)。

  • 如果我将同一个文件移动到主源集,它可以工作(所以它不是文件本身)。

  • 1234563转换。

根据我的谷歌搜索,它似乎与 Gradle 中的源集有关,但我不希望在 Java 文件夹旁边有一个单独的 Kotlin 文件夹,所以我不确定我是否需要这个。此外,我同时拥有 Java 和 Kotlin 的另一个项目没有进行此配置并且工作正常。

我将 productFlavors 与 flavorDimensions 一起使用,并且有一个名为“dimension1Dimension2”的源集(这是我试图引用的 Java 文件所在的位置)。

查看下面的设置,我可能做错了什么或遗漏了什么?这个项目主要是 Java,所以我刚刚开始向它添加 Kotlin。我看不出与我的其他项目(主要是 Kotlin 和一些 Java)有任何区别。

另一件奇怪的事情是它确实适用于三种口味中的一种。有两种类型的维度1和三种类型的维度2。只有一种维度 2 类型有效。

也许代码更清晰:

flavorDimensions "product", "mode"    
productFlavors {
        mock { // only this one works (e.g. <company_name>Mock is the source set)
            applicationIdSuffix = ".mock"
            dimension "mode"
        }
        dev {
            applicationIdSuffix = ".dev"
            dimension "mode"
        }
        prod {
            dimension "mode"
        }
        demo {
            applicationIdSuffix = ".demo"
            dimension "product"
            buildConfigField "String", "UPDATE_DIRECTORY", "\"/release/\""
            buildConfigField "boolean", "SHOW_STREAM_STATUS", "false"
        }
        <company_name> {
            applicationIdSuffix = ".<company_name>"
            dimension "product"
        }
    }

设置:

  • Kotlin 版本:1.2.21
  • Gradle 版本:3.0.1
  • 插件:
    • 应用插件:'kotlin-android'
    • 应用插件:'kotlin-kapt'
    • 应用插件:'kotlin-android-extensions'
  • 项目级依赖项:
    • 类路径“org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version”
  • 应用级依赖:
    • 实现“org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version”
  • 在项目设置中使用 Java 8

【问题讨论】:

  • 你解决过这个问题吗?我和你处于同样的位置,如果 Kotlin 类需要引用不同风格的 Java 类,我开始避免编写它们。如果我有时间,我会花时间将旧类转换为 Kotlin,但这并不总是一种选择,因为时间紧迫,你不能总是相信内置转换器将 Java 代码转换为 Kotlin 中有意义的东西根据我的经验。
  • 我实际上不记得了,但我不这么认为,因为我会发布答案。我可能刚刚将更多类转换为 Kotlin。
  • 好的,谢谢。您写道,根据您的搜索,您发现如果您有一个 Kotlin source set 文件夹,它也应该可以工作。我还没有找到任何关于这种方法的信息 - 你有关于改变什么来使用这种方法的链接吗?
  • 我没有任何保存的链接,我不确定使用单独的 sourceSets 是否会做任何事情,因为它不应该是必需的。我认为这可能是一个错误。幸运的是,这是唯一一次发生。如果可以的话,我会转换为 Kotlin。
  • 好的,我现在在 Android Studio 的大跟踪器中创建了一个错误,其中包含一个具有完全相同问题的小示例项目。我总是可以转换为 Kotlin,但现在这不是一个好的解决方案,因为每次我转换一个文件时,我最终都不得不再转换 10 个文件,因为下一个文件使用了一个有味道的文件,所以一个小故事结束了花一天时间做本应该花 10 分钟的事情。由于截止日期快到了,我现在没有多余的时间,所以我必须坚持使用 Java 来获得一些功能。

标签: java android android-gradle-plugin kotlin


【解决方案1】:

所以我遇到了同样的问题,我不能即时将所有内容更改为 Kotlin,因为我们的应用程序是生产应用程序,我们没有时间立即更改为 Kotlin - 遗留代码应该保留 Java至少现在。

我就此向 Google 报告了一个错误:https://issuetracker.google.com/issues/110100405

你瞧,一位 Google 工程师实际上很快就回答了我的错误报告 :-)

如果您不想阅读我们的对话,我会简短地说:

TL;DR 版本:

这不适用于 Kotlin 的原因是您的软件包设置错误。 我敢打赌,在您的某些风格中,您犯了与我相同的错误并创建了 directories 之类的 com.example.mypackage,而不是创建名为 com 的父目录,然后是名称为 @987654325 的子目录@,然后是一个名为mypackage 的子目录。

因此,如果您的文件夹看起来像 com.example.mypackage,请将它们更改为带有子目录的 com,一切都应该没问题。

另一种可能是最简单的解决方案是创建名称为 com.example.mypackage 的不同风格的包,但这只能在您选择了要为其创建包的风格后才能完成。

至于为什么,这不会对 Java 造成问题,我不知道,Google 的人也没有,但这可能是 IntelliJ 问题,除非他们已经知道,否则我会向 JetBrains 报告它。

Kotlin 编译器只是吐出一个模糊的错误说Unresolved reference,这也是一个大问题,但这是另一天的讨论和另一个错误报告或改进。

【讨论】:

  • 由于这是不久前我转换到 Kotlin 的原因,因此我实际上无法验证我的项目是否存在同样的问题并且它会解决它。但是,据我所知,您的问题与我的问题相同并且这解决了您的问题,因此我会将其标记为已接受,就好像问题是您的问题一样。感谢您跟进并提供答案!
  • 这实际上是一个有趣的答案,因为据我所知,com.example.mypackage 是完全一样的。如果您单击“隐藏/压缩空中间包”,它会来回转换。所以我认为这没有任何区别,也不知道你怎么知道。但它解决了你的问题,所以我会相信你的话,如果我再次遇到它,我会知道该怎么做。
  • 你是救生员!我有一个具有名称空间的目录,而不是将其表示为目录树。创建目录树以匹配固定的命名空间!
  • @CarlosFerreira 非常欢迎你 - 我很高兴听到其他人也有同样的问题 ;-)
  • 也解决了我的问题。节省了我很多的牙齿和拔掉我的头发。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 2017-11-05
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多