如何使用Gradle制作多版本JAR文件?

igr*_*igr 15 java gradle java-9 java-module

Java9引入了Multi-Release JAR.

假设我使用java8有多模块Gradle项目:

project-root
      settings.gradle
      build.gradle 
      /module1
          /src
          ... (common maven structure)
      /module2
      /module3
Run Code Online (Sandbox Code Playgroud)

这是Gradle中常见的多模块项目.假设我需要MR-Jar module1.

我无法添加module1-java9定位Java9,因为基础是8 - 到目前为止,我的Gradle和IntelliJ IDEA都抱怨.Gradle是用java8编译的,但是我需要为模块启用java9运行时(不知道怎么做); 在IntelliJ IDEA中我可以为模块设置java9运行时,但每次重新加载gradle配置时它都会被覆盖.

而且,即使我以某种方式添加它,我需要指示module11)构建第二个和2)包括module1-java9.以下是这种情况的图纸:

project-root
      settings.gradle
      build.gradle 
      /module1
      /module1-java9  (added java9 module)
      /module2
      ...
Run Code Online (Sandbox Code Playgroud)

或者,这可以在module1具有不同来源的情况下完成:srcsrc-java9.但我怀疑这会被接受.这是一张图:

project-root
      settings.gradle
      build.gradle 
      /module1
          /src
          /src-java9 (added java9 source folder)
      /module2
      /module3
Run Code Online (Sandbox Code Playgroud)

到目前为止,我只看到它module1-java9是一个单独的项目(不是模块),module1只是在那里调用gradle并获取输​​出.是的,这是gradle调用gradle :)))

有没有开发人员友好的方式来做到这一点?

Chr*_*iki 2

正如该问题的评论中提到的,这篇博文和相关的示例项目描述了如何使用 Gradle 创建多版本 JAR。

\n\n

如果博客文章或示例项目消失,您还可以参考以下设置,该设置源自示例项目,并根据问题中给出的设置进行了一些定制(只要提供了详细信息)。

\n\n

概述

\n\n
project-root/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build.gradle\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 module1\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main\n\xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 java\n\xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 com\n\xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 acme\n\xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 JdkSpecific.java\n\xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Shared.java\n\xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 java9\n\xe2\x94\x82\xc2\xa0\xc2\xa0             \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 com\n\xe2\x94\x82\xc2\xa0\xc2\xa0                 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 acme\n\xe2\x94\x82\xc2\xa0\xc2\xa0                     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 JdkSpecific.java\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 module2\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 whatever\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 module3\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 whatever\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 settings.gradle\n
Run Code Online (Sandbox Code Playgroud)\n\n

build.gradle

\n\n
allprojects {\n    apply plugin: \'java\'\n\n    compileJava {\n        sourceCompatibility = 8\n        targetCompatibility = 8\n    }\n}\n\ndependencies {\n    implementation project(\':module1\')\n}\n\nproject(\':module1\') {\n    sourceSets {\n        java9 {\n            java {\n                srcDirs = [\'src/main/java9\']\n            }\n        }\n    }\n\n    compileJava9Java {\n        sourceCompatibility = 9\n        targetCompatibility = 9\n    }\n\n    dependencies {\n        java9Implementation files(sourceSets.main.output.classesDirs) {\n                builtBy compileJava\n            }\n    }\n\n    jar {\n        into(\'META-INF/versions/9\') {\n            from sourceSets.java9.output\n        }\n        manifest.attributes(\'Multi-Release\': \'true\')\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

settings.gradle

\n\n
include \'module1\', \'module2\', \'module3\'\n
Run Code Online (Sandbox Code Playgroud)\n