【问题标题】:Resolving gradle owned projects dependencies解决 gradle 拥有的项目依赖关系
【发布时间】:2018-03-12 20:21:36
【问题描述】:

项目结构:

root
-- 0. CAN'T add multi-project here
----\ a. ProjectCommonUtil
----\ b. ProjectWeb
----\ c. ProjectBatchUtil
----\ d. ProjectHttpClientUtil
----\ e. ProjectBatchWithMainClass
----\ lib

依赖关系:

  1. ProjectCommonUtil -> 无
  2. ProjectWeb -> a、c、d
  3. ProjectBatchUtil -> 无
  4. ProjectHttpClientUtil -> 一个
  5. ProjectBatchWithMainClass -> b, c, d(a)

不用担心开源依赖,这就是我正在努力解决的问题:

  1. 能够单独构建每个项目

    1. 依赖关系应该在 lib 文件夹 jars 中确定

      1. 如果缺少依赖jar,构建依赖并cc:jar到lib文件夹

        例如:d 取决于 a。 a 的 jar 不在 lib 文件夹中,所以构建一个然后放在 lib 文件夹中,然后构建 d

        这些是我在下面提供的包含的 build.gradle 文件

  2. 上述结构中的lib文件夹包含
    1. a、b 的罐子(是的,以罐子形式 b/c 的 e)、c、d、e
    2. b 的 Ear 文件。 ProjectWeb,在 b 中相应的 WEB-INF/lib 文件夹中包含 jars a、c、d。项目网

我无法在根项目和现有项目之间创建 gradle 多项目,也无法创建胖 jar。也许我正在尝试对 gradle 进行微观管理,但这个 #2 是我需要的,因为我需要将 web ear 部署到应用服务器和批处理(e.),并且它依赖于多个位置的多个运行 e 变体的 linux VM。使用不同的 JVM 参数。

帮助!

TIA, 比尔

一个。 ProjectCommonUtil build.gradle

/*
 * This build file was generated by the Gradle 'init' task.
 *
 * This generated file contains a commented-out sample Java project to get you started.
 * For more details take a look at the Java Quickstart chapter in the Gradle
 * user guide available at https://docs.gradle.org/4.3/userguide/tutorial_java_projects.html
 */

// +++++++++++++++++++++ ORDER IS IMPORTANT ++++++++++++++++
plugins {
    id 'base'
}


// Apply the java plugin to add support for Java
apply plugin: 'java'
//apply plugin: 'checkstyle'
apply plugin: 'jdepend'
apply plugin: 'pmd'
apply plugin: 'project-report'

build.dependsOn('copyArcCommonProjectJar', 'copyArcCommonExternalJars')
group "com.mmm.arc"
version =  '2.5.ArcCommon'

// In this section you declare where to find the dependencies of your project
repositories {
    // Use 'jcenter' for resolving your dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
}

sourceCompatibility = 1.8
targetCompatibility = 1.8   

sourceSets {
    main {
         java {
              srcDir 'src'
              }
         }
}

// Short hand form
//compileJava.doFirst { println 'In compileJava:BEGIN' }
//compileJava.doLast { println 'In compileJava:END' }

tasks.create(name: 'copyArcCommonProjectJar', type: Copy, dependsOn: 'jar') {
    into "../CommonJars/ArcProjectJars"
        from "${buildDir}/libs"
        include "*.jar"
}   
copyArcCommonProjectJar.doFirst { 
  println "${buildDir}:In copyArcCommonProjectJar:BEGIN" 

  // Remove existing jars only if build is necessary
  delete "../CommonJars/ArcProjectJars/${name}*.jar"
}
copyArcCommonProjectJar.doLast { println 'In copyArcCommonProjectJar:END' }
//copyArcCommon.outputs.upToDateWhen { false }

tasks.create(name: 'copyArcCommonExternalJars', type: Copy, dependsOn: 'dependencies') {
    into "../CommonJars"
      from configurations.runtime
    //include "*.jar"
} 
copyArcCommonExternalJars.doFirst { println 'In copyArcCommonExternalJars:BEGIN' }
copyArcCommonExternalJars.doLast { println 'In copyArcCommonExternalJars:END' }
//copyExternalJars.outputs.upToDateWhen { false }

