常春藤检索导致“找不到模块:org.slf4j#slf4j-api; $ {slf4j.version}”

时间:2014-12-03 05:01:11

标签: ant slf4j ivy

我的问题是,为什么我能够从公共常春藤回购中吸引一些但不是全部的依赖?

我使用ant build.xml脚本来调用ivy:retrieve命令。这是我的ivy.xml文件中的相关行,为了清楚起见,我删除了所有其他依赖项:

<dependencies>
    <dependency org="log4j" name="log4j" rev="1.2.16"/>
</dependencies>

是从我的ivysettings.xml文件中提供的公共存储库中提取的

<!-- General public repository !-->
    <ibiblio name="public" m2compatible="true"/>

它设法引入一些依赖关系,所以我知道它正确访问了ibiblio repos。但是,构建失败并出现以下错误:

[ivy:retrieve] 
[ivy:retrieve] :: problems summary ::
[ivy:retrieve] :::: WARNINGS
[ivy:retrieve]      module not found: org.slf4j#slf4j-api;${slf4j.version}
[ivy:retrieve]  ==== public: tried
[ivy:retrieve]    http://repo1.maven.org/maven2/org/slf4j/slf4j-api/${slf4j.version}/slf4j-api-${slf4j.version}.pom
[ivy:retrieve]    -- artifact org.slf4j#slf4j-api;${slf4j.version}!slf4j-api.jar:
[ivy:retrieve]    http://repo1.maven.org/maven2/org/slf4j/slf4j-api/${slf4j.version}/slf4j-api-${slf4j.version}.jar
[ivy:retrieve]      ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:retrieve]      ::          UNRESOLVED DEPENDENCIES         ::
[ivy:retrieve]      ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:retrieve]      :: org.slf4j#slf4j-api;${slf4j.version}: not found
[ivy:retrieve]      ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:retrieve] 
[ivy:retrieve] :: USE VERBOSE OR DEBUG MESSAGE LEVEL FOR MORE DETAILS

由于某种原因,它无法获取slf4j的jar依赖项。为什么会这样?如果它有帮助,我有一个同事在他们的工作站上使用相同版本的ant和ivy运行相同的build.xml文件,并且构建对他们来说是成功的。如有必要,我可以提供有关我们开发环境的更多信息。

2 个答案:

答案 0 :(得分:1)

如果你仔细观察控制台输出,你会看到这一点:

[ivy:retrieve]  ==== public: tried
[ivy:retrieve]    http://repo1.maven.org/maven2/org/slf4j/slf4j-api/${slf4j.version}/slf4j-api-${slf4j.version}.pom
[ivy:retrieve]    -- artifact org.slf4j#slf4j-api;${slf4j.version}!slf4j-api.jar:
[ivy:retrieve]    http://repo1.maven.org/maven2/org/slf4j/slf4j-api/${slf4j.version}/slf4j-api-${slf4j.version}.jar
[ivy:retrieve]      ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:retrieve]      ::          UNRESOLVED DEPENDENCIES         ::
[ivy:retrieve]      ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:retrieve]      :: org.slf4j#slf4j-api;${slf4j.version}: not found
[ivy:retrieve]      ::::::::::::::::::::::::::::::::::::::::::::::

您尝试解决位于以下位置的资源:

[ivy:retrieve]    http://repo1.maven.org/maven2/org/slf4j/slf4j-api/${slf4j.version}/slf4j-api-${slf4j.version}.pom

和$ {slf4j.version} - 是一个因某种原因未实例化的变量。可能会错过 build.properties/ivy.properties ,或者此变量应直接在 build.xml / ivy.settings / ivysettings.xml / whatever_file_define_resolve_variables.xml 中定义。 但是因为没有定义常春藤试图让资源完全位于

http://repo1.maven.org/maven2/org/slf4j/slf4j-api/${slf4j.version}/slf4j-api-${slf4j.version}.pom

而不是

http://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.9/slf4j-api-1.7.9.pom

因此,要获得解析运行,您应该以某种方式定义名为'slf4j.version'的变量。尝试搜索如何为常春藤或蚂蚁定义变量。有不同的方法可以做到这一点。

答案 1 :(得分:0)

无法重现您的问题。

实施例

├── build.xml
├── ivysettings.xml
├── ivy.xml
└── lib
    ├── activation-1.1.jar
    ├── geronimo-jms_1.1_spec-1.0.jar
    ├── log4j-1.2.16.jar
    ├── log4j-1.2.16-javadoc.jar
    ├── log4j-1.2.16-sources.jar
    └── mail-1.4.1.jar

的build.xml

<project name="demo" default="build" xmlns:ivy="antlib:org.apache.ivy.ant">

    <target name="build">
        <ivy:retrieve pattern="lib/[artifact]-[revision](-[classifier]).[ext]"/>
    </target>

    <target name="clean">
        <delete dir="lib"/>
        <ivy:cleancache/>
    </target>

</project>

的ivy.xml

<ivy-module version="2.0">
    <info organisation="com.myspotontheweb" module="demo"/>

    <dependencies>
        <dependency org="log4j" name="log4j" rev="1.2.16"/>
    </dependencies>

</ivy-module>

ivysettings.xml

<ivysettings>
  <settings defaultResolver="central" />
  <resolvers>
    <ibiblio name="central" m2compatible="true"/>
  </resolvers>
</ivysettings>