Gradle EAR 与来自其他项目的传递库

标签 gradle dependencies project ear libs

Gradle 构建脚本会创建一个 EAR 文件,其中包含一些 jars 和一个 war。这一切之前都是在 Maven 中完成的,现在是迁移到 Gradle 的主题。

环境:

  • Gradle 1.12
  • Groovy 2.2.1
  • Java 1.7.0_60 甲骨文
  • Eclipse 开普勒 SR 2

  • 问题:

    ... 很简单:到目前为止它可以工作 - ear 插件创建包含所有模块文件的 ear 文件
    deploy project(:core)
    

    在“dependencies”部分中,“core-0.0.1.jar”位于ear-root,并且在application.xml中创建了一个模块条目。
    现在我发现运行时库不包含在 ear 文件中。所以我改变了(根据docu)包含
    earlib project(:core)
    

    并找到了 libs 目录中的库,如 ear 插件配置中的“libDirName”属性中所述。
    但是现在 application.xml 中没有模块条目,并且“core-0.0.1.jar”在 libs 目录中。

    期望的

    我们希望 core-0.0.1.jar 作为 ear 根目录中的模块和 libs 目录中的所有运行时库 - 没有来自模块本身的 jar! (core-0.0.1.jar 不是 war !)就像这样......
    [APP.EAR]  
    |--/libs  
    |  |-- log4j.jar  
    |  |-- commons.jar  
    |  |>> app-core.0.0.1.jar <<== NOT !
    |  
    |-app-core-0.0.1.jar <== OK!  
    |-app-xy-0.0.1.jar  
    |-app-abc-0.0.1.war 
    

    问题

    这是我对 EAR 概念的根本缺乏理解,还是 Gradle 本身不能按照我们想要的方式运行?
    或者这个小而简单的步骤可能需要更复杂的配置?

    最佳答案

    我自己找到了解决方案..在尝试了其他帖子的许多“解决方案”之后。
    这是我所做的,它是其他人的组合:

    在核心项目中

    我创建了一个提供的配置——因此这些依赖项不会出现在编译配置中——并将其添加到项目的类路径中。所以它们在编译类路径中,但不在编译配置中!我为我所有的项目都这样做了。

    // Libs need for compilation, but not to be published with EAR 
    configurations { provided } 
    
    dependencies {
        provided 'javax:javaee-api:6.0'
        provided 'org.slf4j:slf4j-api:1.7.7'
    
        compile 'com.application:application-common:1.4.5-SNAPSHOT'
    }
    
    configurations.provided.each { logger.debug("PROVIDED::core:  $it\n") }
    
    // Include the PROVIDED libs into compile classpath
    sourceSets { 
        main {  compileClasspath += configurations.provided }
    }
    

    在 EAR 项目中

    我必须为模块条目和根 jar 包含“部署项目..”。
    对于传递库,我使用“earlib 项目...,配置:'compile'”来确保只有编译配置中的文件(因此它们对于运行 jar 是必需的)被复制到耳朵中。
    apply plugin: 'ear' 
    
    dependencies { 
        // INCLUDE AS A MODULE with entry in application.xml 
        deploy project(path: ':core')
        // INCLUDE the TRANSITIVE LIBRARIES FOR RUNTIME not provided
        earlib project(path: ':core', configuration: 'compile')
    } 
    
    ear { .... 
    } 
    

    就这样!

    为此,我不得不说.... GRADLE ROCKS!!!!

    关于Gradle EAR 与来自其他项目的传递库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24366424/

    相关文章:

    c# - 如何以编程方式创建 ASP.NET MVC 项目?

    c# - 确定来自另一个项目的窗体是否打开

    php - 创建一个 PHP 以在运行脚本后重定向用户

    java - gradle: java: 找不到系统 Java 编译器

    dependencies - 如何在gradle中的一条指令中将多个项目依赖项添加到配置中

    gradle - 带有 Spring 和 gradle 的 Mongo QueryDSL

    console - 在控制台中记录 requirejs 的依赖关系

    spring - 依赖spring-boot-starter-test在多模块maven项目中没有继承

    flutter - flutter :从 flutter 应用程序构建apk失败

    android - 找不到Gradle DSL方法: 'multiDexEnabled()'