我按照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
文件。
我的问题是:
ivy.xml
和ibiblio
解析器保留相同的filesystem
文件,以及如何处理&#34; master&#34;在这种情况下的配置?filesystem
解析器如何理解配置是否可以拾取平放在目录中的jar?filesystem
解析器,以便也可以使用依赖项获取传递依赖项,在这种情况下应该是什么文件系统结构?filesystem
解析器正在查看的目录中复制jar。我应该使用一些导入机制(例如,创建适当的目录结构,可能允许解析器也获取传递依赖)。答案 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
中定义,分别对应ibiblio
和filesystem
。
这会创建正确的结构并放置提供必要信息的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
)依赖关系的魅力一样。