java gradle构建_在Gradle中为JPMS构建Java 6-8库

java gradle构建

通过提供Java 9 module-info.class了解如何使用Gradle构建支持JPMS( Java平台模块系统 )的Java 6-8库。

介绍

如果您需要JPMS本身的介绍,请查看此概述 。

这篇文章主要针对Java库维护者。

任何此类维护人员都必须选择要针对的JDK:

  • 针对最新的JDK( JDK 11或刚刚发布的JDK 12 ),开发人员和用户可以使用新的API和更多功能。
  • 但是,这会阻止所有使用较旧JDK的用户使用该库。
    • 那些较老的JDK仍然受欢迎, 在2018年约占95%的份额 ,并预计在2019年将约90%的 份额 。

因此,对于许多图书馆维护者而言,后者无疑是一个决定性因素 。 例如, vavr 1.0 旨在以JDK 11为目标 ,但最终将以JDK 8为目标 。

尽管如此,还是建议为JPMS添加一些支持,以期将来会被广泛采用(我想从现在起5年以上)。 Stephen Colebourne在这里描述了三个选项:

  1. 不执行任何操作(不建议)。
  2. 最低要求:在MANIFEST.MF文件中添加一个“ Automatic-Module-Name条目。
  3. 最佳:添加一个针对JDK 9+的module-info.class同时提供所有其余针对JDK 6-8 *的类。

在这里,我们将深入研究如何实现选项3(最佳选择)。

*我写的是JDK 6-8(而不是JDK 5-8),因为在JDK 11中, javac--release选项限制为6-11。

理由

不过,在深入研究“如何”之前,让我们先略过“为什么”。

为什么JPMS完全值得打扰? 主要是因为JPMS:

  • 提供强大的封装 ,
  • 防止引入拆分包 ,
  • 确保更快的类加载 。

综上所述,JPMS 确实很棒 (更多信息请参见此处 ),鼓励我们采用JPMS是我们的最大利益!

因此,我鼓励Java 6-8库的维护者充分利用JPMS:

  • 自己针对模块的JDK 6-8类和其他模块编译module-info.java
  • 对于他们的用户,通过为库提供module-info.class使其在模块路径上正常工作。

可能的行为

可以在两个位置找到module-info.java

  1. 与其他所有类,在src/main/java
  2. 在单独的“源集”中,例如src/main/java9

我喜欢选项1,因为它看起来更自然。

module-info.class可以在两个地方结束:

  1. 在根输出目录以及所有其他类中,
  2. META-INF/versions/9 (多发行版JAR,又名MRJAR )

阅读了CédricChampeau撰写的有关MRJAR的帖子后 ,我对MRJAR颇为怀疑,因此我更喜欢选项1。

但是请注意, Gunnar Morling报告说选项1出现了一些问题。另一方面,我希望距JDK 9发行1.5年后,所有主要库都已打补丁以正确处理module-info.class

每个构建工具的示例库

本节包含一些针对JDK 6-8时提供module-info.class的库示例。

