从kotlin引用时,Java文件的未解析引用具有不同的风格

Mic*_*ovo 6 java android kotlin android-gradle-plugin

问题:

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

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

  • 如果我尝试从主源集中的Kotlin文件引用同一个文件,则会抱怨它无法看到它("未解析的引用").

  • 如果我将相同的文件移动到主源设置它是有效的(所以它不是文件本身).

  • 如果我将Java文件转换为Kotlin它可以工作(这是我目前的解决方案),但我想知道它为什么不起作用,因为转换并不总是那么容易,它应该可以在没有转换的情况下工作.

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

我正在使用带有flavorDimensions的productFlavors,并且有一个名为"dimension1Dimension2"的源集(这是我试图引用的Java文件所在的位置).

看下面的设置,我可能做错了什么或丢失了什么?这个项目主要是Java,所以我刚刚开始添加Kotlin.我看不出与我的其他项目有什么不同,主要是Kotlin和一些Java.

另一件奇怪的事情是它适用于三种口味中的一种.维度1有两种类型,维度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"
        }
    }
Run Code Online (Sandbox Code Playgroud)

建立:

  • Kotlin版本:1.2.21
  • Gradle版本:3.0.1
  • 插件:
    • apply plugin:'kotlin-android'
    • 申请插件:'kotlin-kapt'
    • apply plugin:'kotlin-android-extensions'
  • 项目级依赖项:
    • classpath"org.jetbrains.kotlin:kotlin-gradle-plugin:$ kotlin_version"
  • 应用程序级依赖项:
    • 实现"org.jetbrains.kotlin:kotlin-stdlib-jdk8:$ kotlin_version"
  • 在项目设置中使用Java 8

Dar*_*ind 5

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

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

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

如果您不想阅读我们的对话,我将简短介绍一下:

TL; DR版本:

这不适用于Kotlin的原因是因为您的软件包设置错误。我敢打赌,在某些方面,您犯了与我相同的错误并创建了directories类似的方法,com.example.mypackage而不是先创建名为的父目录com,然后创建具有名称example的子目录,再创建名为的子目录mypackage

因此,如果您的文件夹外观com.example.mypackage更改为com带有子目录,则一切都很好。

另一个解决方案(可能是最简单的)是使用com.example.mypackage不同口味的名称创建包装,但这只有在选择了要为其创建包装的口味时才能完成。

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

Kotlin编译器吐出一个模糊的错误说这也是一个大问题Unresolved reference,但这是另一天的讨论以及另一个错误报告或增强功能。