在gradle中:如何构建两个相同的胖罐子,除了不同的依赖关系?

在gradle中:如何构建两个相同的胖罐子,除了不同的依赖关系?,gradle,Gradle,我有一个gradle项目,它成功地构建了一个胖jar(即包含它自己的依赖项)。然而,我需要的是它构建两个罐子: 具有此依赖项的一个:compile('postgresql:postgresql:8.4-702.jdbc4') 具有此依赖关系的另一个:compile('org.postgresql:postgresql:42.1.1.jre7') 除此之外,它们应该是相同的 我能在格拉德尔做这个吗 我有一个要求,我只能调用gradle一次(即不能为每个jar调用gradle一次) 我的grad

我有一个gradle项目,它成功地构建了一个胖jar(即包含它自己的依赖项)。然而,我需要的是它构建两个罐子:

  • 具有此依赖项的一个:compile('postgresql:postgresql:8.4-702.jdbc4')
  • 具有此依赖关系的另一个:compile('org.postgresql:postgresql:42.1.1.jre7')
除此之外,它们应该是相同的

我能在格拉德尔做这个吗

我有一个要求,我只能调用gradle一次(即不能为每个jar调用gradle一次)

我的gradle文件的相关部分如下所示:

buildscript {
    ext {
        springBootVersion = '1.3.1.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath("io.spring.gradle:dependency-management-plugin:0.5.4.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'
apply plugin: "io.spring.dependency-management"

jar {
    baseName = 'demo'
    version = '0.0.1-SNAPSHOT'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {

    ...

    compile('org.postgresql:postgresql:42.1.1.jre7') // or compile('postgresql:postgresql:8.4-702.jdbc4')

    ...
}

eclipse {
    classpath {
         containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER')
         containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8'
    }
}

...

task wrapper(type: Wrapper) {
    gradleVersion = '2.9'
}

如果可以为一个jar运行一次gradle,那么一个简单的命令行属性和一个If块就可以完成这项工作。另请参见此处:


另请看重复问题:

如果这对任何人都有帮助,我就是这样做的:

  • 将现有jar解压缩到文件夹中:

    task extractJar(type: Copy, dependsOn: [otherTasksThatBuildFirstJar]) {
        from zipTree(jar.archivePath)
        into 'build/jarContents'
    }
    
  • 删除我不想要的依赖项:

    task deletePostgres(type: Delete, dependsOn: [extractJar]) {
        delete fileTree('build/jarContents/lib') {
            include '**/postgres*.jar'
        }
    }
    
  • 添加我想要的依赖项:

    task replacePostgres(type: Copy, dependsOn: [deletePostgres]) {
        from 'lib/postgresql-8.4-702.jdbc4.jar'
        into 'build/jarContents/lib'
    }
    
  • 构建第二个jar:

    task buildSecondJar(type: Jar, dependsOn: [replacePostgres]) {
        baseName 'my-second-jar'
        entryCompression ZipEntryCompression.STORED //prevents compression of jars
        from  files('build/jarContents')
        destinationDir project.rootDir
        manifest {
            attributes(
                    'Start-Class': 'com.somewhere.MyApplication',
                    'Spring-Boot-Classes': 'BOOT-INF/classes/',
                    'Spring-Boot-Lib': 'BOOT-INF/lib/',
                    'Spring-Boot-Version': '1.5.8.RELEASE',
                    'Main-Class': 'org.springframework.boot.loader.JarLauncher'
            )
        }
    }
    

  • 谢谢不幸的是,我无法控制正在运行的gradle命令(我使用的是Heroku,它只运行gradle一次)。我可以调用两个任务,每个jar一个,但是(因为我还是gradle的新手),我不知道如何调用jar构建任务。我也不知道如何将不同的属性传递给每个任务。有什么建议吗?点击链接,看看其他答案,也可以添加这些关于heroku的细节,以及gradle是如何被引用到这个问题的