Answers:
从Maven文档中:
编译
这是默认范围,如果未指定则使用。编译依赖项在项目的所有类路径中均可用。此外,这些依赖项会传播到相关项目。
提供
这很像编译,但是表明您希望JDK或容器在运行时提供依赖项。例如,在为Java Enterprise Edition构建Web应用程序时,您将对Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类。该作用域仅在编译和测试类路径上可用,并且不可传递。
回顾:
compile
,则将引入传递依赖关系;如果范围为,则将传递传递依赖provided
。
编译意味着您需要JAR来编译和运行该应用程序。例如,对于Web应用程序,JAR将放置在WEB-INF / lib目录中。
提供意味着您需要编译JAR,但是在运行时环境已经提供了JAR,因此您不需要将其与应用程序打包在一起。对于Web应用程序,这意味着JAR文件不会放置在WEB-INF / lib目录中。
对于Web应用程序,如果应用程序服务器已提供JAR(或其功能),则使用“提供”,否则使用“编译”。
mvn exec:java
运行时不会将提供的依赖项添加到类路径中,而是将已编译的依赖项添加到类路径中。
如果您打算生成具有所有依赖关系的单个JAR文件(典型的xxxx-all.jar),则提供的范围很重要,因为该范围内的类不会打包在生成的JAR中。
有关更多信息,请参见maven-assembly-plugin。
maven-assembly-plugin
,OP的混淆已得到明显解决,有趣的是,投票最多的答案没有提及。
如果将maven scope设置为provided
,则意味着当插件运行时,所使用的实际依赖项版本将取决于您已安装的Apache Maven的版本。
JAR packaging
上下文范围的差异。Maven文档没有提及它。我使用Maven已有一段时间,但是我已经问过了自己一个问题:)因此,在JAR packaging
上下文中,compile
and 之间似乎没有任何区别provided
(依赖转换除外)。我对吗?