Статический метод в сопутствующем объекте помещается в охватывающий класс. Так что в вашем случае MyApp
. Это верно независимо от того, что вы назовете сопутствующий объект, и вам не нужно ссылаться на спутника каким-либо образом при запуске класса.
Поэтому ваш код верен, если предположить, что верно следующее:
- У вас есть плагин приложения применяется в вашем Gradle
- Вы назвали ваш пакет, содержащий код, указанный выше в качестве
path.to.application
(не показывать пакет заявление)
- вы получаете класс не найдена ошибка для
path.to.application.MyApp
и что соответствует # 2, (вы не показывают фактическую ошибку от Gradle)
- вы работаете правильно Gradle задачу (что задача, которую вы Runni ng?)
- Код действительно скомпилирован, просмотр ваших последних комментариев указывает на то, что у вас, вероятно, была ошибка компилятора (метод не доступен из сопутствующего), что означает, что вы не смогли запустить что-то еще не скомпилированное.
Что вы можете сделать, чтобы проверить имя класса является правой кнопкой мыши на main()
метода в IntelliJ IDEA и выбрать create path.to.app...
опции меню, которое чуть ниже ПУСК/опций отладки и когда открывает диалоговое окно конфигурации во время выполнения вы можете увидеть полные classname. Это должно быть то же самое, что и в вашем «Грейдле». Если у вас уже есть конфигурация во время выполнения, просто просмотрите полное имя класса. Если это не работает, проблема возникает в другом месте, и вам необходимо предоставить отсутствующую информацию (какая задача Gradle, какова фактическая ошибка, что такое оператор пакета для класса)
Некоторая информация отсутствует в вопросе о том, что поможет сузить это.
Этот пример:
package org.test.kotlin
class MyApp {
companion object Launcher {
@JvmStatic
fun main(args: Array<String>) {
println("hello")
}
}
}
Прекрасно работает при выполнении класса org.test.kotlin.MyApp
Так делает это, без слова Launcher
:
package org.test.kotlin
class MyApp {
companion object {
@JvmStatic
fun main(args: Array<String>) {
println("hello")
}
}
}
И это работает случайно, но не делать то, что как вы ожидали, но создает вложенный класс и добавляет там статичность и запускается с использованием класса org.test.kotlin.MyApp.Launcher
. Если это работает, то вопрос не показывает фактическое основное имя класса, который он использует, что не удается:
package org.test.kotlin
class MyApp {
object Launcher {
@JvmStatic
fun main(args: Array<String>) {
println("hello")
}
}
}
О возможных ошибках компилятора (# 5 выше): В своем коде вы ссылаться на launch()
методе которые вы не показываете, возможно, это в классе предков. Но вы не создали экземпляр любого класса. Таким образом, это произойдет с ошибкой компилятора. Измените это:
class MyApp: App() {
override val primaryView = MyView::class
companion object {
@JvmStatic
fun main(args: Array<String>): Unit {
MyApp().launch(*args)
}
}
}
Подобные советы в этих других связанных с этим вопросов:
Я думаю, вам нужно «path.to.application.MyApp.Companion» – CaseyB
Является ли пакет для 'MyApp' таким же, как' path.to.application'? В директивах пакета Kotlin не обязательно сопоставлять местоположения файлов. – mfulton26
'mainClassName' правильно, если' path.to.application' является правильным именем пакета. Именование компаньона или нет не влияет на статический метод, который всегда находится на 'MyApp'. Вы можете проверить это в Intellij, щелкнув правой кнопкой мыши на главном и выбрав «create com.bla.bla ...» для новой конфигурации и видя выбранное имя класса. Вы точно не указали имя пакета MyApp и не указали точную ошибку. Поэтому мы не можем быть уверены. Пожалуйста, поделитесь недостающими частями головоломки. –