【发布时间】:2016-12-05 17:02:17
【问题描述】:
我知道 Maven 将构建的结果保存在本地存储库中(工件安装在 ~/.m2/repository/ 下),但它也会在 target 文件夹中的 src 旁边输出编译的类。
本地存储库中的内容与target 文件夹中的内容有什么区别吗?
【问题讨论】:
标签: maven
我知道 Maven 将构建的结果保存在本地存储库中(工件安装在 ~/.m2/repository/ 下),但它也会在 target 文件夹中的 src 旁边输出编译的类。
本地存储库中的内容与target 文件夹中的内容有什么区别吗?
【问题讨论】:
标签: maven
它们完全不同,不应混淆。
target 代表构建目录。这就是说,在构建期间从源代码生成的每个临时文件都到了那里。值得注意的是,您会发现主要和测试 Java 源代码的编译类,但 you'll also find lots of things in there(生成的源文件、过滤文件等)。重要的是,此文件夹中包含的所有内容本质上都是临时的。您可以随时删除它,运行mvn clean,并确保下一个构建将(或至少应该)正常工作。在target 下生成的所有文件和文件夹都有一个目的:创建项目的工件。一个 Maven 项目,例如带有 jar 包装的项目,将有一个主工件,它由带有 jar 扩展名的 its final name 组成,并将包含已编译的 Java 类。最终名称可以是在 POM 中设置的自定义名称,也可以是从项目的Maven coordinates 派生的默认名称。这样的项目还可以有附加的工件,例如测试 JAR 或源 JAR。
本地存储库仅包含工件。里面没有临时文件。运行mvn install时安装的严格来说是Maven项目生成的工件,即最终产品,加上项目的POM文件。用于创建它们的所有内容都不会放在本地存储库中,并且项目的构建绝不能将临时的东西放在那里。请记住,本地存储库是 Maven 存储库,因此遵循严格的命名方案:组 id 为 my.groupid、工件 id 为 my-artifactid 和版本为 1.0 的项目将获得安装在文件夹my/groupid/my-artifactid/1.0;您将在其中找到 POM 文件和所有其他工件。工件本身的名称不能被覆盖:对于 JAR 项目,它将是 my-artifactid-1.0.jar(可能添加了 a classifier)。
这通常是一个混淆的来源:在target 文件夹下生成的主工件文件的名称与安装时在本地存储库中或在部署时在远程存储库中的名称完全不同.第一个是可以控制的,但后者是由仓库的命名方案定义的,它是根据坐标计算出来的。
回顾一下:target 包含在构建过程中创建项目工件的所有血腥临时细节(主要 JAR、源代码、Javadoc ......即应该由该项目部署和发布的所有内容),而本地存储库(和远程存储库)将仅包含工件本身。
【讨论】:
如果您真正关心的是生成的module.jar,则不多。生成的 .jar 是相同的,还考虑重新编译代码会清理您的 /target 文件夹,但不会清理 .m2 文件夹。
虽然/target 文件夹通常由编译的源类/target/classes 和/target/generated-sourceetc 以及module.jar 组成。
另一方面,本地~.m2/repository 将由module.jar 以及该模块的pom.xml 和所有配置(repositories、dependencies 等)组成,以便在需要时重建该模块。
【讨论】: