ivy:listmodule не находит существующий модуль

У нас есть общий репозиторий Ivy на веб-сервере nginx, доступном в нашей интрасети. Я настроил преобразователь url для чтения из общего репозитория и преобразователь ssh для записи в него, в основном следуя отличному запись в блоге об управлении зависимостями в не-Java-проектах.

Теперь я только что успешно опубликовал модуль в репозиторий через преобразователь ssh. В моем SFTP-клиенте я вижу структуру каталогов и файлы, находящиеся в каталоге, обслуживаемом веб-сервером:

com.organization/modulename/ivy-modulename-2.0.1.xml.md5
com.organization/modulename/ivy-modulename-2.0.1.xml.sha1
com.organization/modulename/ivy-modulename-2.0.1.xml
com.organization/modulename/modulename-2.0.1.zip.md5
com.organization/modulename/modulename-2.0.1.zip.sha1
com.organization/modulename/modulename-2.0.1.zip

Однако, когда я выполняю ivy:listmodule, похоже, он его не находит. Честно говоря, он ничего не выводит, кроме вывода инициализации ivysettings.

Это цель Ant, которую я выполняю:

<!-- ================================
     target: check-already-in-repo

     Check if the current version of a module already exists in the (shared) repository.
     ================================ -->
<target name="check-already-in-repo">
    <ivy:listmodules resolver="shared" organisation="${ivy.organisation}" module="${ivy.module}" revision="${version}" property="already-in-repo" value="true"/>

    <ac:if>
        <isset property="already-in-repo"/>
        <then>
            <echo>${ivy.module} ${version} already exists in the repository.</echo>
            <echo>Skipping publishing of ${ivy.module}.</echo>
        </then>
    </ac:if>
</target>

И это единственный выход:

$ ant check-already-in-repo -Dversion=2.0.1 -Divy.organisation=com.organization -Divy.module=modulename
Buildfile: [...]/build.xml

check-already-in-repo:
[ivy:listmodules] :: Apache Ivy 2.4.0-rc1 - 20140315220245 :: http://ant.apache.org/ivy/ ::
[ivy:listmodules] :: loading settings :: file = [...]/build/ivysettings.xml

BUILD SUCCESSFUL
Total time: 0 seconds

Я проверил значение ivy.shared.default.root и соответствующие шаблоны плюща и артефакта, и все они совпадают (я оставил их простыми).

Я попробовал это с помощью сопоставителя glob и вызвал ivy:listmodules с organization=*, module=* и revision=*, поэтому в каждом случае он должен возвращать что-то. Чего нет.

Что мне не хватает?

Вот остальная часть соответствующей конфигурации:

<ivysettings>

    <!-- This file is referenced from multiple projects - DO NOT EDIT! -->

    <!-- shared -->
    <property name="ivy.shared.default.root" value="http://10.79.1.30/ivy"/>
    <property name="ivy.shared.default.ivy.pattern" value="[organisation]/[module]/ivy-[module]-[revision].[ext]"/>
    <property name="ivy.shared.default.artifact.pattern" value="[organisation]/[module]/[artifact]-[revision].[ext]"/>

    <!-- local -->
    <property name="ivy.local.default.root" value="${ivy.default.ivy.user.dir}/local"/>
    <property name="ivy.local.default.ivy.pattern" value="${ivy.shared.default.ivy.pattern}"/>
    <property name="ivy.local.default.artifact.pattern" value="${ivy.shared.default.artifact.pattern}"/>

    <settings defaultResolver="default"/>
    <resolvers>
        <filesystem name="local">
            <ivy pattern="${ivy.local.default.root}/${ivy.local.default.ivy.pattern}" />
            <artifact pattern="${ivy.local.default.root}/${ivy.local.default.artifact.pattern}" />
        </filesystem>
        <!-- read access -->
        <url name="shared">
            <ivy pattern="${ivy.shared.default.root}/${ivy.shared.default.ivy.pattern}" />
            <artifact pattern="${ivy.shared.default.root}/${ivy.shared.default.artifact.pattern}" />
        </url>
        <!-- write access -->
        <ssh name="ssh" host="10.79.1.30" port="22" user="ivy" userPassword="${ivy.ssh.password}" publishPermissions="0664">
            <ivy pattern="${ivy.shared.default.ivy.pattern}" />
            <artifact pattern="${ivy.shared.default.artifact.pattern}" />
        </ssh>
        <chain name="default" returnFirst="true">
            <resolver ref="local"/>
            <resolver ref="shared"/>
        </chain>
    </resolvers>
</ivysettings>

person bassim    schedule 08.07.2014    source источник


Ответы (1)


После выполнения цели Ant с опцией -d (отладка) кое-что привлекло мое внимание:

$ ant check-already-in-repo -Dversion=2.0.1 -Divy.organisation=com.organization -Divy.module=modulename -d
[...]
[ivy:listmodules]   using shared to list all in http://10.79.1.30/ivy/
[ivy:listmodules] HTTP response status: 403 url=http://10.79.1.30/ivy/
[ivy:listmodules] CLIENT ERROR: Forbidden url=http://10.79.1.30/ivy/
[ivy:listmodules] HTTP response status: 403 url=http://10.79.1.30/ivy/
[ivy:listmodules] CLIENT ERROR: Forbidden url=http://10.79.1.30/ivy/
[ivy:listmodules] problem while listing resources in http://10.79.1.30/ivy/ with shared (java.io.IOException: The HTTP response code for http://10.79.1.30/ivy/ did not indicate a success. See log for more detail.)
[ivy:listmodules] java.io.IOException: The HTTP response code for http://10.79.1.30/ivy/ did not indicate a success. See log for more detail.
[...]

Кажется, чтобы listmodules работало, веб-сервер должен иметь включенные списки каталогов. И действительно, после добавления

location /ivy {
    autoindex on;
}

к конфигурации nginx и перезапуску веб-сервера, он, наконец, заработал, как и ожидалось!

$ ant check-already-in-repo -Dversion=2.0.1 -Divy.organisation=com.organization -Divy.module=modulename
Buildfile: [...]/build.xml

check-already-in-repo:
[ivy:listmodules] :: Apache Ivy 2.4.0-rc1 - 20140315220245 :: http://ant.apache.org/ivy/ ::
[ivy:listmodules] :: loading settings :: file = [...]/build/ivysettings.xml
     [echo] modulename 2.0.1 already exists in the repository.
     [echo] Skipping publishing of modulename.

BUILD SUCCESSFUL
Total time: 0 seconds

Ура! :-)

person bassim    schedule 08.07.2014