【发布时间】:2023-03-17 07:44:01
【问题描述】:
我正在为 Ivy 在 Maven 中寻找系统范围依赖的等价物。在 Maven 中,声明具有系统范围的依赖项意味着 Maven 不会在输出中包含依赖项,这正是我想要的。我怎样才能用 Ivy 实现同样的目标?
【问题讨论】:
我正在为 Ivy 在 Maven 中寻找系统范围依赖的等价物。在 Maven 中,声明具有系统范围的依赖项意味着 Maven 不会在输出中包含依赖项,这正是我想要的。我怎样才能用 Ivy 实现同样的目标?
【问题讨论】:
我怀疑你说的是 Maven provided scope,而不是系统。
provided 这很像编译,但表示您希望 JDK 或容器在运行时提供依赖项。例如,在为 Java Enterprise Edition 构建 Web 应用程序时,您可以将 Servlet API 和相关 Java EE API 的依赖设置为提供的范围,因为 Web 容器提供了这些类。此范围仅在 compilation 和 test 类路径中可用,并且不可传递。
Ivy 的配置非常灵活,这意味着有多种方法可以做到这一点。
我会在我的构建将使用的不同类型的 jar 上对我的配置进行建模:
<configurations>
<conf name="compile" description="Required to compile application"/>
<conf name="runtime" description="Additional run-time dependencies" extends="compile"/>
<conf name="test" description="Required for test only" extends="runtime"/>
<conf name="provided" description="Additional compile time dependencies, implementation provided by target platform"/>
</configurations>
然后使用“conf”映射将依赖项分配给每个逻辑分组:
<!-- compile dependencies -->
<dependency org="org.slf4j" name="slf4j-api" rev="1.7.5" conf="compile->default"/>
注意这是“扩展”属性有用的地方,如果没有它,日志依赖项将需要以下映射:
<!-- compile dependencies -->
<dependency org="org.slf4j" name="slf4j-api" rev="1.7.5" conf="compile,runtime,test->default"/>
目标平台提供的依赖是特殊的。这就是我为它们创建独立配置的原因:
<!-- compile dependencies -->
<dependency org="my.target.platform" name="makeitgo-api" rev="1.0" conf="provided->default"/>
有关 ivy 配置映射的更多详细信息,请参阅:
这里是实际管理类路径的地方。 (我们可以尝试在各种 ivy 配置中对集合关系进行建模,但我认为这种方法更简单并且可以完成工作)
<target name="resolve" description="Use ivy to resolve classpaths">
<ivy:resolve/>
<ivy:report todir='${ivy.reports.dir}' graph='false' xml='false'/>
<ivy:cachepath pathid="compile.path" conf="compile,provided"/>
<ivy:cachepath pathid="test.path" conf="test,provided"/>
</target>
因此,正如 Maven 文档所述,将提供的依赖项添加到编译和测试路径。
这意味着“运行时”配置仅包含应捆绑的依赖项:
<ivy:retrieve pattern="${build.dir}/WEB-INF/lib/[artifact]-[revision].[ext]" conf="runtime"/>
【讨论】:
我想唯一要处理的问题是有一个应该在编译时使用而不是在运行时使用的依赖项,对吧?
这里有一个ivy.xml的例子来说明如何处理它:
<ivy-module version="2.0" xmlns:m="http://ant.apache.org/ivy/maven">
<info organisation="com.acme" module="mymodule" />
<configurations>
<conf name="default" description="runtime" />
<conf name="runtime" description="Runtime configuration"/>
<conf name="compile" description="Used only for compilation" />
<conf name="test" extends="compile,runtime" description="Unit testing configuration" visibility="private" />
</configurations>
<dependencies defaultconf="runtime,compile->default">
<!-- Compile and runtime -->
<dependency org="commons-lang" name="commons-lang" rev="2.6" />
<!-- Only compile -->
<dependency org="javax.servlet" name="servlet-api" rev="2.5" conf="compile->default" />
</dependencies>
</ivy-module>
【讨论】: