所以我在一天中的大部分时间都在尝试这个,而且我已经非常接近了。我有两个项目,我想将一个作为JAR发布到共享文件位置,然后将其拉入另一个项目,包括我生成的源和javadoc .jar文件。实际ivy:publish
成功,文件在远程文件系统中正确创建。
然而,当我试图在我的第二个项目中包含JAR时,我只能引入基础JAR,而不是包含源和javadoc的JAR。
我的文件命名如下:[projectname]-[version](-[classifier])
因此,在远程位置,我得到foo-1.0.0.jar
,foo-1.0.0-sources.jar
,foo-1.0.0-javadoc.jar
&每个JAR都有ivy-1.0.0.xml
以及.sha
和.md5
个文件,但我的IVY仅仅是foo-1.0.0.jar
。
我想强调一下,我已经成功地从mavenrepo远程存储库中提取源代码和javadocs,这非常有效。我只是不明白为什么它拒绝拉下来源和放大器当javadoc JAR找到并从文件系统中拉出类JAR时,它会进入IVY缓存。
这是我用来从远程文件系统下载文件的解析器模式:
/path/to/remote/location/[organisation]/[module]/[revision]/[module]-[revision](-[classifier]).[ext]
以及我用来将文件推送到共享位置的模式是:
/path/to/remote/location/[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]
我一直在搜索人们拥有的文档和示例,但文档可能也是用克林贡语写的所有意义,并且示例来自2010年或者不提取来源来自文件系统。
思想:
我尝试过的事情:
很高兴发布配置并明确说明我要做的事情,如果你想要我等等,只需发表评论并询问你想要什么。
IVY Config在第二个项目中:
<ivy-conf>
<property name="ivy.shared.dir"
value="/path/to/remote/repo/maven-repo/shared" />
<property name="ibiblio-maven2-root" value="http://repo1.maven.org/maven2/"
override="false" />
<property name="ibiblio-spring-core-root" value="http://maven.springframework.org/"
override="false" />
<property name="local.pattern"
value="[organisation]/[module]/[revision]/[module]-[revision](-[classifier]).[ext]"/>
<property name="maven2.pattern"
value="[organisation]/[module]/[revision]/[module]-[revision]" />
<property name="spring.pattern" value="org/[organisation]/[module]/[revision]/" />
<property name="maven2.pattern.ext" value="${maven2.pattern}(-[classifier]).[ext]" />
<property name="spring.pattern.ext" value="${spring.pattern}(-[classifier]).[ext]" />
<settings defaultResolver="default" />
<resolvers>
<filesystem name="shared" m2compatible="true">
<artifact pattern="${ivy.shared.dir}/${local.pattern}" />
</filesystem>
<ibiblio name="maven2" root="${ibiblio-maven2-root}" pattern="${maven2.pattern.ext}"
m2compatible="true" />
<ibiblio name="spring" m2compatible="true" pattern="${spring.pattern.ext}"
root="${ibiblio-spring-core-root}" />
<chain name="internal">
<resolver ref="shared" />
</chain>
<chain name="external">
<resolver ref="maven2" />
<resolver ref="spring" />
</chain>
<chain name="default" returnFirst="true">
<chain ref="external" />
<chain ref="internal" />
</chain>
</resolvers>
<modules>
<module organisation="company.com.au" name="name"
resolver="default" />
</modules>
</ivy-conf>
两个IVY文件(两个项目之间)的唯一区别是这一行是推送到远程服务器的模式:
<property name="shared-repo"
value="[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]" />
以及将解析器中的标记更改为shared-repo
。
远程位置的IVY文件:
<ivy-module version="2.0" xmlns:m="http://ant.apache.org/ivy/maven" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
<info organisation="company" module="simple-email" revision="1.0.0" status="integration" publication="20140924154556">
</info>
<configurations defaultconfmapping="default">
<conf name="compile" visibility="private"/>
<conf name="test" extends="compile" visibility="private"/>
<conf name="master"/>
<conf name="runtime"/>
<conf name="default" extends="master,runtime"/>
<conf name="sources" visibility="public" description="this configuration contains the source artifact of this module, if any."/>
<conf name="javadoc" visibility="public" description="this configuration contains the javadoc artifact of this module, if any."/>
</configurations>
<publications>
<artifact name="simple-email" type="jar" ext="jar" conf="master"/>
<artifact name="simple-email" type="source" ext="jar" conf="sources" m:classifier="sources"/>
<artifact name="simple-email" type="javadoc" ext="jar" conf="javadoc" m:classifier="javadoc"/>
</publications>
<dependencies>
<!-- Unit Testing -->
<dependency org="junit" name="junit" rev="4.8.2" conf="test->default"/>
<!-- Log4j Logging -->
<dependency org="log4j" name="log4j" rev="1.2.13" conf="runtime->default;test->default;compile->default"/>
<!-- SLF Logging -->
<dependency org="org.slf4j" name="slf4j-simple" rev="1.6.1" conf="runtime->default;compile->default;test->default"/>
<dependency org="org.slf4j" name="slf4j-api" rev="1.6.1" conf="runtime->default;compile->default;test->default"/>
<dependency org="javamail" name="javamail" rev="1.4" conf="runtime->default;compile->default;test->default"/>
</dependencies>
</ivy-module>
在缓存中生成的IVY文件:
<ivy-module version="2.0">
<info organisation="company"
module="simple-email"
revision="1.0.0"
status="release"
publication="20140924162544"
default="true"
/>
<configurations>
<conf name="default" visibility="public"/>
</configurations>
<publications>
<artifact name="simple-email" type="jar" ext="jar" conf="default"/>
</publications>
</ivy-module>
远程服务器上的目录结构:
Org
|--Module
|--Version
|--ivy-1.0.0.xml
|--ivy-1.0.0.md5
|--ivy-1.0.0.sha
|--simple-email-1.0.0-javadoc.jar
|--simple-email-1.0.0-javadoc.jar.md5
|--simple-email-1.0.0-javadoc.jar.sha
|--simple-email-1.0.0-sources.jar
|--simple-email-1.0.0-sources.jar.md5
|--simple-email-1.0.0-sources.jar.sha
|--simple-email-1.0.0.jar
|--simple-email-1.0.0.jar.md5
|--simple-email-1.0.0.jar.sha
常春藤缓存目录结构:
Org
|--Module
|--ivy-1.0.0.xml
|--ivydata-1.0.0.properties
|--jars
|--simple-email-1.0.0.jar
在ANT脚本上发布任务:
<target name="ivy-publish" depends="archive">
<ivy:publish resolver="shared" pubrevision="${project.jar.version}" overwrite="true">
<artifacts pattern="${dist.dir}/[artifact].[ext]"/>
</ivy:publish>
</target>
答案 0 :(得分:3)
首先,这个设置有点复杂,但也很熟悉,因为常春藤将Maven模块转换为常春藤模块。问题在于理解Maven&#34;范围&#34;被翻译成常春藤&#34;配置&#34;。
How are maven scopes mapped to ivy configurations by ivy
解决您的具体问题我认为问题在于您如何下载文物。您的远程模块声明以下文件:
<publications>
<artifact name="simple-email" type="jar" ext="jar" conf="master"/>
<artifact name="simple-email" type="source" ext="jar" conf="sources" m:classifier="sources"/>
<artifact name="simple-email" type="javadoc" ext="jar" conf="javadoc" m:classifier="javadoc"/>
</publications>
神奇的部分是配置。在这种情况下,您有一个与以下配置相关联的文件:
其次,远程模块声明了一组相当复杂的配置。以下是相关的&#34;默认&#34;设置:
<configurations defaultconfmapping="default">
..
..
<conf name="master"/>
<conf name="runtime"/>
<conf name="default" extends="master,runtime"/>
..
..
</configurations>
所以...只有&#34;主人&#34;人工制品包括在内。这可以解释为什么默认情况下会排除源代码,这是有道理的,因为通常用户会想要编译的二进制文件。
这是我们深入研究依赖映射的魔力的地方。大多数时候,用户不关心时间。因此,为了忽略它们,我通常建议在每个依赖项的末尾添加 conf =&#34;默认&#34; :
<dependency org="company" name="simple-email" rev="1.0.0" conf="default"/>
在我和远程模块之间创建以下关系:
<local "default" configuration> -> <remote "default" configuration>
换句话说,只给我默认值,它是已编译的二进制文件,不包括其他更多可选的东西,如source和javadoc。
一旦了解了配置,您就会想要在本地声明它们。例如:
<configurations>
<conf name="compile" description="Required to compile application"/>
<conf name="sources" description="Source code"/>
</configurations>
我们说我们有两个存储桶或依赖关系的逻辑分组。
现在我们使依赖声明更加了解我们的本地配置:
<dependency org="company" name="simple-email" rev="1.0.0" conf="compile->default;sources"/>
我们现在有2个映射:
<local "compile" configuration> -> <remote "default" configuration>
<local "sources" configuration> -> <remote "sources" configuration>
我们现在可以在ANT构建文件中单独引用或使用这些配置。例如,创建一个类路径:
<ivy:cachepath pathid="compile.path" conf="compile"/>
我们使用retrieve任务将sources jar放在build目录中:
<ivy:retrieve pattern="build/src/[artifact]-[revision](-[classifier]).[ext]" conf="sources"/>
在这个人为的例子中,我想将源jar下载到 build / src 目录中,并将编译依赖项下载到 lib 目录中:
├── build
│ └── src
│ └── log4j-1.2.17-sources.jar
├── build.xml
├── ivy.xml
└── lib
└── log4j-1.2.17.jar
<project name="demo" default="retrieve" xmlns:ivy="antlib:org.apache.ivy.ant">
<target name="retrieve">
<ivy:retrieve pattern="lib/[artifact]-[revision](-[classifier]).[ext]" conf="compile"/>
<ivy:retrieve pattern="build/src/[artifact]-[revision](-[classifier]).[ext]" conf="sources"/>
</target>
</project>
注意:
<ivy-module version="2.0">
<info organisation="com.myspotontheweb" module="demo"/>
<configurations>
<conf name="compile" description="Required to compile application"/>
<conf name="sources" description="Source code"/>
</configurations>
<dependencies>
<dependency org="log4j" name="log4j" rev="1.2.17" conf="compile->default;sources" />
</dependencies>
</ivy-module>
注意: