Mvn install or Mvn package

151
我刚接触Maven,我有一个基于Java的Web项目,已在MyEclipse中设置了Maven。
现在如果我修改任何Java文件,那我需要执行Run as -> Mvn install还是Mvn package
8个回答

178

来自http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

package:将已编译的代码打包为可分发的格式,例如 JAR。

install:将软件包安装到本地存储库中,以便在其他项目中作为依赖项使用。

所以对于您的问题的答案是:这取决于您是否要将其安装到您的本地存储库中。由于它位于目标阶段堆栈的较高位置,因此install也会运行package


我有一个项目,其中我正在将主文件夹代码和测试文件夹代码转换为Jar。然后,我想部署到nexus中,以便其他项目可以使用它。我的部署命令是“mvn clean deploy -DskipTests”。我能否将此命令打包,而不是安装到本地repo中? - MasterJoe
@MasterJoe2:“然后,我想将它部署到nexus。”这就是“deploy”的作用。如果你把它替换成“package”,它就不会被部署到Nexus。 - walen

47

mvn install 是最常用的选项。
mvn package 很少使用,只有在调试maven构建过程时才会使用。

参见:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

请注意,mvn package 仅会创建一个jar文件。
如果其他代码依赖于这些jar,则 mvn install 将把该jar(以及类等)文件安装在正确的位置。

我通常执行 mvn clean install; 这将删除 target 目录并在该位置重新创建所有jar文件。
清理可以帮助处理不需要的或已删除的内容,有时可能会妨碍工作进度。
与其进行调试(有时候),不如始终从头开始。


38
我不同意“package”很少被使用的两个观点。第一,每次运行安装时它都会运行。第二,如果你正在制作一个.war文件,那么仅运行“package”就可以了,因为你不需要在本地存储库中有一个war文件。 - Joshua Wilson
7
这个答案没有解释为什么你更愿意安装到本地仓库。在我看来,如果项目设置正确,那么反应堆将提供模块之间的依赖关系。如果项目设置不正确,那么安装只会隐藏这一事实并使用错误的构件。只有当你有必须分开构建的依赖项目时,才需要进行安装。 - Vsevolod Golovanov

15
生命周期参考中,install将运行项目的集成测试,package则不会。
如果您确实需要不安装生成的构件,请至少使用verify

链接的文档中说:“如果您不确定自己想要什么,最好调用的阶段是mvn verify”。因此,这是对原始问题的相当明确的答案。 - Brent Bradburn

6

同时,请注意,如果您的项目包含多个相互依赖的模块,则应使用“安装(install)”而不是“打包(package)”,否则可能会导致构建失败。因为当您使用“安装(install)”命令时,模块 A 将被打包并部署到本地库中,然后如果模块 B 需要模块 A 作为依赖项,则可以从本地库中访问它。


4
如果您没有使用远程存储库(如Artifactory),请使用以下命令:mvn clean install 虽然这是一个相对久远的话题,但据我所知,如果您运行自己的存储库(例如:使用Artifactory共享jar文件给团队),那么您可能需要使用以下命令:mvn clean deploy 这样,您的持续集成服务器可以确保所有依赖项都被正确推送到远程存储库中。如果您遗漏了其中任何一个,Maven将无法在CI本地m2存储库中找到它。

1
我认为你说的是mvn clean deploy,而不是mvn clean package。 - Mayjak

2

正确的方法是 mvn package,如果你构建的核心部分做得正确,那么就没有必要在本地仓库中安装软件包。

此外,如果您使用 Travis,可以“缓存”依赖项,因为它不会触及您的 $HOME.m2/repository,如果您为自己的项目使用 package 命令。

实际上,如果您尝试进行 mvn site,通常需要先执行 mvn install。因为 site 或其众多维护状况不佳的插件都存在太多缺陷。


2

package - 把已编译的代码打包成可分发的格式,例如JAR或WAR文件。 install - 将该软件包安装到本地存储库中,以便在其他项目中作为本地依赖项使用。


0

这取决于您更改Java文件后想要实现什么目标。如果您不想测试Maven进程,那么您不需要做任何事情。Eclipse / MyEclipse将构建必需的内容并将输出放在项目的适当位置。您还可以运行或部署它(例如,如果是Web项目),而无需显式地使用Maven进行任何操作。最终,为了将您的项目安装到Maven存储库中,您需要执行Maven安装。您可能还有其他希望执行的Maven目标,MyEclipse不会自动执行。

正如我所说,这取决于您想要做什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接