Gradle项目/任务依赖&战争中的JavaScript lib

时间:2014-08-13 14:26:45

标签: grails gradle dependencies

我们刚刚开始使用Gradle并且确实有一些(noob)问题 - 希望有人可以对这些问题有所了解:)

我们正在使用Angular和Grails来构建我们的网络应用。我们希望尽可能模块化,因此将所有与Angular相关的工件(主要是* .js和* .html文件)放在Gradle多项目构建中的单独项目中。

我们的项目结构如下:

- root
-- build.gradle
-- settings.gradle
|-- web-grails (grails project)
|----- build.gradle
|-- web-js-html (angular / js / html sources)
|----- build.gradle

首先,我们只想相应地打包web-js-html项目。到目前为止我们提出的建议(其他非常受欢迎的建议)是对它应用webjars结构,即在/ META-INF / resources下有一个带有所需资源的.jar文件。在线,我们发现以下配置似乎工作正常:

// file :web-js-grails/build.gradle
apply plugin: 'java'

ext {
    webjarconfig = [
            staticHTMLFilesDir : "${projectDir}/src/main/webfrontend",
            baseDir: "META-INF/resources/",
            subDir : "webjars/" + deployed_app_name
    ]
}

configurations {
    webjar
}

task webjar(type: Jar, dependsOn: 'jar') {
    from(fileTree(webjarconfig.staticHTMLFilesDir)) {
        into webjarconfig.baseDir + webjarconfig.subDir
    }
    outputs.file archivePath
}


artifacts {
    webjar(webjar.archivePath) {
        type 'jar'
        builtBy webjar
    }
}

通过调用' gradle webjar',可以在正确的位置创建jar文件。

问题1: 我所期望的是,如果我调用了#gradle build',这个jar也会被正确创建。据我了解,' gradle build'是一个由java插件定义的任务,在某些时候,它会调用' jar'任务。一旦那个' jar'任务完成后,我希望调用webjar任务。但事实并非如此,很明显我错过了一些东西。它是否遵循webjar只有在显式调用时才会被执行(从命令行或在build.gradle文件中)?

现在,我们希望将webjar包含在web-grails war-file中。以下配置:web-grails / build.gradle如下:

apply plugin: "grails"

repositories {
    mavenLocal()
    maven { url artifactory_url }
}

buildscript {
    repositories {
        mavenLocal()
        maven { url artifactory_url }
    }

    dependencies {
        classpath 'org.grails:grails-gradle-plugin:2.0.1-SNB1'
    }
}

grails {
    grailsVersion = '2.3.8'
    groovyVersion = '2.3.0'
}

dependencies {
    bootstrap 'org.grails.plugins:tomcat:7.0.50'
    compile project(':web-js-html')
}

在尝试错误和相当多的阅读之后,我得出了这个(可能是错误的)结论:当我调用' gradle build' on:web-grails,然后(我假设):也将在引用的:web-js-html项目上调用build。我这样说是因为jar在build / lib文件夹中重新创建,但显然不使用webjar-task。因此,生成的jar仅包含MANIFEST.MF。

问题2: 在这种情况下我是否正确使用Gradle并且我只是监督一件小事,或者整个方法是否有问题?如何正确地将:web-js-html jar放入战争?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您定义新工件的部分对我没有任何意义。变化

artifacts {
    webjar(webjar.archivePath) {
        type 'jar'
        builtBy webjar
    }
}

artifacts {
    webjar webjar
}

也许您应该重命名配置或任务。但是第一个webjar是您的配置,第二个是您创建新jar的任务。 请注意,这将创建一个新工件,因此您必须使用

为其指定一个不同的名称
task webjar(type: Jar, dependsOn: 'jar') {
    baseName = 'newJar'
    from(fileTree(webjarconfig.staticHTMLFilesDir)) {
        into webjarconfig.baseDir + webjarconfig.subDir
    }
    outputs.file archivePath
}

但我认为你不想创建第二个jar,而是改变原来的jar。在这种情况下,您不必编写新任务,而是配置默认的jar任务,如下所示:

jar {
    from(fileTree(webjarconfig.staticHTMLFilesDir)) {
        into webjarconfig.baseDir + webjarconfig.subDir
    }
    outputs.file archivePath
}