使用IVY从项目中的文件系统包含项目JAR无法引入源和javadoc

时间:2014-09-24 08:01:47

标签: java jar ivy

所以我在一天中的大部分时间都在尝试这个,而且我已经非常接近了。我有两个项目,我想将一个作为JAR发布到共享文件位置,然后将其拉入另一个项目,包括我生成的源和javadoc .jar文件。实际ivy:publish成功,文件在远程文件系统中正确创建。

然而,当我试图在我的第二个项目中包含JAR时,我只能引入基础JAR,而不是包含源和javadoc的JAR。

我的文件命名如下:[projectname]-[version](-[classifier])因此,在远程位置,我得到foo-1.0.0.jarfoo-1.0.0-sources.jarfoo-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无法将任何内容拉下来)
  • 这不是连接问题(见上文)
  • 我发布项目的方式可能有问题(如果您认为是这种情况,我可以根据要求提供更多详细信息)
  • 我怀疑IVY根本没有拉下(或者似乎正在阅读)远程文件系统上的ivy-1.0.0.xml文件。毕竟,这就是我声明源和javadoc JAR存在的地方。
  • 不仅仅是这个项目,我试图对第三个项目采用相同的过程,只是让IVY只从远程文件系统中获取类.jar文件。
  • 我可能无法以IVY期望阅读的方式创建/命名文件。我查看了mavencentral中使用的文件结构,并尝试复制他们命名和布置文件的方式,但它不起作用。

我尝试过的事情:

  • 几乎我能想到的每种IVY模式组合。
  • 反复删除缓存的文件以查看IVY是否正确解析了远程文件系统中的所有文件(它没有,它只是重新调用类JAR并在缓存目录中生成ivy-1.0.0.xml文件)

很高兴发布配置并明确说明我要做的事情,如果你想要我等等,只需发表评论并询问你想要什么。

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>

1 个答案:

答案 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>

神奇的部分是配置。在这种情况下,您有一个与以下配置相关联的文件:

  • 来源
  • 的Javadoc

其次,远程模块声明了一组相当复杂的配置。以下是相关的&#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

的build.xml

<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下载的文件分为&#34;配置&#34;。每个检索任务都有一个不同的&#34; conf&#34;属性。
  • 配置在常春藤文件中声明,并在每个依赖项上定义映射。

的ivy.xml

<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>

注意:

  • 常春藤文件创建2个配置
  • 魔术是&#34; conf&#34;依赖属性。这将创建以下映射&#34; compile-&gt; default&#34;和&#34;来源 - &gt;来源&#34;。这意味着编译依赖性来自远程默认(通常设置),本地源来自远程源。