gradle - 如何在使用Gradle构建胖罐的同时编译不同口味

原文 标签 gradle build.gradle v8 j2v8

我想在Java项目中包含Java Bindings for V8(“ J2V8”)。原因是(i)V8 JavaScript引擎要比JRE随附的JavaScript引擎快得多,并且(ii)我正在使用的库仅在JavaScript中可用,并且需要大量移植到Java。

问题是J2V8是compiled for different platforms:Linux 64位,macos 64位,Windows 64位,Windows 32位。

我现在想生成包含所有依赖项(fat jars)的不同JAR:


jabref-linux_x86_64.jar
jabref-macosx_x86_64.jar
jabref-windows_x86_32.jar
jabref-windows_x86_64.jar
jabref-all.jar-没有v8引擎的平台独立JAR


我目前正在使用shadow plugin创建胖子。

请注意,该项目不是Android项目。在那里,使用Android插件似乎很简单。

第一个想法是介绍配置和特定于配置的依赖项:

configurations {
    linux_x86_64Compile.extendsFrom compile
    macosx_x86_64Compile.extendsFrom compile
    windows_x86_32Compile.extendsFrom compile
    windows_x86_64Compile.extendsFrom compile
}

dependencies {
    compile configuration: 'linux_x86_64',   group: 'com.eclipsesource.j2v8', name: 'j2v8_linux_x86_x64',  version: '4.6.0'
    compile configuration: 'macosx_x86_64',  group: 'com.eclipsesource.j2v8', name: 'j2v8_macosx_x86_x64', version: '4.6.0'
    compile configuration: 'windows_x86_32', group: 'com.eclipsesource.j2v8', name: 'j2v8_win32_x86',      version: '4.6.0'
    compile configuration: 'windows_x86_64', group: 'com.eclipsesource.j2v8', name: 'j2v8_win32_x86_x64',  version: '4.6.0'
...
}


但是现在我被卡住了。用伪代码,我想做:

task releaseSingleJar(dependsOn: "shadowJar", name) {
    doLast {
        copy {
            from("$buildDir/libs/JabRef-${project.version}-fat.jar")
            into("$buildDir/releases/")

            rename { String fileName ->
                fileName.replace('-fat', '-$name')
            }
        }
    }
}

task releaseJars() {
  forEach name in "linux_x86_64", "macosx_x86_64", "windows_x86_32", "windows_x86_64", "all":
     if (name != "all") activate configuration $name
     releaseSingleJar($name)


shadowJar来自影子插件。

背景资料


该视频显示了我们设置中的速度差异:https://github.com/JabRef/jabref/pull/2250#issuecomment-264824598
JabRef中集成的当前状态:https://github.com/JabRef/jabref/pull/3180


相关问题

问题Using Gradle to manage Java web app with flavors like Android具有相似的标题,但要求提供源目录,而我要求依赖项。此外,我想生成一个胖的JAR,而普通的JAR似乎就足够了。但是,解决方案可能相似。提示是使用gradle-java-flavours plugin,主要来源为JavaFlavoursExtension.groovy

以下问题与此类似。但是,该设置与Android应用程序相关,而与普通Java应用程序无关。


How to define different dependencies for different product flavors
Gradle: add dependency for a specific flavour of the library
Change dependency through a task in gradle
Use different resources for different application flavors using gradle

最佳答案

您可能对我的gradle-java-flavours plugin感兴趣,它可以为纯Java项目中的每种样式创建源集,配置以及编译,jar和测试任务。

例如:

import com.github.jengelman.gradle.plugins.shadow.tasks.*
plugins {
    id 'com.lazan.javaflavours' version '1.2'
    id 'com.github.johnrengelman.shadow' version '1.2.4'
}
def flavours = ['linux_x86_64', 'macosx_x86_64', ...]
javaFlavours {
    flavours.each {
        flavour it
    }
}
dependencies {
    linux_x86_64Compile      'aaa:aaa:1.0'
    linux_x86_64Runtime      'bbb:bbb:1.0'
    macosx_x86_64TestCompile 'ccc:ccc:3.0'
}
flavours.each { String flavour ->
    SourceSet flavourSourceSet = sourceSets.getByName(flavour)
    Configuration flavourRuntime = configurations.getByName("${flavour}Runtime")
    JavaCompile flavourCompileTask = tasks.getByName("compile${flavour.capitalize()}Java")
    Task shadowJarTask = tasks.create(name: "${flavour}ShadowJar", type: ShadowJar) {
        classifier = "${flavour}-all"
        dependsOn flavourCompileTask 
        // todo configure (likely based on Configuration and SourceSet)
    }
    artifacts {
        archives shadowJarTask 
    }
    // wire the task into the DAG
    assemble.dependsOn shadowJarTask
}

相关文章:

java - Gradle Build Error-程序类型已存在

java - java:找不到com.google.auth.Credentials的com.google.auth.Credentials类文件

android - Gradle构建错误:org.gradle.buildexceptionreporter使用2.14.1的Gradle版本

android - Android App Bundle构建错误:<fusing>元素缺少'include'属性

android - Gradle重复项输入错误:META-INF / MANIFEST.MF(或如何从jar中删除文件)

javascript - 如何从v8 shell运行外部javascript文件?

redis - 是否有适用于v8的Redis客户端? (不是NodeJs)

tomcat - ClassCircularityError:使用JavaMelody和Tomcat插件运行Gradle webapp的java / util / logging / LogRecord

android - 现在无法访问dex任务,如何升级到1.5.0?

javascript - Node.js:__call实现可用吗?