文件系统解析器和传递依赖/主配置

时间:2017-02-07 18:08:08

标签: java ivy

我按照in this answer解释,使用filesystem解析器设置了常春藤。即把我的罐子放在' lib'目录并配置filesystem解析程序从那里获取它们(而不是使用默认的ibiblio解析程序)。

文件ivysettings.xml如下:

<ivysettings>
  <caches defaultCacheDir="${ivy.settings.dir}/cache"/>
  <settings defaultResolver="local"/>
  <resolvers>
     <filesystem name="local">
        <artifact pattern="${ivy.settings.dir}/lib/[artifact]-[revision].[ext]"/>
     </filesystem>
  </resolvers>
</ivysettings>

我的ivy.xml也非常简单,出于测试目的,我只定义了一个配置:

<?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="foo" status="foo"/>
    <configurations>
        <conf name="theConf"  description="just one configuration"/>
    </configurations>
    <dependencies>
        <dependency org="org.apache.commons" name="commons-lang3" rev="3.1" conf="theConf->default"/>
    </dependencies>
</ivy-module>

lib目录中正确检索上述工作和依赖项。但是我注意到,如果我更改ivy.xml文件中的依赖元素以获取&#34; master&#34;而不是&#34;默认&#34;配置:

<dependency org="org.apache.commons" name="commons-lang3" rev="3.1" conf="theConf->master"/>

...然后它不再有效,我得到以下内容:

resolve: [ivy:resolve] :: Apache Ivy 2.4.0-local-20161112135640 -
20161112135640 :: http://ant.apache.org/ivy/ :: [ivy:resolve] ::
loading settings :: file =
/home/mperdikeas/play/ivy-with-local-filesystem/ivysettings.xml
[ivy:resolve] :: resolving dependencies :: foo#foo;working@mp-t420
[ivy:resolve]   confs: [theConf] [ivy:resolve]  found
org.apache.commons#commons-lang3;3.1 in local [ivy:resolve] ::
resolution report :: resolve 66ms :: artifacts dl 0ms
---------------------------------------------------------------------
|                  |            modules            ||   artifacts   |
|       conf       | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
|      theConf     |   1   |   0   |   0   |   0   ||   0   |   0   |
---------------------------------------------------------------------
[ivy:resolve]  [ivy:resolve] :: problems summary :: [ivy:resolve] ::::
WARNINGS [ivy:resolve]
    :::::::::::::::::::::::::::::::::::::::::::::: [ivy:resolve]        ::   
UNRESOLVED DEPENDENCIES         :: [ivy:resolve]
    :::::::::::::::::::::::::::::::::::::::::::::: [ivy:resolve]        ::
org.apache.commons#commons-lang3;3.1: configuration not found in
org.apache.commons#commons-lang3;3.1: 'master'. It was required from
foo#foo;working@mp-t420 theConf [ivy:resolve]
    :::::::::::::::::::::::::::::::::::::::::::::: [ivy:resolve] 
[ivy:resolve] :: USE VERBOSE OR DEBUG MESSAGE LEVEL FOR MORE DETAILS

所以,即使找到该模块,它也是&#34; master&#34;找不到配置。

要完成这项工作,我需要将theConf->master更改为theConf->default,或者只是完全删除conf映射。

进一步反思这一点,我意识到我也不明白一个filesystem解决方法是如何在一个目录中找到平坦的内容,以区分不同的配置和获取,例如只编译时间与模块的传递依赖关系。

无论如何必须始终使用&#34;默认&#34;配置导致我的问题,因为我必须修改我的ivy.xml文件。当我使用ibiblio解析器解析时,我通常会在ivy.xml中使用

conf="compile->master"

......或:

conf="runtime->default"

...取决于我是否需要传递依赖。无论我在ivy.xml配置使用的解析器,我都希望保留相同的ivysettings.xml文件。

我的问题是:

  1. 是否可以为ivy.xmlibiblio解析器保留相同的filesystem文件,以及如何处理&#34; master&#34;在这种情况下的配置?
  2. filesystem解析器如何理解配置是否可以拾取平放在目录中的jar?
  3. 是否可以配置filesystem解析器,以便也可以使用依赖项获取传递依赖项,在这种情况下应该是什么文件系统结构?
  4. 我只是在filesystem解析器正在查看的目录中复制jar。我应该使用一些导入机制(例如,创建适当的目录结构,可能允许解析器也获取传递依赖)。

