gradle构建脚本应该如何模块化这个应用程序?

时间:2016-08-16 15:07:17

标签: gradle refactoring javafx-8 multi-project griffon

我正在尝试应用 Gradle in Action 一书中的示例来学习如何将gradle应用程序分成子项目。我在书中做了一个例子,一切都很顺利。

我决定将相同的概念应用于Griffon Framework中名为minimalistic build的示例应用程序,源代码:sources。我选择了这个应用程序,因为它遵循正常的应用程序结构而不是Griffon的,我试图填补Griffon的多项目构建文档中的差距(IMHO):它有一个使用Open-Dolphin,Swing,JavaFX,Servlets的exaple我觉得学习基础知识太复杂了。

当然,我多次碰到大墙时间......

Griffon的JavaFX应用程序具有以下结构:

├── build.gradle
├── config
│   └── HEADER
├── gradle
│   ├── functional-test.gradle
│   ├── integration-test.gradle
│   ├── javafx-plugin.gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── src
    ├── functional-test
    │   └── java
    │       └── org
    │           └── example
    │               └── SampleFunctionalTest.java
    ├── integration-test
    │   └── java
    │       └── org
    │           └── example
    │               └── SampleIntegrationTest.java
    ├── main
    │   ├── java
    │   │   ├── Config.java
    │   │   └── org
    │   │       └── example
    │   │           ├── Launcher.java
    │   │           ├── SampleController.java
    │   │           ├── SampleModel.java
    │   │           ├── SampleService.java
    │   │           └── SampleView.java
    │   └── resources
    │       ├── application.properties
    │       ├── griffon-icon-128x128.png
    │       ├── griffon-icon-16x16.png
    │       ├── griffon-icon-24x24.png
    │       ├── griffon-icon-256x256.png
    │       ├── griffon-icon-32x32.png
    │       ├── griffon-icon-48x48.png
    │       ├── griffon-icon-64x64.png
    │       ├── griffon.png
    │       ├── log4j.properties
    │       ├── messages.properties
    │       ├── META-INF
    │       │   └── griffon
    │       │       ├── griffon.core.artifact.GriffonController
    │       │       ├── griffon.core.artifact.GriffonModel
    │       │       ├── griffon.core.artifact.GriffonService
    │       │       └── griffon.core.artifact.GriffonView
    │       ├── org
    │       │   └── example
    │       │       └── sample.fxml
    │       └── resources.properties
    └── test
        └── java
            └── org
                └── example
                    ├── SampleControllerTest.java
                    └── SampleServiceTest.java

build.gradle 文件内容为:

// tag::plugins[]
plugins {
    id 'java'
    id 'idea'
    id 'com.github.ben-manes.versions' version '0.12.0'
    id 'com.github.hierynomus.license' version '0.11.0'
}

apply from: 'gradle/javafx-plugin.gradle'
apply from: 'gradle/integration-test.gradle'
apply from: 'gradle/functional-test.gradle'
// end::plugins[]

// tag::javafx[]
javafx {
    mainClass = 'org.example.Launcher'
}
// end::javafx[]

// tag::dependencies[]

repositories {
    jcenter()
    mavenLocal()
}

dependencies {
    compile "org.codehaus.griffon:griffon-javafx:${griffonVersion}"
    compile "org.codehaus.griffon:griffon-guice:${griffonVersion}"

    runtime('log4j:log4j:1.2.17') {
        exclude group: 'ant',         module: 'ant-nodeps'
        exclude group: 'ant',         module: 'ant-junit'
        exclude group: 'ant-contrib', module: 'ant-contrib'
    }
    runtime 'org.slf4j:slf4j-log4j12:1.7.21'

    testCompile "org.codehaus.griffon:griffon-javafx-test:${griffonVersion}"
    testCompile 'pl.pragmatists:JUnitParams:1.0.5'
    testCompile 'org.mockito:mockito-core:2.0.59-beta'
}
// end::dependencies[]