蚂蚁

  • Lombok (JDK 6 main + JDK 9 module-info.class

Maven

  • ThreeTen-extra (JDK 8 main + JDK 9 module-info.class
  • Google Gson –尚未发布(JDK 6 main + JDK 9 module-info.class
  • SLF4J –尚未发布( META-INF/versions/9 JDK 6 main + JDK 9 module-info.class

请注意, Maven编译器插件提供了如何提供这种支持的示例 。

Gradle

我还没有找到任何流行的库使用Gradle提供这种支持(请注释,如果您知道的话)。 我只知道vavr试图这样做( #2230 )。

Gradle中的现有方法

修改

ModiTect (由Gunnar Morling编写 )及其Gradle插件 (由Serban Iordache编写 )具有一些非常酷的功能 。 本质上,ModiTect基于特殊符号或直接从module-info.java 生成 module-info.class -info.class, 而无需使用javac

但是,在从module-info.java直接生成的情况下,ModiTect有效地复制了javac所做的工作,同时引入了自己的问题(例如#90 )。 这就是为什么我觉得它不是最好的工具。

Badass Jar插件

Serban Iordache还创建了Gradle插件 ,该插件可让“无缝创建针对9之前的Java版本的模块化jar”。

看起来不错,但是:

  • 为了构建正确的JAR并验证module-info.java ,Gradle构建必须运行两次,
  • 它不使用javac--release选项,该选项保证仅引用正确的API,
  • 它不使用javac来编译module-info.java

同样,我觉得这里不是正确的工具。

JpmsGradlePlugin

这是我最近的发现: JpmsGradlePlugin由阿克塞尔Howind 。

该插件可以做一些不错的事情(例如,从javadoc任务中排除module-info.java ),但是:

  • 它也不使用javac--release选项,
  • 它不完全支持Java模块化(例如,模块修补),
  • 感觉还不够成熟(代码难以遵循 ,非标准行为,例如直接调用javac )。

Gradle中的拟议方法

Gradle脚本

最初,我想通过添加自定义源集来做到这一点 。 但是,事实证明,这种方法会引入不必要的配置和任务 ,而我们真正需要的只是一个额外的任务,它正确地“钩住”了构建生命周期 。

结果,我想到了以下几点:

  1. compileJava配置为:
    • 排除 module-info.java
    • 使用--release 6/7/8选项。
  2. 添加一个名为compileModuleInfoJava的新JavaCompile任务,并将compileModuleInfoJava配置为:
    • 仅包含 module-info.java
    • 使用--release 9选项,
    • 使用compileJava的类路径作为--module-path *
    • 使用compileJava *的目标目录 ,
    • 取决于 compileJava *

  3. 配置classes任务以依赖于compileModuleInfoJava

以上内容在Groovy DSL中表示为Gradle脚本,可以在我的Stack Overflow答案中找到。

*这三个步骤对于compileModuleInfoJava查看由compileJava编译的类是compileJava 否则,由于未解析的引用, javac将无法编译module-info.java 请注意,在这种配置中,每个类编译一次 (与推荐的Maven Compiler Plugin配置不同 )。

不幸的是,这样的配置:

  • 在存储库之间不容易重用,
  • 不完全支持Java模块化。

Gradle模块插件

最后,有一个插件( Gradle Modules Plugin ),它为Gradle添加了对JPMS的完全支持(由Java 9 Modularity的作者Sander Mak和Paul Bekker创建 )。

该插件仅不支持本文所述的方案。 因此,我决定:

  • 通过此插件提交功能请求: #72
  • 提供具有#72的完整实现的“拉取请求”(作为“概念证明”): #73

我尽力做出这些高质量的贡献。 最初的反馈很受欢迎 (甚至Mark Reinhold也很喜欢!)。 谢谢!

现在,我正在耐心等待进一步的反馈 (和潜在的改进要求),然后才能(希望)合并PR。

摘要

在本文中,我展示了如何使用Gradle构建Java 6-8库,以便将module-info.java编译为JDK 9格式(JPMS支持),而将所有其他类编译为JDK 6-8格式。

我还建议对这种配置使用Gradle Modules插件 (一旦我的PR合并并且发布了新的插件版本)。

翻译自: https://www.javacodegeeks.com/2019/03/building-java-6-8-libraries-jpms-gradle.html

java gradle构建

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tcppwebbrower 关闭安全警报_【知识】锅炉与压力容器安全

一、锅炉的主要安全附件1.安全阀安全阀属于泄压装置,能够自动将锅炉工作压力控制在允许范围之内。当炉内超压时,安全阀自动开启,自动泄压,同时发出警报;当炉内压力降到允许范围时,安全阀自动关闭。安全阀使…

macOS下查看Java/JDK的安装目录_查看Java/JDK的版本信息_配置环境变量JAVA_HOME

文章目录查看JDK的安装目录查看系统当前正在使用的 JDK 版本信息配置环境变量 JAVA_HOME查看JDK的安装目录 通常情况下,macOS安装JDK,默认是安装在 /Library/Java/JavaVirtualMachines 目录下。 使用 java_home 命令查看: [~]$ /usr/libex…

java_home命令详解

文章目录命令介绍命令选项说明帮助信息命令介绍 The java_home command returns a path suitable for setting the JAVA_HOME environment variable. It determines this path from the user’s preferred JVM based on configured environment variables. Additional constra…

安全审计报告_企业做税审的五大好处!税审报告和审计报告的区别

税务审计报告是税务审计人员根据税务审计的相关法律、法规,对被审计单位的纳税行为和纳税事项进行评估,并发表意见的书面文件。(咨询:13510890028,肖)一、企业做税审的五大好处:1、可弥补亏损,减少税款支出企业所得税法…

selenium自动化测试_您如何使用Selenium来计算自动化测试的投资回报率?

selenium自动化测试跨浏览器测试是一种测试,需要大量的精力和时间。 通过不同的浏览器,操作系统,设备,屏幕分辨率测试Web应用程序,以评估针对各种受众的Web内容呈现的过程是一项活动。 特别是如果手动处理。 使用Selen…

早期计算机的应用主要是( ) (2分),计算机基础第1次作业(含答案)

重庆大学网络教育学院《计算机应用基础》2008年秋季第一次作业《计算机基础知识和中文WIN XP操作系统》注:[ ]内为考查知识点一、单选题(每题2分,10题共20分)1、早期的计算机体积大、耗能高、速度慢,其主要原因是制约于( )。[计算机的发展及应…

python输出结果空格分割_用Python编写固定宽度,以空格分隔的CSV输出

我想使用Python的csv编写器编写一个固定宽度,空格分隔和最小引用的CSV文件. 输出示例: item1 item2 "next item1" "next item2" anotheritem1 anotheritem2 如果我用 writer.writerow( (“{0:15s}”.format(item1), “{0:15s}”.format(item2))…

macOS下搭建Nexus 3.x服务器作为Maven的资源仓库服务器

文章目录下载 Nexus 服务器安装包安装 Nexus 服务器配置环境变量/启动服务器/停止服务器Nexus 服务器管理后台登录管理后台Blob StoresNexus 初始密码无法登录的问题仓库(Repository)Nexus 内置的仓库Repository 的 Type 属性创建代理仓库创建本地仓库&a…

宣城校区计算机排名,2017秋大学计算机(合肥工业大学 宣城校区)

1.《大学计算机》课程与其它类似的课程有什么不同?《大学计算机》是面向大学一年级学生开设的计算机通识类课程,类似的还有《大学计算机基础》、《计算机应用基础》,或者《计算机文化基础》、《信息技术基础》等课程,它和这些不同…

jakarta ee_关于Jakarta EE软件包名称更改的思考

jakarta eeEclipse基金会宣布 Jakarta EE无法继续使用javax软件包名称。 显然,这是由于Java EE以此名称为基础,但不允许对该名称或以该名称开头的类或包进行进一步的修改。 尽管这当然是个坏消息,但对我而言,当宣布Jakarta EE不能…

人工智能教程

参见:https://www.captainbed.net/csdn/

python的setting怎么找_Python的Django框架中settings文件的部署建议

django在一个项目的目录结构划分方面缺乏必要的规范,因此不同人的项目组织形式也千奇百怪,而且也很难说谁的做法就比较好。我根据自己的项目组织习惯,发布了一个项目dj-scaffold。 前些天在reddit上为我的项目dj-scaffold打了个“广告”&…

显示计算机硬盘驱动器更改,计算机更换硬盘驱动器后蓝屏发生了什么

关于更换硬盘后的计算机蓝屏,怎么了?然后让我告诉您更换硬盘后计算机蓝屏的原因和解决方法。希望能对您有所帮助。 !计算机更换硬盘后蓝屏的解决方法:蓝屏的主要原因是:1、病毒木马和恶意软件2、有问题的内存(包括物理…

aws eks_在生产中配置和使用AWS EKS

aws eks到现在,我们已经完成了向Amazon EKS ( 工作地点)的迁移,并且集群已经投入生产。 过去,我已经写了一些要点的简短摘要,您可以在这里找到。 当系统正在处理实际流量时,我有了一些额外的信心…

Nexus中创建仓库时,repository connectors 干嘛的?

参见:https://support.sonatype.com/hc/en-us/articles/115013153887-Docker-Repository-Configuration-and-Client-Connection

量子计算机是否存在相对论,潘建伟团队再登Science:寻找广义相对论与量子力学的桥梁...

将环球科学设为星标周一至周五早间第一时间掌握最新鲜的全球科技资讯量子物理学寻找广义相对论与量子力学的桥梁广义相对论与量子力学是现代物理的两块基石。然而,它们之间似乎存在不可调和的矛盾,很多在广义相对论框架下适用的物理规则,在量…

判断大小简单算法_JVM GC算法

在判断哪些内存需要回收和什么时候回收用到GC 算法,本文主要对GC 算法进行讲解。JVM垃圾判定算法常见的JVM垃圾判定算法包括:引用计数算法、可达性分析算法。引用计数算法(Reference Counting)引用计数算法是通过判断对象的引用数量来决定对象是否可以被…

stream分组计数_Java Stream:第2部分,计数始终是计数吗?

stream分组计数在上一篇有关该主题的文章中 ,我们了解到JDK 8 stream()::count需要更长的时间来执行Stream更多的元素。 对于最新的JDK(例如Java 11),简单的流管道不再是这种情况。 了解JDK本身如何进行改进。 Java 8 在上一篇文…

女生学计算机类什么专业好就业前景,2019高考:适合女生报考的10大专业!就业前景好,待遇稳定!...

如今考大学不再是单纯的提升学历,也要为自己未来的工作考虑。尤其是女生,更要考虑就业问题。因为很多专业都不太适合女生去做,甚至都不招收女生。不过也有其他的专业很适合女生,不仅就业前景好,而且很好找工作&#xf…

macOS安装Maven_IDEA集成Maven

文章目录下载 Maven安装 Maven配置环境变量关于 settings.xml 文件配置本地仓库Maven 默认的远程中央仓配置镜像仓库IntelliJ IDEA 集成 Maven下载 Maven 官方下载地址:https://maven.apache.org/download.cgi 打开官方下载页面,页面拖到下面&#xff…