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

mar*_*lin 8 ear dependencies project libs gradle

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

ENV:

  • Gradle 1.12
  • Groovy 2.2.1
  • Java 1.7.0_60 Oracle
  • Eclipse Kepler SR 2

问题:

...很简单:它到目前为止工作 - 耳塞创建了包含所有模块文件的ear文件

deploy project(:core)
Run Code Online (Sandbox Code Playgroud)

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

earlib project(:core)
Run Code Online (Sandbox Code Playgroud)

并从ear插件配置中的"libDirName"属性中找到了libs目录中的libs.但是现在application.xml中没有模块条目,而"core-0.0.1.jar"在libs目录中.

期望

我们希望core-0.0.1.jar作为ear根目录中的模块和libs目录中的所有运行时库 - 没有来自模块本身的jar!(core-0.0.1.jar不是战争!)就像这样......

[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 
Run Code Online (Sandbox Code Playgroud)

这是对我的EAR概念的基本缺乏理解还是为什么Gradle本身不按我们想要的方式行事?或者这个简单的步骤可能需要更复杂的配置吗?

mar*_*lin 8

在尝试了很多很多来自其他帖子的"解决方案"后,我自己找到了解决方案.这是我做的,它是其他人的组合:

在CORE PROJECT中

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

// 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 }
}
Run Code Online (Sandbox Code Playgroud)

在EAR PROJECT中

我必须为模块入口和根jar包括"deploy project ..".对于传递的lib,我使用了"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 { .... 
} 
Run Code Online (Sandbox Code Playgroud)

就这样!

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