jar {
    //baseName = 'ArcCommon'
}
jar.doFirst { println 'In jar:BEGIN' }
jar.doLast { println 'In jar:END' }
//jar.outputs.upToDateWhen { false }


// In this section you declare the dependencies for your production and test code
dependencies {
    // The production code uses the SLF4J logging API at implementation time
    // implementation 'org.slf4j:slf4j-api:1.7.25'
    // implementation 'org.slf4j:slf4j-api:+'

    // Declare the dependency for your favourite test framework you want to use in your tests.
    // TestNG is also supported by the Gradle Test task. Just change the
    // testimplementation dependency to testimplementation 'org.testng:testng:6.8.1' and add
    // 'test.useTestNG()' to your build script.
//    testimplementation 'junit:junit:4.12'

    // providedimplementation is for jars need to build but are provided at runtime
    // providedimplementation 
}

d。 ProjectHttpClientUtil build.gradle

/*
 * This build file was generated by the Gradle 'init' task.
 *
 * This generated file contains a commented-out sample Java project to get you started.
 * For more details take a look at the Java Quickstart chapter in the Gradle
 * user guide available at https://docs.gradle.org/4.3/userguide/tutorial_java_projects.html
 */

// +++++++++++++++++++++ ORDER IS IMPORTANT ++++++++++++++++
plugins {
    id 'base'
}


// Apply the java plugin to add support for Java
apply plugin: 'java'
//apply plugin: 'checkstyle'
apply plugin: 'jdepend'
apply plugin: 'pmd'
apply plugin: 'project-report'

build.dependsOn(
    'buildArcCommon',
    'copyArcProjectJar', 'copyExternalJars'
)
group "com.mmm.arc"
version =  '2.5.TekExHTTPClient'

// In this section you declare where to find the dependencies of your project
repositories {
    // Use 'jcenter' for resolving your dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
}

sourceCompatibility = 1.8
targetCompatibility = 1.8   

sourceSets {
    main {
         java {
              srcDir 'src'
              }
         }
}

task buildArcCommon(type: GradleBuild) {
    doFirst {
       println '---  Compiling ArcCommon ---'
        buildFile = '../ArcCommon/build.gradle/'
    }
   // tasks = ['build']
}

tasks.create(name: 'copyArcProjectJar', type: Copy, dependsOn: 'jar') {
    into "../CommonJars/ArcProjectJars"
        from "${buildDir}/libs"
        include "*.jar"
}   
copyArcProjectJar.doFirst { 
  println 'In copyArcCommon:BEGIN' 

  // Remove existing jars only if build is necessary
  delete "../CommonJars/ArcProjectJars/${name}*.jar"
}
copyArcProjectJar.doLast { println 'In copyArcCommon:END' }
//copyArcCommon.outputs.upToDateWhen { false }

tasks.create(name: 'copyExternalJars', type: Copy, dependsOn: 'dependencies') {
    into "../CommonJars"
      from configurations.runtime
    //include "*.jar"
} 
copyExternalJars.doFirst { println 'In copyExternalJars:BEGIN' }
copyExternalJars.doLast { println 'In copyExternalJars:END' }
//copyExternalJars.outputs.upToDateWhen { false }

//See above short hand
/*
task myTask (  ) {
   println '+++++++++++++  Compiling ArcCommon BEGIN  ++++++++++++++++'
}
*/

// Short hand form
/*
implementationJava.doFirst { 
    println '+++++++++++++  Compiling TekExHTTPClient BEGIN  ++++++++++++++++'
//  tasks = [ "buildArcCommon", "taskCopyAllTekExProjects" ]
//  dependsOn buildArcCommon, taskCopyAllTekExProjects
}

implementationJava.doLast { println '+++++++++++++  Compiling TekExHTTPClient END  ++++++++++++++++'}

//implementationJava.myTask



task taskCopyAllTekExProjects(type: Copy) {
    into 'build/libs'
    include '../ArcCommon/build/libs/*.jar'
}

//taskCopyAllTekExProjects.mustRunAfter 'buildArcCommon'

/*
task test(dependsOn: [implementation, implementationTest]) {
    doLast {
        println '+++++++++++++  Running ArcCommon Unit Tests  ++++++++++++++++'
    }
}
*/
/*
task dist(dependsOn: [implementation, test]) {
    doLast {
        println '+++++++++++++  Building ArcCommon Jar  ++++++++++++++++'

    }
}
*/

