Проблема:

На этот вопрос, вероятно, был дан неявный ответ из всех других подобных вопросов, но я не могу заставить его работать.

  • Если я ссылаюсь на конкретный java-файл в другом варианте (другой исходный набор) из java-файла в основном исходном наборе, он работает.

  • Если я попытаюсь сослаться на тот же файл из файла Kotlin в основном наборе источников, он пожалуется, что не может его увидеть («Неразрешенная ссылка»).

  • Если я перенесу тот же файл в основной исходный набор, он будет работать (так что это не сам файл).

  • Если я конвертирую файл Java в Kotlin, он работает (и это мое текущее решение), но я хотел бы знать, почему он не работает, поскольку его не всегда так легко преобразовать, и он должен работать без преобразования.

Основываясь на моем поиске в Google, кажется, что это связано с исходными наборами в Gradle, но мне не нужна отдельная папка Kotlin вместе с папкой Java, поэтому я не уверен, что мне это нужно. Кроме того, в другом проекте, где у меня есть как Java, так и Kotlin, это не настроено и работает нормально.

Я использую productFlavors с FlavourDimensions и имею исходный набор под названием «Dimension1Dimension2» (именно там находится Java-файл, на который я пытаюсь сослаться).

Глядя на мою настройку ниже, что я, возможно, делаю неправильно или упускаю? Этот проект в основном основан на Java, поэтому я только начинаю добавлять к нему Kotlin. Я не вижу никаких различий с другим моим проектом, который в основном состоит из Kotlin и немного Java.

Еще одна странность заключается в том, что он работает с одним из трех вкусов. Есть два типа Dimension1 и три типа Dimension2. Работает только один из двух типов Dimension.

Может быть, код понятнее:

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 в настройках проекта
9
Michael Vescovo 14 Фев 2018 в 02:54
Вы когда-нибудь это решали? Я нахожусь в том же положении, что и вы, и я начинаю избегать написания классов Kotlin, если им нужно ссылаться на классы Java, которые находятся в разных вариантах. Если у меня есть время, я трачу время на преобразование старых классов в Kotlin, но это не всегда вариант, поскольку у меня очень сжатые сроки, и вы не всегда можете доверять встроенному конвертеру для преобразования кода Java во что-то значимое в Kotlin. по моему опыту.
 – 
Darwind
13 Июн 2018 в 00:18
На самом деле я не могу вспомнить, но я так не думаю, так как я бы опубликовал ответ. Возможно, я только что преобразовал больше классов в Kotlin.
 – 
Michael Vescovo
13 Июн 2018 в 09:57
Хорошо спасибо. Вы писали, что на основе вашего поиска вы обнаружили, что если у вас есть папка Kotlin source set, она также должна работать. Я ничего не нашел об этом подходе - у вас есть ссылка на то, что нужно изменить, чтобы использовать этот подход?
 – 
Darwind
13 Июн 2018 в 13:22
У меня нет сохраненных ссылок, и я не знаю наверняка, будет ли что-то делать с использованием отдельных исходных наборов, поскольку в этом нет необходимости. Думаю, это, наверное, ошибка. К счастью, это случилось только тогда. Я бы просто перешел на Kotlin, если можно.
 – 
Michael Vescovo
14 Июн 2018 в 02:50
1
Хорошо, теперь я создал ошибку в большом трекере для Android Studio с небольшим примером проекта, в котором есть точно такая же проблема. Я всегда мог конвертировать в Kotlin, но сейчас это не лучшее решение, потому что каждый раз, когда я конвертирую один файл, мне приходится конвертировать еще 10, потому что следующий файл использует файл, который находится в аромате, поэтому небольшая история заканчивается потратить день на то, что должно было занять 10 минут. У меня сейчас нет этого дополнительного времени, так как приближается крайний срок, поэтому мне придется по-прежнему придерживаться Java для некоторых функций.
 – 
Darwind
14 Июн 2018 в 11:10

1 ответ

Лучший ответ

Так что у меня была та же проблема, и я не мог просто на лету все менять на 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, но это разговор на другой день и еще один отчет об ошибке или улучшение.

15
Darwind 15 Июн 2018 в 18:05
Поскольку это было некоторое время назад, и я перешел на Kotlin, я не могу проверить, была ли это та же проблема для моего проекта и что она исправлена. Однако, поскольку, насколько мне известно, ваша проблема была идентична моей, и это решило вашу проблему, я помечу ее как принятую, как если бы вопрос был вашим. Спасибо, что разобрались и дали ответ!
 – 
Michael Vescovo
17 Июн 2018 в 05:39
На самом деле это интересный ответ, потому что, насколько я знаю, com.example.mypackage - это то же самое. Если вы нажмете «Скрыть / сжать пустые средние пакеты», выполняется преобразование туда и обратно. Так что я не вижу никакой разницы или откуда вы могли бы знать. Но он устранил вашу проблему, поэтому я верю вам на слово и знаю, что попробовать, если снова столкнусь с ней.
 – 
Michael Vescovo
17 Июн 2018 в 05:42
1
Вы спасатель! У меня был один каталог, в котором было пространство имен, а не дерево каталогов. Исправлено создание дерева каталогов в соответствии с пространством имен!
 – 
Carlos Ferreira
17 Ноя 2018 в 18:01
Добро пожаловать - я рад слышать, что есть и другие люди, у которых была такая же проблема ;-)
 – 
Darwind
19 Ноя 2018 в 01:23
1
Исправлена ​​и моя проблема. Избавило меня от стирания зубов и выдергивания волос. Спасибо!
 – 
George Baker
13 Авг 2021 в 18:35