如何将 ScalaFXML 与 Gradle 结合起来?

How does one combine ScalaFXML with Gradle?

让我先设定我的最终目标: 我想构建一个仅限 scala 的 gui 应用程序,我可以使用 scene builder and later port with gluon 设计到我想要的任何平台。

我发现,需要在 Scala 中使用 JavaFXPorts 才能做到这一点。我还发现我需要使用 gradle 才能成功应用胶子,或者看起来是这样(如果我错了请纠正我,因为那是头痛的开始)

简而言之,这意味着:ScalaFXML 和 Gradle 需要一起工作,但是如何?

我发现了一些有趣的项目,但遗憾的是 none 其中恰好符合我的标准:

找了半天找到一个project,差不多对了。遗憾的是,这是在 sbt 中构建的,而不是在 gradle 中构建的。 None 我将该项目用作 base/example 的次数越少,因为这是第一个以易于理解的方式使用 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 脚本 - 我已经尝试启用该插件。那么我该如何解决这个问题并实现开头所述的目标呢?

顺便说一句:我已经找到了以下解决方案,但这些都不起作用

脚注:所有 SDK 都是在本文发布时全新下载的

所以在重新访问我的 gradle 脚本并检查之前提到的工作环境后,我发现了我的错误。

我没有包含 here 的完整答案。因此,在将我的 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]

该脚本将 运行 this project 与 gradle 而不是 sbt。

旁注: 如果您收到错误 "Cannot load resource: AdoptionForm.fxml",请阅读以下内容 post

我还没有完成我之前设定的目标,因为我现在还没有使用 gluon。但是这个post的主要问题已经解决了,所以我会把这个标记为正确答案。

如果可以的话,我可能会在稍后添加胶子集成。