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

How should the gradle build scripts be to modularize this application?

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

我决定将相同的概念应用于 Griffon 框架中名为 minimalistic build, source code: sources 的示例应用程序。我选择这个应用程序是因为它遵循正常的应用程序结构而不是 Griffon 的,我试图填补 Griffon 多项目构建文档中的空白(恕我直言):它有一个使用 Open-Dolphin、Swing、JavaFX、Servlet 的示例我觉得学习基础知识太复杂了。

当然我撞墙了很多次...

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[ 的内容应该是什么=41=] 文件。

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

谢谢!

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

问题是由于service项目中缺少资源文件引起的。您会在 view 项目中发现类似的问题。这是因为所有资源文件都已移动到另一个位置(resources 项目)。将应用程序拆分为子项目之前没有问题,因为所有资源都在正确的位置。

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

$ cd service
$ mkdir -p src/test/resources
$ touch src/test/resources/Config.properties
$ mkdir -p src/main/resources
$ mv ../resources/src/main/resources/messages.properties src/main/resources/

$ cd ../view
$ mkdir -p src/test/resources
$ touch src/test/resources/Config.properties

这应该足以使测试再次通过。