// tag::resources[]
processResources {
    from(sourceSets.main.resources.srcDirs) {
        exclude '**/*.properties'
        exclude '**/*.xml'
    }
    from(sourceSets.main.resources.srcDirs) {
        include '**/*.properties'
        include '**/*.xml'
        filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: [
            'application.name'   : project.name,
            'application.version': project.version,
            'griffon.version'    : griffonVersion
            ])
    }
}
// end::resources[]

license {
    header = rootProject.file('config/HEADER')
    strictCheck = true
    ignoreFailures = true
    mapping {
        java = 'SLASHSTAR_STYLE'
        fxml = 'XML_STYLE'
    }
    ext.year = '2016'
    exclude '**/*.png'
}

我试图实现的结构是:

├── build.gradle
├── config
│   └── HEADER
├── gradle
│   ├── functional-test.gradle
│   ├── integration-test.gradle
│   ├── javafx-plugin.gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── launcher
│   ├── launcher-build.gradle
│   └── src
│       └── main
│           └── java
│               ├── Config.java
│               └── org
│                   └── example
│                       └── Launcher.java
├── resources
│   ├── resources-build.gradle
│   └── src
│       └── main
│           └── resources
│               ├── application.properties
│               ├── griffon-icon-128x128.png
│               ├── griffon-icon-16x16.png
│               ├── griffon-icon-24x24.png
│               ├── griffon-icon-256x256.png
│               ├── griffon-icon-32x32.png
│               ├── griffon-icon-48x48.png
│               ├── griffon-icon-64x64.png
│               ├── griffon.png
│               ├── log4j.properties
│               ├── messages.properties
│               └── resources.properties
├── service
│   ├── resources
│   │   └── META-INF
│   │       └── griffon
│   │           └── griffon.core.artifact.GriffonController
│   ├── service-build.gradle
│   └── src
│       ├── main
│       │   └── java
│       │       └── org
│       │           └── example
│       │               └── SampleService.java
│       └── test
│           └── java
│               └── org
│                   └── example
│                       └── SampleServiceTest.java
├── settings.gradle
└── view
    ├── src
    │   ├── functional-test
    │   │   └── java
    │   │       └── org
    │   │           └── example
    │   │               └── SampleFunctionalTest.java
    │   ├── integration-test
    │   │   └── java
    │   │       └── org
    │   │           └── example
    │   │               └── SampleIntegrationTest.java
    │   ├── main
    │   │   ├── java
    │   │   │   └── org
    │   │   │       └── example
    │   │   │           ├── SampleController.java
    │   │   │           ├── SampleModel.java
    │   │   │           └── SampleView.java
    │   │   └── resources
    │   │       ├── META-INF
    │   │       │   └── griffon
    │   │       │       ├── griffon.core.artifact.GriffonModel
    │   │       │       ├── griffon.core.artifact.GriffonService
    │   │       │       └── griffon.core.artifact.GriffonView
    │   │       └── org
    │   │           └── example
    │   │               └── sample.fxml
    │   └── test
    │       └── java
    │           └── org
    │               └── example
    │                   └── SampleControllerTest.java
    └── view-build.gradle

我不知道那个结构是否更有意义,但我是第一个想到的结构。

无论我尝试过什么,我都无法构建这个项目,我想知道是否有人可以告诉我,如果我选择子项目时出错,那么 build 文件的内容应该是什么。

我使用重新排列的源here创建了一个zip文件,保持原始 build.gradle 文件不变,并使用 settings.gradle 文件使Gradle正确认识到新的结构。

谢谢!

2 个答案:

答案 0 :(得分:1)

马塞洛, 我发布了一个新版本的多项目构建here。此版本在根级别保持常见设置,在每个子项目的构建文件中保留每个子项目的特定内容。

答案 1 :(得分:1)

问题是由for x,y in zip(firstName,lastName): print (x,y, x[0] + r'.' + y + r'@example.com') 项目中缺少资源文件引起的。你会在service项目中发现类似的问题。这是因为所有资源文件都被移动到另一个位置(view项目)。将应用程序拆分为子项目之前没有问题,因为所有资源都在正确的位置。

您可以按照以下步骤修复构建:

resources

这应该足以让测试再次变绿。