2016-03-02 2 views
-1

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

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' 

EDIT

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

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

+0

Я думаю, вам нужно «path.to.application.MyApp.Companion» – CaseyB

+1

Является ли пакет для 'MyApp' таким же, как' path.to.application'? В директивах пакета Kotlin не обязательно сопоставлять местоположения файлов. – mfulton26

+1

'mainClassName' правильно, если' path.to.application' является правильным именем пакета. Именование компаньона или нет не влияет на статический метод, который всегда находится на 'MyApp'. Вы можете проверить это в Intellij, щелкнув правой кнопкой мыши на главном и выбрав «create com.bla.bla ...» для новой конфигурации и видя выбранное имя класса. Вы точно не указали имя пакета MyApp и не указали точную ошибку. Поэтому мы не можем быть уверены. Пожалуйста, поделитесь недостающими частями головоломки. –

ответ

3

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

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

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

Что вы можете сделать, чтобы проверить имя класса является правой кнопкой мыши на 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) 
     } 
    } 
} 

Подобные советы в этих других связанных с этим вопросов:

+0

Спасибо, это очень полезно. – tmn

Смежные вопросы