构建与编译 (Java)

Posted

技术标签:

【中文标题】构建与编译 (Java)【英文标题】:Building vs. Compiling (Java) 【发布时间】:2011-02-08 15:51:05 【问题描述】:

认为这个问题的答案很明显,但它就是这样:

当我在为学校(在 java 中)做一个小项目时,我编译它。

在我的合作社中,我们使用 ant 来构建我们的项目。

我认为编译是构建的一个子集。它是否正确?构建和编译有什么区别?

相关:What is the difference between compiling and building?

【问题讨论】:

【参考方案1】:

简单来说

编译翻译java代码(人工 可读)转换成字节码,所以 虚拟机可以理解。

Building 将所有已编译的部分 一起创造(建立)一个 可执行文件。

【讨论】:

你说的是“解释”……编译就是把人类可读的代码变成机器代码 @Tom,您的意思是“可执行文件”还是“jar 可执行文件”?【参考方案2】:

编译是将源代码转换为目标代码的行为。

链接是将目标代码与库组合成原始可执行文件的行为。

构建是由编译链接组成的序列,可能还有其他任务,例如创建安装程序。

许多编译器在编译源代码后会自动处理链接步骤。

What is the difference between compile code and executable code?

【讨论】:

其他一些可能的任务:增强 (JDO)、Javadoc-ing、打包和签名。此外,一些环境包括运行自动化单元/回归测试作为“构建”的一部分。 通常,在构建 Java 项目时没有链接步骤,也不会生成原始可执行文件。相反,编译的类作为构建的一部分一起打包到一个 .jar 文件中。 (或 .war 或 .ear,取决于您的目标环境。) 什么是“原始可执行文件”? 如果不与它需要的其他库混在一起,它本身基本上是无用的。这很像巧克力蛋糕。没有面粉和鸡蛋等,可可只是生可可。【参考方案3】:

实际上你正在做同样的事情。 Ant 是基于 XML 配置文件的构建系统,可以执行与编译软件相关的广泛任务。编译您的 java 代码只是其中一项任务。还有很多其他的,例如复制文件、配置服务器、组装 zip 和 jar 以及编译其他语言,例如 C。

您不需要 Ant 来编译您的软件。您可以像在学校一样手动操作。 Ant 的另一个替代品是名为 Maven 的产品。 Ant 和 Maven 都做同样的事情,但方式完全不同。

查找Ant 和Maven 了解更多详情。

【讨论】:

您还可以通过查看构建文件(很可能称为 build.xml)来了解 ant 实际在做什么。即使您不熟悉语法,您也可以看到发生了什么。 表示它正在编译一些 Java 代码。 表示它实际上正在运行已编译的代码。可能它正在创建一个目录来放置 .class 文件,编译代码,可能创建一些 Javadoc,等等。【参考方案4】:

编译只是将源代码转换为二进制,构建是编译并将所需的任何其他文件链接到构建目录中

【讨论】:

【参考方案5】:

我在这里看到的一些答案是断章取义的,如果这是一个 C/C++ 问题,则更有意义。

短版:

“编译”正在将 .java 文件转换为 .class 文件 “构建”是一个通用术语,包括编译和其他任务。

“构建”是一个通用术语,描述了包括编译在内的整体过程。例如,构建过程可能包括生成 Java 代码或文档文件的工具。

通常会有其他阶段,例如“打包”将所有 .class 文件放入 .jar 中,或“清理”将 .class 文件和临时目录清除。

【讨论】:

【参考方案6】:

“构建”是一个涵盖创建软件“可交付成果”所需的所有步骤的过程。在 Java 世界中,这通常包括:

    生成源(有时)。 编译源代码。 编译测试源代码。 执行测试(单元测试、集成测试等)。 包装(放入 jar、war、ejb-jar、ear)。 运行运行状况检查(静态分析器,如 Checkstyle、Findbugs、PMD、测试覆盖率等)。 生成报告。

如您所见,编译只是构建的一小部分(最佳实践是使用 Maven 或 Ant 等工具完全自动化所有步骤并连续运行构建,这被称为 @987654321 @)。

【讨论】:

为什么叫它“持续集成”而不是“持续构建”? @Pascal, Re “连续运行构建”..“构建”指的是? @Pacerier “构建”指的是所有步骤 1.-7.; “持续”并不意味着您在第一个构建完成后立即开始下一个构建,而只是在项目更改时。 以及当它生成您在第一点中提到的源时(生成源(有时)。) @QuaziIrfan 因为您正在验证新的或更新的代码是否与现有代码库集成。也就是说,您的更改可以编译,它们符合团队的编码标准和要求,它的基本功能是好的,并且它们不会破坏当前的良好构建。换句话说,您的更新与现有代码库很好地集成在一起。 HTH【参考方案7】: Build 是程序的编译版本。 编译是指,将(程序)转换成机器码或程序可以执行的低级形式。

在 Java 中:构建是一个生命周期,包含一系列命名阶段。

例如:maven它有三个构建生命周期,下面一个是default构建生命周期。

◾validate - validate the project is correct and all necessary information is available
◾compile - compile the source code of the project
◾test - test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
◾package - take the compiled code and package it in its distributable format, such as a JAR.
◾integration-test - process and deploy the package if necessary into an environment where integration tests can be run
◾verify - run any checks to verify the package is valid and meets quality criteria
◾install - install the package into the local repository, for use as a dependency in other projects locally
◾deploy - done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.

【讨论】:

【参考方案8】:

在 Eclipse 和 IntelliJ 中,构建过程包括以下步骤: 清理以前的包裹, 证实, 编译, 测试, 包, 一体化, 核实, 安装, 部署。

【讨论】:

以上是关于构建与编译 (Java)的主要内容,如果未能解决你的问题,请参考以下文章

Android Gradle安卓应用构建流程 ( Java 源码编译 和 AIDL 文件编译 )

Linux下Maven编译工具的安装配置与打包

深入理解Java虚拟机MacOS构建编译环境

Jenkins通过maven构建编译JAVA项目

QtCreator影子构建与默认编译目录

使用java 9编译lambda表达式时,Maven构建失败