我正在使用 Apache Ivy 来管理传递依赖项。
使用 Maven 是一次非常好的体验,因为如果有任何依赖项在远程目录中不可用或在不同版本中可用,那么 Maven 会有效地管理这些依赖项。
然而,在我的例子中,Ivy 遇到了这个问题,因为我正在尝试管理 Mule 依赖项,但 Ivy 很难管理,而 Maven 可以很好地管理它,没有任何问题。
更重要的一点是,我什至无法排除任何依赖项,因为我不想排除,但我希望 Ivy 有足够的能力,以便它可以管理所有依赖项或任何其他方式(如果有)。
下面是错误的屏幕截图以及必要的 XML 文件。
ivy.xml
<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
<info
organisation="MyOrganization"
module="TestForIvySupport"
status="integration">
</info>
<dependencies>
<dependency org="org.mule" name="mule-core" rev="3.6.0"/>
</dependencies>
ivysettings.xml
<settings defaultResolver="chained"/>
<resolvers>
<chain name="chained">
<url name="custom-repo">
<ivy pattern="https://repository.mulesoft.org/nexus/content/groups/public/org/[organisation]/[module]/[revision]/ivy-[revision].xml"/>
<artifact pattern="https://repository.mulesoft.org/nexus/content/groups/public/org/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"/>
</url>
<ibiblio name="ibiblio" m2compatible="true" root="http://mirrors.ibiblio.org/maven2/"/>
<ibiblio name="ibiblio1" m2compatible="true" root="http://repo1.maven.org/maven2/"/>
</chain>
</resolvers>
build.xml
<project name="test ivy" default="test" xmlns:ivy="antlib:org.apache.ivy.ant">
<target name="test" description="Test ivy installation">
<ivy:settings file="ivysettings.xml"/>
<ivy:retrieve sync="false" pattern="myfolder/[artifact]-[revision].[ext]"/>
</target>
最佳答案
使用您的示例我遇到了不同的错误:
[ivy:resolve] ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve] :: UNRESOLVED DEPENDENCIES ::
[ivy:resolve] ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve] :: org.mule.mvel#mule-mvel2;2.1.9-MULE-005: not found
[ivy:resolve] :: org.mule.common#mule-common;3.6.0: not found
[ivy:resolve] ::::::::::::::::::::::::::::::::::::::::::::::
我最终让它工作了,但发现了一个损坏的 POM。
工作示例
ivy.xml
<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
<info
organisation="MyOrganization"
module="TestForIvySupport"
status="integration">
</info>
<dependencies>
<!-- Exclude the broken dependency -->
<dependency org="org.mule" name="mule-core" rev="3.6.0" conf="default">
<exclude org="com.github.stephenc.eaio-grabbag" module="grabbag"/>
</dependency>
<!-- Just pull down the jar artifact associated with the module -->
<dependency org="com.github.stephenc.eaio-grabbag" name="grabbag" rev="1.8.1" conf="default">
<artifact name="grabbag" type="jar"/>
</dependency>
</dependencies>
</ivy-module>
注释:
- 与抓取包依赖项关联的 POM 已损坏。
- 解决方法告诉 ivy 忽略 POM,然后我们显式下拉 jar 文件作为第二个依赖项声明。
ivysettings.xml
<ivysettings>
<settings defaultResolver="chained"/>
<resolvers>
<chain name="chained" returnFirst="true">
<ibiblio name="central" m2compatible="true"/>
<ibiblio name="mulesoft" m2compatible="true" root="https://repository.mulesoft.org/nexus/content/groups/public"/>
</chain>
</resolvers>
</ivysettings>
注释:
- 简化了设置文件,以使用 ibiblio 资源与两个 Maven 存储库进行通信:Maven Central 和 Mulesoft 存储库
错误分析
第一个错误分析
我追踪到这是“mule-core”模块的父pom的问题。
存在覆盖依赖项,其中属性引用 Maven Central 中不存在的“mule-mvel2”模块版本
<properties>
..
<muleMvelVersion>2.1.9-MULE-005</muleMvelVersion>
..
</properties>
<dependency>
<groupId>org.mule.mvel</groupId>
<artifactId>mule-mvel2</artifactId>
<version>${muleMvelVersion}</version>
</dependency>
设法通过添加以下 Mulesoft 存储库来解决此问题。
第二个错误分析
进一步排除故障后,我发现了第二个级联错误:
[ivy:resolve] ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve] :: FAILED DOWNLOADS ::
[ivy:resolve] :: ^ see resolution messages for details ^ ::
[ivy:resolve] ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve] :: com.github.stephenc.eaio-grabbag#grabbag;1.8.1!grabbag.non-maven-jar
[ivy:resolve] ::::::::::::::::::::::::::::::::::::::::::::::
这个问题更加严重,因为它是由错误配置的 POM 文件引起的:
包装已从“jar”默认值更改
<packaging>non-maven-jar</packaging>
ivy 的解决方法是排除这个损坏的传递依赖项,然后显式地将 jar Artifact 作为 ivy 文件中的第二个依赖项拉下来。
我已经筹集了github issue与该项目。
关于java - IvyDE 无法解析 Mule 依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33865008/