maven范围编译和为JAR打包提供的区别

当工件被构建为JAR时,maven作用域compileprovided之间有什么区别?如果它是WAR,我能理解-工件将包含或不包含在WEB-INF/lib中。但是对于JAR来说,这并不重要——依赖关系不包括在内。当它们的作用域是compileprovided时,它们必须在类路径上。我知道provided依赖关系不是可传递的——但这只是一个区别吗?

330122 次浏览

Maven医生:

  • < p > 编译

    这是默认的作用域,如果没有指定则使用。编译 依赖项在项目的所有类路径中都可用。 此外,这些依赖项被传播到依赖项目

  • < p > 提供

    这很像compile,但表明您希望使用JDK或a 容器在运行时提供依赖项。例如,当 为Java企业版构建一个web应用程序,你会 将Servlet API和相关Java EE API的依赖项设置为 提供的范围,因为web容器提供了这些类。这 范围仅在编译和测试类路径上可用,并且为 李不传递。< / p > < / >

回顾:

  • 依赖关系是不可传递的(正如你所提到的)
  • 提供的作用域只在编译和测试类路径上可用,而编译作用域在所有类路径上可用。
  • 所提供的依赖项没有打包

如果您计划生成一个包含其所有依赖项的JAR文件(典型的xxxx-all.jar),那么提供的范围很重要,因为这个范围内的类不会打包到生成的JAR中。

更多信息请参见maven-assembly-plugin

对于一个web应用程序,例如,JAR <强> < /强>应该放在web - inf /lib目录下。

对于web应用程序,这意味着JAR文件< >强不会< / >强被放置到web - inf /lib目录中。

对于web应用程序,如果应用服务器已经提供了JAR(或它的功能),那么使用"否则使用“编译”。

这是参考

  • 编译

在类路径中可用,如果是普通jar,不要将此依赖项添加到final jar;但是如果最终的jar是一个单独的jar(例如,可执行的jar),则将这个jar添加到jar中。

  • 提供

依赖项将在运行时环境中可用,所以在任何情况下都不要添加此依赖项;甚至不是在单个jar(即可执行jar等)中

对于jar文件,区别在于MANIFEST中列出的类路径。如果在maven-jar-plugin配置中将addClassPath设置为true,则jar中包含MF文件。'compile'依赖项将出现在清单中,'provided'依赖项不会出现。

我最讨厌的是这两个词的时态相同。要么编译并提供,要么编译并提供。

如果jar文件类似于可执行的spring引导jar文件,那么所有依赖项的范围必须是compile,以包括所有jar文件。

但如果jar文件用于其他包或应用程序,则不需要在jar文件中包含所有依赖项,因为这些包或应用程序本身可以提供其他依赖项。