读书! (这跳到Wiki)
跳到项目卡墙,查看即将到来的书籍和代码更改(卡墙跟踪该项目的问题)。
一些突出显示的文档页面:
- 保持本地与CI一致
- 向左移动安全性
如果您克隆这个项目
确保在github秘密中更新OWASP_API_NVD_KEY 。
现代Java/JVM建立实践
警告
对于使用DepentencyCheck插件进行Gradle或Maven的人来说,在7月1日的周末中,上游API获取安全性CVE的CVE更改了主要版本,并停止支持数据的较旧版本。要了解最新信息,请更新至Gradle或Maven插件的至少版本10.0.2。
更新后,第一个构建将需要很长时间,但之后应正常执行。在此更改之后的第一周左右,您可能会看到多个连接故障,因为OWASP NVD的项目都超载,所有这些都同时赶上了。随着CVE记录的拉动,Maven插件显示进度:要使用Gradle插件来查看进度,请使用--info命令行标志。
现代Java/JVM构建实践是一种使用Gradle和Maven构建现代Java/JVM项目的文章,以及Java中的首发项目(尽管详细信息可能会发生变化,但在JVM上为非Java语言的建议作品)。
重要的
有关所有页面和部分,请参见Wiki。此读数只是引言,动机和项目状态。您可以使用下面的目录快速跳到您感兴趣的位。
无论您选择哪种语言或构建工具,您都应该像您的项目源代码一样对待您的构建和管道值得您关注:如果它不像开发人员那样适合客户构建,那么您需要考虑一些东西。
我向您展示了实践和工具,可帮助您将构建和管道与您自己的源代码相同。这种非java语言的哲学的一个例子是clojure。
您的重点以及本文的重点是最佳的构建实践和项目卫生,并帮助您拥有与生产相同的本地工作。该项目在Gradle和Maven之间是不可知论的:每个部分的讨论涵盖了这两个工具(字母顺序,Maven之前的Gradle)。有关自以为是的观点(不是我自己的),请参阅我对Gradle(与Maven)的最后看法。
这不是JAVA的JVM启动器:我将其用于启动Kotlin项目,并替代纯净和代码质量插件。 JVM上的任何语言都可以找到实践和技巧。
笔记
Scala和Clojure拥有自己喜欢的构建工具,此处不涵盖。但是,构建管道的建议和示例旨在对这些JVM语言同样有用。 Groovy和Kotlin可以直接使用示例(它们都倾向于构建工具的Gradle选项)。
作为指导,该项目的重点是:
- 使用Gradle或Maven的JVM项目快速入门。分叉我,克隆我,自由复制/粘贴!我是Creative Commons公共领域奉献(CC0)。
- 讨论并说明(通过代码) – 不言而喻的默认实践;突出显示良好的构建工具和插件
- 出现的文件陷阱。互联网搜索后有些易于解决;有些人具有挑战性(请参阅“提示”部分)
- 不要成为“多合一”解决方案。您最了解您的情况。我希望这个项目可以帮助您发现自己喜欢的改进。请通过问题或公关与他人分享
两个反复出现的主题
- 剩下的转移问题– 在您的构建中找到早期的问题 – 在生产中看到它们之前
- 使开发人员的生活更轻松– 自动化构建任务通常是手工完成的:在与团队共享之前,请在本地进行投诉(失败),或者在部署之前在CI中失败
这些可以作为软件供应链概括:确保从本地开发到“直接发展:自信地建造”的可靠,可信赖的软件。
但是…您必须在这里对自己的系统和流程进行判断和衡量建议。有些事情(许多或大多数事情)可能对您有用:请密切关注对您不起作用的事物。
什么是入门者?
项目入门者有多个目标:
- 帮助一个新的项目启动并跑步,以最少的大惊小怪。
- 显示最佳实践的例子。
- 解释为什么选择的原因,并帮助您选择最有意义的项目。
该入门项目的重点是构建:
- 易于新人们尝试自己的项目
- 支持您的项目的新贡献者,使他们迅速提高生产力
- 支持当前的贡献者在构建中,摆脱困境,使日常工作变得容易
这个起动器项目的依赖性很小。重点是Gradle和Maven插件和配置,因此您和贡献者可以专注于代码,而不是设置构建。
总结
- 我不是一个很棒的程序员;我只是一个有很大习惯的好程序员。 – 肯特·贝克(Kent Beck)
- 使其运行,使其正确,使其快速-C2 Wiki
笔记
NB – 这是一个活生生的文件。该项目经常更新以获取新的依赖性或插件版本,并改进了实践。 README.md和Wiki更新建议。这是伟大习惯的样子的一部分:您不仅仅是向开发人员和用户展示爱的爱,而且还使他们能够回馈项目并帮助他人。有关提取更新的提示,请参阅重复使用此项目。
(归功于Yegor Bugayenko的优雅再读。)
尝试一下
您应该“踢轮胎”,并感觉到您想进入自己的项目并建造该项目的哪些部分。您跨越了许多项目:让我们对此有所帮助。
克隆或将该项目分配到您的机器后,请尝试对您有意义的本地构建:
$ earthly +build-with-gradle # CI build with Earthly $ earthly +build-with-maven # CI build with Earthly $ ./gradlew build # Local-only build $ ./mvnw verify # Local-only build
请注意,您可以纯粹在本地或容器中运行构建?
我想说服您,在容器中运行构建会解决“它在我的机器上工作”问题,并向您展示如何为您和其他人带来的构建改进。
笔记
该项目使用NVD检查与您的依赖关系的CVE,这可能需要很长时间才能下载。您可以通过请求NVD API密钥来加快构建时间(可能需要一段时间才能获取CVES列表或更新它,并且可能没有403或404失败)。
当您请求密钥时,NVD会向您发送电子邮件以确认您的身份,然后共享API密钥网页。有关更多详细信息,请参见Shift Security 。
查看入门“运行”程序的作用:
Gradle和Maven(如果需要时建造后)都应打印:
TheFoo(label=I AM FOOCUTUS OF BORG)
一个“起动器”程序是所有可能的“烟雾测试”中最简单的程序,这意味着,最小的事物只是奏效的,当您检查其他事物时,当电路燃烧1时,烟雾也许会从计算机中漂移1 。
最近的重大变化
(有关示例代码中的详细更改,请浏览提交日志。)
- 从公共领域转移到CC0许可证。
- Gradle:撞到Gradle 8.9。
- 将大部分
README.md迁移到github项目Wiki。这是分解的(14k+单词和增长)的读数为易消化部分。 - 尘世和策略:在作者归档该项目时,取消对Batect的支持。请用于当地的集装箱构造。因此,您的本地命令行是:
$ earthly +build-with-gradle # OR $ earthly +build-with-maven我将研究其他选项,并进行更新以显示这些和示例。建议保持不变:在容器中运行本地构建以进行可重复性,并让CI做同样的事情以精确地重复您的本地构建。
- JVM:转到JDK 21。该项目没有依赖Java或JVM的近期/现代版本的示例代码;但是,在两者之间移动确实需要更改才能构建脚本和支持文件。这是使用JDK 17的最后一个提交
- Gradle:与Gradle 8.x建造。
- Gradle:使用
testsets组插件进行集成测试,以支持本机Gradle支持。这支持Gradle 8。
目录
该项目的写作已完全移至Wiki页面。使用Wiki中的侧边栏导航浏览或跳入主题,或按照阅读顺序遵循。您还可以将“页面”旁边的Droplist控件用于字母顺序列表(包括页面中的子标题)和搜索框。
最后,Wiki页面本身就是一个回购,您可以使用git@github.com:binkley/modern-java-practices.wiki.git ,您可以为任何github wiki wiki。
贡献
参见CONTRIBUTING.md 。请提交问题或贡献拉请请求!我很想和你交谈。
学分
特别感谢我的合着者约翰·利比(John Libby)。
非常感谢:
- 丹·瓦拉赫(Dan Wallach)进行多个电子邮件评论和有关安全性的讨论
- 克里斯托弗·霍斯巴克克(Kristoffer Haugsbakk)
- 山姆·加蒙
- 谢尔盖·布哈罗夫(Sergei Bukharov)
欢迎所有建议和想法!请提交问题。 ☺
脚注
-
不,我只是在开玩笑。与计算机2中的“白烟”相比,亚马逊或Google或Microsoft Cloud的问题完全不同。 ↩
-
实际上,当电源燃烧时,这确实发生在云之前的数据中心。在触发Halon系统之前,我们急于使用灭火器。 ↩
