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

标签 gradle build.gradle v8 j2v8

我想包括 Java Bindings for V8 (“J2V8”)在 Java 项目中。原因是 (i) V8 JavaScript 引擎比 JRE 附带的 JavaScript 引擎快得多,以及 (ii) 我使用的库仅在 JavaScript 中可用,并且要移植到 Java 需要付出很多努力。

问题是 J2V8 是 compiled for different platforms : linux 64 位,macos 64 位,windows 64 位,windows 32 位。

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

  • 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 创建 fat jar .

    注意项目是不是 一个安卓项目。在那里,使用 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
    }
    

    关于gradle - 如何在使用 Gradle 构建 fat jar 时编译不同的口味,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43459663/

    相关文章:

    android - Gradle不会将versionCode和VersionName更新为manifest.xml文件

    javascript - 为什么以及何时未执行的闭包可以捕获 JavaScript 中的外部变量?

    android - 生成签名的APK时如何解决依赖关系

    gradle - 在 Gradle 中创建 tar 文件时,将行结尾转换为 unix 样式的最简单方法是什么?

    java - Gradle Apk 构建。失败(:applyRetrolambda FAILED)

    node.js - 为什么 Node.js heapdump 显示编译后的代码?

    Javascript 正则表达式挂起(使用 v8)

    bash - 如何在 shell 脚本中捕获 Gradle 退出代码?

    testing - 如何测试gradle构建脚本

    android - 在其他计算机上打开项目时出现Gradle错误