系统范围相当于常春藤

时间:2013-05-26 04:18:17

标签: java maven ant ivy

我正在寻找Maven for Ivy中系统范围依赖的等价物。在Maven中,声明与系统范围的依赖关系意味着Maven不会在输出中包含依赖项,这就是我想要的。我如何与常春藤实现同样的目标?

2 个答案:

答案 0 :(得分:2)

我怀疑你在谈论Maven provided scope,而不是系统。

  

提供这与编译很相似,但表示您希望JDK或容器在运行时提供依赖关系。例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类。此范围仅适用于编译 test 类路径,并且不具有传递性。

Ivy的配置非常灵活,这意味着有几种方法可以做到这一点。

的ivy.xml

我会在我的构建将使用的不同类型的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"/>

有关常春藤配置映射的更多详细信息,请参阅:

的build.xml

这是实际管理类路径的地方。 (我们可以尝试在各种常春藤配置中模拟设置关系,但我认为这种方法更简单并完成工作)

<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"/>

答案 1 :(得分:0)

我想唯一要处理的问题是有一个应该在编译时使用的依赖项,但不能在运行时使用,对吗?

以下是关于如何处理它的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>