是否有一个Maven的“仅限编译器”的依赖工件作用域

pdtvr36n  于 12个月前  发布在  Maven
关注(0)|答案(2)|浏览(111)

我意识到这更像是一种语义上的探索,而不是功能上的探索。
我有三种类型的编译范围依赖:

  1. GWT客户端dev,MVP 4G,RestyGWT,Source retention annotation processors。我使用REST,所以我不需要GWT服务器端。
    1.提供-编译所需的Hibernate jar,但由JBoss提供。
    1.编译+运行时jar。
    对于第二种情况,我们可以使用提供的作用域。第三种情况,我们将使用编译作用域。
    但是对于案例1,我使用了提供的作用域,尽管JBoss根本不提供这些文件,在运行时也不需要它们。
    无论如何,你不认为Maven应该为一个作用域提供一个“provided”的同义词吗?在这个作用域中,除了在编译时之外,工件并不真正需要。也许,应该有一个“compile-only”作用域吗?
y53ybaqx

y53ybaqx1#

如果依赖项仅用于构建,例如注解处理器,则它应该是maven <plugin>或其<dependency>
否则,如果它在编译类路径中,则需要在运行时链接生成的类文件。那么,有两种情况:
1.总是需要加载该类
1.类应该作为应用程序的一部分提供:<scope>compile</scope>
1.类应该由运行时环境提供:<scope>provided</scope>
1.这有时是必要的(因为该类仅在特定情况下才会被加载):<optional>true</optional>
唯一没有涉及的选项是编译Java程序,并且永远不要在JVM中运行它。这是一个非常模糊的用例,我不能责怪maven的设计者没有包括一个范围来表达这种区别-特别是因为它与Maven的核心职责(构建软件)无关。

5vf7fwbs

5vf7fwbs2#

如果带有的jar不是真正的“运行时”依赖项(仅用于构建),而不是最终工件,您可以通过各种方式排除它们:
1.程序集描述符中的排除

  1. jar(或war、ear等)插件配置中的排除
  2. Shade Plugin minimize jar目标
    我同意运送不必要的类是令人讨厌的(我在生产部署中见过junit和testng jar- brrrr.),但对于所有实际目的来说,这是一个相当小的问题。
    如果你有一个依赖冲突(即发布一个库或框架的“所有deps”版本),那就是另一回事了,但听起来不像你在这里面临的。

相关问题