Как объединить ScalaFXML с Gradle? - PullRequest
0 голосов
/ 29 июня 2018

Позвольте мне сначала установить мою конечную цель: Я хочу создать приложение с графическим интерфейсом только для Scala, которое я могу спроектировать с помощью построителя сцен и более позднего порта с глюоном для любой платформы, которую я хочу.

Мне удалось выяснить, что для этого нужно использовать JavaFXPorts в Scala. Я также узнал, что мне нужно использовать gradle для успешного применения глюона, или, кажется, так (пожалуйста, поправьте меня, если я ошибаюсь, потому что именно здесь начинается головная боль)

Короче говоря, это означает: ScalaFXML и Gradle должны работать вместе, но как?

Я нашел несколько интересных проектов, но, к сожалению, ни один из них не подошел по моим критериям:

  • Этот один использовал JavaFX вместо ScalaFX
  • Этот один добавил Java к проекту вместо использования чистого scala

После долгих поисков я нашел проект , который был почти прав. К сожалению, это было построено в SBT, а не в Gradle. Тем не менее я использовал этот проект в качестве основы / примера, поскольку он был первым, кто использовал sfxml так, чтобы это было легко понять.

У меня есть скрипт gradle, который почти работает

buildscript {
    repositories {
        mavenLocal()
        jcenter()
    }

    dependencies {
        // during build, we depend on the jfxmobile-plugin
        classpath 'org.javafxports:jfxmobile-plugin:1.3.10'
    }
}

plugins {
    id 'java'
    id 'scala'
    id 'application'
}
apply plugin: 'org.javafxports.jfxmobile'

configurations {
    scalaCompiler
    scalaCompilerPlugin
}
configurations.scalaCompiler.transitive = false


compileScala.targetCompatibility = "1.8"


mainClassName = 'sfxml.Main'

repositories {
    mavenCentral()
    jcenter()
    maven {
        url 'http://nexus.gluonhq.com/nexus/content/repositories/releases'
    }
}

dependencies {
    compile 'org.scala-lang:scala-library:2.12.6'
    compile 'org.scala-lang:scala-compiler:2.12.6'

    compile 'com.gluonhq:particle:1.1.3'

    compile group: 'org.scalafx', name: 'scalafx_2.12', version: '8.0.144-R12'
    compile group: 'org.scalafx', name: 'scalafxml-core-sfx8_2.12', version: '0.4'
    compile group: 'org.scalamacros', name: 'paradise_2.12.6', version: '2.1.1'

    scalaCompiler "org.scalamacros:paradise_2.12.6:2.1.1"

    testCompile group: 'junit', name: 'junit', version: '4.12'
}

tasks.withType(ScalaCompile) {
    scalaCompileOptions.additionalParameters = [
            "-Xplugin:" + configurations.scalaCompilerPlugin.asPath,
            "-Ymacro-debug-lite"
    ]
    options.compilerArgs = ["-Xdebug", "-agentlib:jdwp=transport=dt_socket,server=n,suspend=y,address=9999"]
}

После окончательного поиска всех нужных репозиториев (или, как мне показалось), никаких ошибок не было отмечено во время процесса импорта из IDEA, но, наконец, я получил следующую ошибку:

Error:(10, 7) macro annotation could not be expanded (the most common reason for that is that you need to enable the macro paradise plugin; another possibility is that you try to use macro annotation in the same compilation run that defines it)
class AdoptionFormPresenter(private val sizeTextField: TextField,

Но, как вы уже поняли - если вы читали скрипт gradle - я уже пытался включить плагин. Так как мне это исправить и достичь цели, поставленной в начале?

Кстати: я уже нашел следующие решения, но они также не работали

  • Этот использует maven, но я хочу использовать gradle, так ... thx google?
  • Это к сожалению не работает
  • Это к сожалению ... тоже не работает: /

Сноска. Все SDK были недавно загружены на момент публикации

1 Ответ

0 голосов
/ 29 июня 2018

Так что после пересмотра моего скрипта gradle и проверки по ранее упомянутым рабочим областям я обнаружил свою ошибку.

Я не включил полный ответ от здесь . Поэтому после редактирования моего build.gradle, чтобы он включал только необходимые вещи, я получил следующее:

plugins {
    id 'java'
    id 'scala'
}
apply plugin: 'org.javafxports.jfxmobile'

configurations {
    scalaCompiler
}
configurations.scalaCompiler.transitive = false


compileScala.targetCompatibility = "1.8"

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    compile 'org.scala-lang:scala-library:2.12.6'

    compile group: 'org.scalafx', name: 'scalafx_2.12', version: '8.0.144-R12'
    compile group: 'org.scalafx', name: 'scalafxml-core-sfx8_2.12', version: '0.4'

    scalaCompiler "org.scalamacros:paradise_2.12.6:2.1.1"

    testCompile group: 'junit', name: 'junit', version: '4.12'
}

def String scalaCompilerOptions="-Xplugin:$configurations.scalaCompiler.singleFile.path"
compileScala.scalaCompileOptions.additionalParameters = [scalaCompilerOptions]
compileTestScala.scalaCompileOptions.additionalParameters = [scalaCompilerOptions]

Этот скрипт запустит этот проект с gradle вместо sbt.

Примечание: Если появляется сообщение об ошибке «Не удается загрузить ресурс: AdoptionForm.fxml», прочитайте следующее post

Я еще не выполнил свою ранее заявленную цель, поскольку пока не использовал глюон. Но основная проблема этого поста решена, поэтому я отмечу это как правильный ответ.

Я мог бы добавить интеграцию глюонов позже, если я заставлю ее работать.

...