jar {
   // baseName = 'TekExHTTPClient'
}

// In this section you declare the dependencies for your production and test code
dependencies {
    // The production code uses the SLF4J logging API at implementation time
    implementation 'org.apache.httpcomponents:httpcore:+'
    implementation 'org.apache.httpcomponents:httpclient:+'
    compile fileTree (dir: '../CommonJars/ArcProjectJars')

    // Declare the dependency for your favourite test framework you want to use in your tests.
    // TestNG is also supported by the Gradle Test task. Just change the
    // testimplementation dependency to testimplementation 'org.testng:testng:6.8.1' and add
    // 'test.useTestNG()' to your build script.
//    testimplementation 'junit:junit:4.12'

    // providedimplementation is for jars need to build but are provided at runtime
    // providedimplementation 
}

【问题讨论】:

    标签: java gradle


    【解决方案1】:

    如果你稍微修改你的设置,你肯定是在与 Gradle 作斗争,并且必须补偿它会为你处理的事情。

    多项目定义可以完美地与它聚合的项目处于同一级别。只需添加一个带有build.gradlesettings.gradle 的新目录,并引用您需要集成的不同模块:

        includeFlat 'a'
        includeFlat 'b'
        includeFlat 'c'
        includeFlat 'd'
        includeFlat 'e'
    

    然后您可以表达项目之间的依赖关系,将执行必要副本的打包任务添加到 lib 文件夹等......

    【讨论】:

    • 谢谢@Louis。当我按照您的建议进行操作并仅执行“a”时,由于“..”,我现在遇到“无法规范化文件路径”。这在以前没有发生过。有什么想法(使用谷歌找不到太多帮助)?
    • 我已经修复了我的示例,但我的建议是错误的。 includeFlat是你的朋友吗 - docs.gradle.org/current/dsl/…
    【解决方案2】:

    includeFlat 可能是 Louis 建议的另一种选择。这就是我解决问题的方法。

    ArcGradle ProjectCommon lib\ArcProjectJars

    ArcGradle settings.gradle
    rootProject.name = 'ArcGradle' include ':ProjectCommon' project(':ProjectCommon').projectDir = file('../ProjectCommon')

    ArcGradle build.gradle

    subprojects {
        // +++++++++++++++++++++ ORDER IS IMPORTANT ++++++++++++++++
        apply plugin: 'java'
        group "com.mmm.arc"
        version =  '2.5.0'
        sourceCompatibility = 1.8
        targetCompatibility = 1.8
        build.dependsOn('copyProjectJar')
        clean.dependsOn('deleteProjectJar')
    
        // In this section you declare where to find the dependencies of your project
        repositories {
            // Use 'jcenter' for resolving your dependencies.
            // You can declare any Maven/Ivy/file repository here.
            jcenter()
        }
    
        ext {
            arcProjectJarDir = "${rootDir}${File.separator}CommonJars${File.separator}ArcProjectJars"
        } 
    
        tasks.create(name: 'copyProjectJar', type: Copy) {
            into "${arcProjectJarDir}"
                from "/build/libs"
                include "*.jar"
        }   
        copyProjectJar.doFirst { 
            println "${project.name}:In copyProjectJar:BEGIN" 
        }
        copyProjectJar.doLast { println 'In copyProjectJar:END' }
        copyProjectJar.dependsOn('jar','deleteProjectJar')
        tasks.create(name: 'deleteProjectJar', type:Delete) {
            // Remove existing jars only if build is necessary
            delete fileTree(dir: "${arcProjectJarDir}", include: "${project.name}*.jar")
        }
    }
    

    而我的 ArcCommon settings.gradle 是空的,build.gradle 只包含依赖项{}

    我可以将 rootProject.name = 'ArcCommon' 添加到 settings.gradle 但它是从文件夹名称推断出来的

    【讨论】:

      猜你喜欢
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-04
      • 2014-09-05
      • 2015-11-04
      • 2021-08-24
      • 2015-06-15
      相关资源
      最近更新 更多