Intereting Posts
Тип функции с приемником в Scala Каковы ограничения на динамическую / двойную отправку в Котлин? Kotlin: обходной путь для no lateinit при использовании настраиваемого сеттера? Как использовать джексон для десериализации в коллекциях Котлина Как указать @Throws для свойства в интерфейсе Что делает ключевое слово reified в Kotlin? Контрактное тестирование DSL неправильное поведение / ошибка Как использовать onItemLongClickListener в моей деятельности в Android? Должны быть объявлены локальные функции Котлина перед использованием Тревога Котлина и дженериков Встроенный псевдоним для функции Kotlin, который включает в себя дженерики? Точка останова не попадает внутрь обратного вызова Kotlin в Intellij Переопределение активателя имущества Котлина приводит к двум JPA @Id Чем отличаются код A и код B в Котлине? Связывание представления с изменяющимся свойством контроллера

Обеспечение компиляции статического метода внутри подкласса с Kotlin?

Есть ли способ, который я могу скомпилировать метод main() статически внутри существующего класса в Котлине? Я пытаюсь заставить Gradle построить это как приложение с помощью метода main() , но мне не повезло. Я пробовал несколько обходных путей тоже …

 class MyApp: App() { override val primaryView = MyView::class companion object Launcher { @JvmStatic fun main(args: Array<String>): Unit { launch(*args) } } } 

В моем сценарии Gradle я пытаюсь указать, что класс MyApp имеет метод main() . Он ошибается и не может найти класс, однако, когда я вызываю run .

 mainClassName = 'path.to.application.MyApp' 

РЕДАКТИРОВАТЬ

Я извиняюсь за путаницу, но часть моей проблемы может иметь отношение к подклассу и не обязательно найти класс main() .

Для функции main() необходим доступ к методу launch() который определен в App . По какой-то причине установка ключевого слова companion запрещает это: / Можем ли мы переосмыслить downvotes, если эта информация релевантна?

Статический метод в сопутствующем объекте помещается в охватывающий класс. Так что в вашем случае MyApp . Это верно независимо от того, что вы назовете сопутствующий объект, и вам не нужно ссылаться на спутника каким-либо образом при запуске класса.

Поэтому ваш код правильный, если верно следующее:

  1. У вас есть плагин приложения, примененный в вашем Gradle
  2. Вы назвали свой пакет, содержащий код выше, как path.to.application (вы не показываете оператор пакета)
  3. Вы получаете ошибку класса не найденной для path.to.application.MyApp и которая соответствует # 2 (вы не показываете фактическую ошибку из Gradle)
  4. Вы выполняете правильную задачу градиента (какая задача выполняется?)
  5. Код действительно скомпилирован, глядя на ваши последние комментарии, указывает, что у вас, вероятно, была ошибка компилятора launch() метод launch() недоступен из сопутствующего), что означает, что вы не могли запустить что-то еще не составленное.

Что вы можете сделать, чтобы проверить имя класса, это щелкнуть правой кнопкой мыши по методу main() в Intellij IDEA и выбрать create path.to.app... меню create path.to.app... который находится чуть ниже параметров запуска / отладки, и когда это откроет диалог конфигурации среды выполнения, вы можно увидеть полное имя класса. Это должно быть то же самое, что и в вашем «Грейдле». Если у вас уже есть конфигурация во время выполнения, просто просмотрите полное имя класса. Если это не сработает, проблема в другом месте, и вам нужно предоставить отсутствующую информацию (какая задача Gradle, какова фактическая ошибка, что такое оператор пакета для класса)

Некоторая информация отсутствует в вопросе, который поможет уменьшить это.

Этот пример:

 package org.test.kotlin class MyApp { companion object Launcher { @JvmStatic fun main(args: Array<String>) { println("hello") } } } 

org.test.kotlin.MyApp работает при запуске класса 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) } } } 

Подобные советы приведены в следующих смежных вопросах:

  • На ваш вопрос о том, как запустить, отвечает другой вопрос SO: https://stackoverflow.com/a/26402542/3679676
  • Как запустить класс Kotlin из командной строки?
  • как запустить скомпилированный файл класса в Котлине?