org.eclipse.persistence.moxy;2.3.2:解析 jersey-bundle 1.19.1 时未找到

org.eclipse.persistence.moxy;2.3.2: not found when resolving jersey-bundle 1.19.1

我在尝试将 ivy:install 模块 jersey-bundle 1.19.1 放入本地(基于文件系统的)Ivy 解析器时遇到异常。我设法使用下面更短的代码重现了这一点。

失败案例

我在下面的 ivysettings.xml 中定义了两个解析器。一个是 public ibiblio 解析器,另一个是本地(基于文件系统的解析器),我想将模块(及其依赖项)从 ibiblio 复制到其中:

<ivysettings>
    <settings defaultResolver="public" />

    <resolvers>
        <ibiblio name="public" m2compatible="true" />

        <filesystem name="fs-local">
            <ivy
                pattern="/tmp/local-ivy-repo/[organisation]/[module]/ivys/ivy-[revision].xml"/>
            <artifact
                pattern="/tmp/local-ivy-repo/[organisation]/[module]/[type]s/[artifact]-[revision].[ext]"/>
        </filesystem>

    </resolvers>
</ivysettings>

使用上面的 ivysettings.xml 文件,然后我有以下 Ant 文件 ivy:install 我感兴趣的模块:

<project name="local repository importation" default="install-locally">

    <target name="install-locally" description="import module from public Maven repository and install into local filesystem repository" xmlns:ivy="antlib:org.apache.ivy.ant">
        <ivy:settings id="ivysettings-ibiblio-to-local" file="ivysettings.xml"/>
        <ivy:install settingsRef="ivysettings-ibiblio-to-local"
                     organisation="com.sun.jersey"
                     module="jersey-bundle"
                     revision="1.19.1"
                     from="public"
                     to="fs-local"
                     transitive="true"
                     overwrite="true"/>
    </target>    
</project>

当我执行(使用Ant)上述文件时,我最终得到以下信息:

 :: problems summary ::
 :::: WARNINGS
 module not found: org.eclipse.persistence#org.eclipse.persistence.moxy;2.3.2
 ==== public: tried
   https://repo1.maven.org/maven2/org/eclipse/persistence/org.eclipse.persistence.moxy/2.3.2/org.eclipse.persistence.moxy-2.3.2.pom
   -- artifact org.eclipse.persistence#org.eclipse.persistence.moxy;2.3.2!org.eclipse.persistence.moxy.jar:
   https://repo1.maven.org/maven2/org/eclipse/persistence/org.eclipse.persistence.moxy/2.3.2/org.eclipse.persistence.moxy-2.3.2.jar
 ::::::::::::::::::::::::::::::::::::::::::::::
 ::          UNRESOLVED DEPENDENCIES         ::
 ::::::::::::::::::::::::::::::::::::::::::::::
 :: org.eclipse.persistence#org.eclipse.persistence.moxy;2.3.2: not found
 ::::::::::::::::::::::::::::::::::::::::::::::

这显然是警告而不是错误(不确定在这种情况下的区别有多重要)。查看 /tmp/local-ivy-repo/ 目录,我看到许多模块和 jar(包括 jersey-bundle)。

成功案例

另一方面,如果我尝试从 public 存储库中拉下 jersey-bundle 依赖项(不在本地使用 ivy:install 到 "install"),例如使用以下 Ant 文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:ivy="antlib:org.apache.ivy.ant"
         basedir="."
         default="retrieve-ivy-deps"
         name="foo">

    <target name="retrieve-ivy-deps"
            description="resolve and retrieve dependencies with ivy">
        <ivy:settings file="ivysettings.xml"/>
        <ivy:resolve file="ivy.xml"/>
        <ivy:retrieve conf="with-transitive"
                      pattern="ivy-jars/[artifact]-[revision](-[classifier]).[ext]"
                      sync="true"
                      type="jar, bundle"/>
    </target>

</project>

…和以下 Ivy 文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<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="foo" module="bar"/>
    <configurations>
        <conf name="with-transitive"  description="IVY jars with transitive dependencies"/>
    </configurations>
    <dependencies>
        <dependency org="com.sun.jersey"  name="jersey-bundle"  rev="1.19.1"  conf="with-transitive->default"/>
    </dependencies>
</ivy-module>

… 然后,我没有看到任何错误或警告,在操作结束时,我在 ivy-jars 目录中看到两个文件:jersey-bundle-1.19.1.jarjsr311-api-1.1.1.jar

我的问题是:

  1. 失败案例中警告消息的含义和重要性是什么,我该如何解决?
  2. 为什么 Ant/Ivy 能够从 ibiblio 模块 jersey-bundle 1.19.1 及其所有传递依赖项中拉取而不会失败,但不能 ivy:install 它?换句话说,为什么失败的案例失败了,成功的案例却成功了?
    1. 在成功的情况下,在相应的 Ivy 文件中,我要求模块及其所有传递依赖项(因为我使用的是 default 配置:<dependency org="com.sun.jersey" name="jersey-bundle" rev="1.19.1" conf="with-transitive->default"/>)。然而只下载了 2 个 jar。相比之下,当我查看 ivy-1.19.1.xml 时,我看到了大约 20 个依赖项,即使在失败的情况下,当我查看 /tmp/local-ivy-repo/ 目录时,我也看到了所有依赖项(除了 moxy 2.3.2).为什么会出现这种差异?

在安装任务上使用如下配置:

<ivy:install organisation="com.sun.jersey" ... conf="compile"/>

包含配置映射总是一个好主意。该错误似乎是检索不存在的可选 "provided" 范围依赖项的问题。

例子

├── build.xml
├── ivysettings.xml
└── local-ivy-repo
    ├── com.sun.jersey
    │   └── jersey-bundle
    │       └── ivys
    │           ├── ivy-1.19.1.xml
    │           ├── ivy-1.19.1.xml.md5
    │           └── ivy-1.19.1.xml.sha1
    └── javax.ws.rs
        └── jsr311-api
            ├── ivys
            │   ├── ivy-1.1.1.xml
            │   ├── ivy-1.1.1.xml.md5
            │   └── ivy-1.1.1.xml.sha1
            └── jars
                ├── jsr311-api-1.1.1.jar
                ├── jsr311-api-1.1.1.jar.md5
                └── jsr311-api-1.1.1.jar.sha1

build.xml

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

  <target name="build">
    <ivy:install organisation="com.sun.jersey"
                 module="jersey-bundle"
                 revision="1.19.1"
                 from="public"
                 to="fs-local"
                 transitive="true"
                 overwrite="true"
                 conf="compile"/>
  </target>

</project>

ivysettings.xml

<ivysettings>
  <settings defaultResolver="public" />

  <resolvers>
    <ibiblio name="public" m2compatible="true" />

    <filesystem name="fs-local">
      <ivy pattern="${ivy.settings.dir}/local-ivy-repo/[organisation]/[module]/ivys/ivy-[revision].xml"/>
      <artifact pattern="${ivy.settings.dir}/local-ivy-repo/[organisation]/[module]/[type]s/[artifact]-[revision].[ext]"/>
    </filesystem>
  </resolvers>

</ivysettings>