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

问题描述:

我正在尝试应用书中的示例Gradle in Action以了解如何将gradle应用程序分离为子项目。我在书中做了一个例子,一切都很顺利。Gradle构建脚本应如何模块化此应用程序?

我决定将相同的概念应用于Griffon框架的示例应用程序minimalistic build,源代码:sources。我之所以选择这个应用程序,是因为它遵循正常的应用程序结构而不是Griffon的,我试图填补Griffon的文档中的缺陷(恕我直言),以便进行多项目构建:它有一个使用Open-Dolphin,Swing,JavaFX,Servlet的实例我觉得学习基础太复杂了。

当然我撞到墙上大的时候,多次...

格里芬的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 

我不知道这个结构是否更有意义,但是我最初想到的结构。

不顾一切我想我不能建立这个项目,我想知道如果有人能告诉我,如果我犯了一个错误与子项目的选择,什么应该是构建文件的内容。

我创建了重排后的源here保持原有的build.gradle文件原封不动一个zip文件,具有settings.gradle文件,使摇篮正确识别新的结构。

谢谢!

该问题是由于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 

这应该足以使再次测试绿色。

Marcelo, 我已经发布了一个新版本的多项目构建here。此版本在根级别保留常用设置,在每个子项目的构建文件上留下特定于每个子项目的内容。

+0

嗨安德烈斯,非常感谢你看看这个。该项目运行良好,但我无法测试它。 我添加了一个缺少testCompile依赖到service-build.gradle(“org.codehaus。griffon:griffon-core-test:$ {griffonVersion}“)来允许测试编译,但是如果我测试项目,那么在服务测试运行时它会失败。 –