【问题标题】:Gradle EAR with transitive libs from other projectsGradle EAR 与来自其他项目的传递库
【发布时间】:2014-06-23 12:50:30
【问题描述】:

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

环境:

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

问题:

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

deploy project(:core)

在“依赖项”部分中,“core-0.0.1.jar”位于 ear-root 中,并且在 application.xml 中创建了一个模块条目。 现在我发现运行时库不包含在 ear 文件中。所以我(根据文档)将包含更改为

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 不是战争!)就像这样......

[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 本身不能按照我们想要的方式运行? 或者这个小而简单的步骤可能需要更复杂的配置?

【问题讨论】:

  • 据我了解,您应该只在 ear/lib 中放入部署在 ear 文件中的所有模块使用的这些库。我想core 项目是根据战争文件构建的。对于war 插件,请参阅providedCompileprovidedRuntime
  • 谢谢蛋白石。你是对的,我们只想要 /libs 下的 core.jar 的传递库。不,core.jar 是一个 JAR 不是 WAR。

标签: gradle dependencies project ear libs


【解决方案1】:

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

在核心项目中

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

// 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!!!!

【讨论】:

    【解决方案2】:

    如果 ear 模块之间存在编译时依赖关系,则可接受的解决方案会失败。这就是我在 Gradle 2.14 中解决它的方法。希望这对某人有所帮助。

    apply plugin: 'ear'
    
    def deployedModules = [ 'projectA', 'projectB', 'projectC' ]
    
    deployedModules.forEach {
        def projectPath = ":${it}"
    
        evaluationDependsOn(projectPath)
    
        dependencies.add('deploy', dependencies.project(path: projectPath,
                                                        configuration: 'archives'))
        findProject(projectPath).configurations.runtime.allDependencies.forEach {
            boolean isEarModule = it instanceof ProjectDependency &&
                    (it as ProjectDependency).dependencyProject.name in deployedModules
            if (!isEarModule) {
                dependencies.add('earlib', it)
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-01-12
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      相关资源
      最近更新 更多