grails - Gradle 项目/任务依赖和 JavaScript 库在 war 中

标签 grails gradle dependencies

我们刚刚开始使用 Gradle,确实有一些(菜鸟)问题 - 希望有人能够阐明这些问题:)

我们使用 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 文件中。 :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')
}

经过反复尝试和大量阅读后,我得出了这个(可能是错误的)结论:当我在 :web-grails 上调用“gradle build”时,那么(我假设):build 也会被调用在引用的 :web-js-html 项目上。我这样说是因为 jar 是在 build/lib 文件夹中重新创建的,但显然没有使用 webjar-task。因此,生成的 jar 仅包含 MANIFEST.MF。

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

提前感谢您的帮助!

最佳答案

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

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
}

关于grails - Gradle 项目/任务依赖和 JavaScript 库在 war 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25288826/

相关文章:

java - 函数 Completable Future 上的 gradle 不兼容错误

android - 升级gradle之后:程​​序类型已经存在:net.jcip.annotations.GuardedBy

unit-testing - Grails 3 Controller 单元测试:域类验证在ControllerUnitTest中不起作用

unit-testing - 在同一项目中使用GrailsUnitTestCase和Spock规范

mongodb - MongoDB身份验证无法在Grails中运行,但可以通过控制台进行

java - Gradle 在单元测试期间运行 flywayMigration

grails - 在Grails集成测试中将对象放在请求上

shell - Jenkins 执行 shell 找不到 gradle 命令

maven - 在 Maven 程序集中为依赖项创建符号链接(symbolic link)

iphone - 有没有办法将 Maven + 静态库用于 iPhone 依赖项?