1 个答案:

答案 0 :(得分:0)

我放弃使用只有一堆罐子的平面目录结构。现在我很清楚,除了jar之外,还需要存在声明性文件来正确识别每个模块的依赖关系。

我发现的工作是使用ivy:install任务将我需要的依赖项从ibiblio解析程序导入到我的本地filesystem解析程序中。或多或少如in this post所述。

我已经创建了一个build-import-Maven-dependencies-to-local.xml脚本来自动执行此过程。有些添加了“聪明”(这并不重要,你可以省去),可以一行一行地对齐所有依赖项,它看起来像下面的那样(要点是最后一个目标,“安装”):

<project name="local repository importation" default="install-deps-locally"
         xmlns:contrib="http://net.sf.antcontrib"
         xmlns:ivy="antlib:org.apache.ivy.ant">

    <taskdef uri="http://net.sf.antcontrib" resource="net/sf/antcontrib/antlib.xml" classpath="${basedir}/tools/ant-contrib.jar" />

    <target name="install-deps-locally" description="local at non default location">
        <!-- "iw" starts for "Import Wrapper" and "d" stands for "dependency" -->
        <antcall target="iw"><param name="d" value="javax.servlet              javax.servlet-api   3.1.0"   /></antcall>
        <antcall target="iw"><param name="d" value="com.google.code.gson       gson                2.8.0"   /></antcall>
        <antcall target="iw"><param name="d" value="junit                      junit               4.12"    /></antcall>
    </target>

    <target name="iw"> <!-- "iw" stands for "Import Wrapper" and "d" stands for "dependency" -->
        <property name="REGULAR_EXPRESSION" value="(\S*)(\s*)(\S*)(\s*)(\S*)"/>
        <contrib:propertyregex property="organisation"
                       input="${d}"
                       regexp="${REGULAR_EXPRESSION}"
                       select="\1"
                       casesensitive="false"/>
        <contrib:propertyregex property="module"
                       input="${d}"
                       regexp="${REGULAR_EXPRESSION}"
                       select="\3"
                       casesensitive="false"/>
        <contrib:propertyregex property="revision"
                       input="${d}"
                       regexp="${REGULAR_EXPRESSION}"
                       select="\5"
                       casesensitive="false"/>
        <antcall target="install">
            <param name="organisation" value="${organisation}"/>
            <param name="module"       value="${module}"/>
            <param name="revision"     value="${revision}"/>
        </antcall>
    </target>

    <target name="install" description="import module from public Maven repository into local repository">
        <ivy:settings id="ivysettings-ibiblio-to-local" file="ivysettings-ibiblio-to-local.xml"/>
        <ivy:install settingsRef="ivysettings-ibiblio-to-local"
                     organisation="${organisation}"
                     module="${module}"
                     revision="${revision}"
                     from="public"
                     to="local"
                     transitive="true"
                     overwrite="true"/>
    </target>    
</project>

解析器“public”和“local”在ivysettings.file中定义,分别对应ibibliofilesystem

这会创建正确的结构并放置提供必要信息的ivy-x.y.z.xml个文件。这是在我的系统中创建的目录结构和存在的文件的部分示例。

$ tree repo/ | head -20
repo/
├── avalon-framework
│   └── avalon-framework
│       ├── ivys
│       │   ├── ivy-4.1.5.xml
│       │   ├── ivy-4.1.5.xml.md5
│       │   └── ivy-4.1.5.xml.sha1
│       └── jars
│           ├── avalon-framework-4.1.5.jar
│           ├── avalon-framework-4.1.5.jar.md5
│           └── avalon-framework-4.1.5.jar.sha1
├── com.google.code.findbugs
│   └── jsr305
│       ├── ivys
│       │   ├── ivy-1.3.9.xml
│       │   ├── ivy-1.3.9.xml.md5
│       │   └── ivy-1.3.9.xml.sha1
│       └── jars
│           ├── jsr305-1.3.9.jar
│           ├── jsr305-1.3.9.jar.md5

一旦到位,filesystem解析器就像传递(default)和编译时(master)依赖关系的魅力一样。