有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java什么是Gradle深度解释中的buildbyconvention?

{a1}经常提到Gradle是声明性的,并使用按约定构建。这是什么意思

据我所知,这意味着,例如,在java插件中,有如下约定: 源必须在src/main/java中,测试必须在src/main/test中,资源必须在src/main/resources中,准备好的jar必须在build/libs中,等等。然而,Gradle并不强迫你使用这些约定,如果你愿意,你可以改变它们

但是对于第一个概念,我在理解上有一个更大的问题。像SQL一样,你说你想对你的查询做什么,但不说数据库系统将如何获取它们,使用哪种算法来提取数据等等

请告诉我更多关于正确理解这些概念的信息。谢谢


共 (3) 个答案

  1. # 1 楼答案

    你对按约定构建的理解是正确的,所以我不需要在这里添加任何内容。(另请参见杰夫的回答。)

    声明性背后的想法是,你不必在任务级别上工作,自己实现/声明/配置所有任务及其依赖项,但可以在更高、更声明性的级别上工作。你只需说“这是一个Java项目”(^{),“这是我的二进制存储库”(^{),“这是我的源代码”(^{),“这些是我的依赖项”(^{)。根据这些声明性信息,Gradle随后将确定需要哪些任务,它们的依赖关系是什么,以及它们需要如何配置

  2. # 2 楼答案

    为了理解declarative风格的编程,将其与imperative programming风格进行比较和对比是很有用的

    声明式编程允许我们指定我们想要完成的

    在命令式编程中,我们指定如何完成某件事

    因此,当我们使用gradle时,正如Peter所描述的,我们会做出声明,例如,“这是一个Java项目”或“这是一个Java Web应用程序”

    然后,Gradle使用插件,提供处理“Java项目”或“Web应用程序”等构建的服务。这很好,因为它是Gradle插件,包含与编译java类和构建war文件等任务相关的实现细节

    将其与另一个构建系统Make进行对比,后者在本质上更具必要性。让我们看一下从here中获取的一个简单Make规则:

     foo.o : foo.c defs.h       
             cc -c -g foo.c
    

    所以在这里,我们看到一条规则,它描述了如何构建对象文件foo。o来自C源文件和C头文件

    Make规则有两个作用

    第一行写着一个foo。o文件依赖于一个foo。c和foo。h、 就Make知道如何检查文件foo上的时间戳而言,这一行是一种声明性的。o查看它是否比文件foo旧。c和foo。h、 如果是福。o较旧,则Make将调用下一行的命令

    下一行是命令行

    第二行指定了当一个foo运行时要运行什么命令(cc-a C编译器)。o文件比foo中的任何一个文件都旧。c或foo。h、 还要注意,编写Makefile规则的人必须知道传递给cc命令的标志

  3. # 3 楼答案

    按约定构建是这样一种想法:如果遵循默认约定,那么构建就会简单得多。因此,虽然可以更改源目录,但不需要显式指定源目录。Gradle带有逻辑默认值。这也被称为约定优于配置

    根据彼得的回答,这一部分经过编辑,以更清楚地说明声明性的本质:

    构建是声明性的,其思想是不需要指定需要完成的每个步骤。你不会说“做第一步,做第二步,等等”。您定义了需要应用的插件(或任务),然后gradle构建了一个任务执行图,并计算出执行的顺序