Ivy 解决其他配置中的依赖
Ivy Resolves Dependencies In Other Configurations
我无法通过配置名称检索我期望的依赖项。我有一个共享库,我正在使用以下 ivy 文件发布到本地存储库:
<?xml version="1.0"?>
<ivy-module version="2.0">
<info organisation="my.org" module="my-stuff" status="release"/>
<configurations>
<conf name="runtime"/>
<conf name="provided" extends="runtime"/>
<conf name="test" extends="provided"/>
</configurations>
<publications>
<artifact name="my-stuff" type="jar" ext="jar" conf="*"/>
<artifact name="my-stuff" type="source" ext="zip" conf="*"/>
</publications>
<dependencies>
<dependency org="javax.servlet" name="servlet-api" rev="2.4" conf="provided,test -> master"/>
<dependency org="org.apache.tomcat" name="tomcat-dbcp" rev="7.0.47" conf="provided,test -> master"/>
<dependency org="log4j" name="log4j" rev="1.2.17" conf="* -> master"/>
<dependency org="my.org" name="my-module" rev="1.2.3" conf="* -> default"/>
<dependency org="junit" name="junit" rev="4.5" conf="provided,test -> master"/>
<dependency org="org.apache.ant" name="ant" rev="1.8.4" conf="provided,test -> master"/>
</dependencies>
</ivy-module>
到目前为止,还不错。我发布了 my-stuff
jar,如果我尝试通过配置检索它的依赖项,我会得到我所期望的,运行时配置中有两个依赖项,提供的配置和测试配置中各有六个。当我试图检索依赖于 my-stuff
的东西的依赖项时,麻烦就开始了。我使用这个常春藤文件:
<?xml version="1.0"?>
<ivy-module version="2.0">
<info organisation="my.org" module="test-my-stuff" status="release"/>
<configurations>
<conf name="runtime"/>
<conf name="provided" extends="runtime"/>
<conf name="test" extends="provided"/>
</configurations>
<dependencies>
<dependency org="my.org" name="my-stuff" rev="1.1"/>
</dependencies>
</ivy-module>
现在,如果我尝试检索 runtime
配置,而不是获取 my-stuff
jar、log4j
和 my-module
,我会得到十二个 jar,包括 activation.jar
和mail.jar
,我用第一个ivy文件检索时没有得到的东西。为什么我的第二个 ivy 文件将所有内容都拉入运行时配置?我到底做错了什么?
另一方面,如果我在第二个文件中添加配置映射到依赖项,例如runtime->runtime;provided->provided;test->test
,解析将失败,声称找不到my-stuff
。
我认为您的问题在于您如何声明已发布工件的配置:
<publications>
<artifact name="my-stuff" type="jar" ext="jar" conf="*"/>
<artifact name="my-stuff" type="source" ext="zip" conf="*"/>
</publications>
您基本上是在说它们应该是 "runtime"、"provided" 和 "test" 配置的一部分。此外,由于 3 个配置是嵌套的,"runtime" 中的某些内容将自动成为 "provided" 和 "test" 的一部分。
所以我建议按如下方式重组您的 ivy 文件:
<configurations>
<conf name="default" extends="runtime,master"/>
<conf name="master"/>
<conf name="sources"/>
<conf name="provided"/>
<conf name="runtime"/>
<conf name="test" extends="runtime"/>
</configurations>
<publications>
<artifact name="my-stuff" type="jar" ext="jar" conf="master"/>
<artifact name="my-stuff" type="source" ext="zip" conf="sources"/>
</publications>
备注:
- 主要工件位于独立 "master" 配置中,该配置也包含在 "default" 配置中
- "sources" 的额外配置。使其与运行时隔离并允许显式下载
- "provided" 范围是独立的。这很重要,因为您不希望它被意外打包到 war 文件中。
依赖声明现在应该可以工作,但提供显式配置映射始终是个好主意,在本例中为我们的新 "default" 配置:
<dependency org="my.org" name="my-stuff" rev="1.1" conf="runtime->default"/>
我无法通过配置名称检索我期望的依赖项。我有一个共享库,我正在使用以下 ivy 文件发布到本地存储库:
<?xml version="1.0"?>
<ivy-module version="2.0">
<info organisation="my.org" module="my-stuff" status="release"/>
<configurations>
<conf name="runtime"/>
<conf name="provided" extends="runtime"/>
<conf name="test" extends="provided"/>
</configurations>
<publications>
<artifact name="my-stuff" type="jar" ext="jar" conf="*"/>
<artifact name="my-stuff" type="source" ext="zip" conf="*"/>
</publications>
<dependencies>
<dependency org="javax.servlet" name="servlet-api" rev="2.4" conf="provided,test -> master"/>
<dependency org="org.apache.tomcat" name="tomcat-dbcp" rev="7.0.47" conf="provided,test -> master"/>
<dependency org="log4j" name="log4j" rev="1.2.17" conf="* -> master"/>
<dependency org="my.org" name="my-module" rev="1.2.3" conf="* -> default"/>
<dependency org="junit" name="junit" rev="4.5" conf="provided,test -> master"/>
<dependency org="org.apache.ant" name="ant" rev="1.8.4" conf="provided,test -> master"/>
</dependencies>
</ivy-module>
到目前为止,还不错。我发布了 my-stuff
jar,如果我尝试通过配置检索它的依赖项,我会得到我所期望的,运行时配置中有两个依赖项,提供的配置和测试配置中各有六个。当我试图检索依赖于 my-stuff
的东西的依赖项时,麻烦就开始了。我使用这个常春藤文件:
<?xml version="1.0"?>
<ivy-module version="2.0">
<info organisation="my.org" module="test-my-stuff" status="release"/>
<configurations>
<conf name="runtime"/>
<conf name="provided" extends="runtime"/>
<conf name="test" extends="provided"/>
</configurations>
<dependencies>
<dependency org="my.org" name="my-stuff" rev="1.1"/>
</dependencies>
</ivy-module>
现在,如果我尝试检索 runtime
配置,而不是获取 my-stuff
jar、log4j
和 my-module
,我会得到十二个 jar,包括 activation.jar
和mail.jar
,我用第一个ivy文件检索时没有得到的东西。为什么我的第二个 ivy 文件将所有内容都拉入运行时配置?我到底做错了什么?
另一方面,如果我在第二个文件中添加配置映射到依赖项,例如runtime->runtime;provided->provided;test->test
,解析将失败,声称找不到my-stuff
。
我认为您的问题在于您如何声明已发布工件的配置:
<publications>
<artifact name="my-stuff" type="jar" ext="jar" conf="*"/>
<artifact name="my-stuff" type="source" ext="zip" conf="*"/>
</publications>
您基本上是在说它们应该是 "runtime"、"provided" 和 "test" 配置的一部分。此外,由于 3 个配置是嵌套的,"runtime" 中的某些内容将自动成为 "provided" 和 "test" 的一部分。
所以我建议按如下方式重组您的 ivy 文件:
<configurations>
<conf name="default" extends="runtime,master"/>
<conf name="master"/>
<conf name="sources"/>
<conf name="provided"/>
<conf name="runtime"/>
<conf name="test" extends="runtime"/>
</configurations>
<publications>
<artifact name="my-stuff" type="jar" ext="jar" conf="master"/>
<artifact name="my-stuff" type="source" ext="zip" conf="sources"/>
</publications>
备注:
- 主要工件位于独立 "master" 配置中,该配置也包含在 "default" 配置中
- "sources" 的额外配置。使其与运行时隔离并允许显式下载
- "provided" 范围是独立的。这很重要,因为您不希望它被意外打包到 war 文件中。
依赖声明现在应该可以工作,但提供显式配置映射始终是个好主意,在本例中为我们的新 "default" 配置:
<dependency org="my.org" name="my-stuff" rev="1.1" conf="runtime->default"/>