常春藤:使用分类器从maven安装

时间:2014-07-24 20:11:00

标签: java maven ivy jogl

我正在尝试常春藤:将jogl和gluegen从maven安装到我当地的存放处。我无法正确安装本机依赖项。

我的ivysettings是

<ivysettings>
    <settings defaultResolver="central"
            defaultConflictManager="all"
    />
    <caches defaultCacheDir="${ivy.cache.dir}"
            artifactPattern="[organisation]/[module]/[type]s/[artifact]-[revision](-[classifier]).[ext]" 
    />
    <resolvers>
        <ibiblio name="central" m2compatible="true"
                 pattern="[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]"
        />
        <filesystem name="depository">
            <ivy pattern="${dest.repo.dir}/[organisation]/[module]/ivys/ivy-[revision](-[classifier]).xml" />
            <artifact pattern="${dest.repo.dir}/[organisation]/[module]/[type]s/[artifact]-[revision](-[classifier]).[ext]" />
        </filesystem>
    </resolvers>
</ivysettings>

我的安装目标是

<ivy:install settingsRef="ivy.settings" 
    organisation="org.jogamp.jogl" module="jogl-all-main" revision="2.1.5-01"
    from="${from.resolver}" to="${to.resolver}" transitive="true" overwrite="true" />

其中from.resolver为central,to.resolver为depository

分类器例如是native-windows-i586,native-linux-armv6等。有问题的pom文件位于http://repo1.maven.org/maven2/org/jogamp/jogl/jogl-all-main/2.1.5-01/jogl-all-main-2.1.5-01.pom

我正确地解决了jogl-all-main。解析依赖关系后,只解析pom文件中的最后一个,即jogl-all-2.1.5-01-natives-windows-i586.jar。有没有办法使用常春藤:安装任务从maven中央存储库安装到我的本地存储库?

1 个答案:

答案 0 :(得分:10)

简短的回答是,ivy对与Maven模块关联的其他工件文件的支持非常有限。

我为重复自己而道歉,但最好建议您运行Maven存储库管理器来缓存远程Maven存储库。这避免了在不同格式之间进行折衷的必要性。

此限制背后的原因

远程Maven POM没有明确列出其模块的工件。可能的分类器值的数量没有限制....可以做出的唯一假设是模块可能包含一个额外的&#34; javadoc&#34;或&#34;来源&#34;神器。 (在开源项目中很常见)。

Maven documentation描述分类器如下:

  

分类器:分类器可以区分工件   从同一个POM构建但内容不同。这是一些   可选和任意字符串 - 如果存在 - 附加到   工件名称紧跟在版本号之后。

     

作为此元素的动机,请考虑一个项目   提供了一个针对JRE 1.5的工件,但同时也是一个   仍然支持JRE 1.4的工件。第一件神器可能是   配备分类器jdk15,第二个配jdk14等   客户可以选择使用哪一个。

     

分类器的另一个常见用例是需要附加   项目主要工件的辅助工件。如果你浏览了   Maven中央存储库,你会注意到分类器的来源   和javadoc用于部署项目源代码和API文档   以及打包的类文件。

常春藤存储库的工作方式不同。该模块的常春藤文件有publications section,明确列出了模块的内容。

为了更深入地了解常春藤如何解释Maven存储库,我建议发布以下帖子。

可能的解决方法

以下示例使用retrieve任务将下载的依赖项写入所需的存储库格式。结果是缺少校验和文件,但这可能无关紧要。

├── build.xml
├── ivy.xml
└── target
    └── repo
        └── org
            └── jogamp
                └── jogl
                    ├── jogl-all
                    │   └── 2.1.5-01
                    │       ├── jogl-all-2.1.5-01.jar
                    │       ├── jogl-all-2.1.5-01-javadoc.jar
                    │       ├── jogl-all-2.1.5-01-natives-android-armv6.jar
                    │       ├── jogl-all-2.1.5-01-natives-linux-amd64.jar
                    │       ├── jogl-all-2.1.5-01-natives-linux-armv6hf.jar
                    │       ├── jogl-all-2.1.5-01-natives-linux-armv6.jar
                    │       ├── jogl-all-2.1.5-01-natives-linux-i586.jar
                    │       ├── jogl-all-2.1.5-01-natives-macosx-universal.jar
                    │       ├── jogl-all-2.1.5-01-natives-solaris-amd64.jar
                    │       ├── jogl-all-2.1.5-01-natives-solaris-i586.jar
                    │       ├── jogl-all-2.1.5-01-natives-windows-amd64.jar
                    │       ├── jogl-all-2.1.5-01-natives-windows-i586.jar
                    │       └── jogl-all-2.1.5-01-sources.jar
                    └── jogl-all-main
                        └── 2.1.5-01
                            ├── jogl-all-main-2.1.5-01.jar
                            ├── jogl-all-main-2.1.5-01-javadoc.jar
                            └── jogl-all-main-2.1.5-01-sources.jar

的ivy.xml

<ivy-module version="2.0" xmlns:e="http://ant.apache.org/ivy/extra">
    <info organisation="com.myspotontheweb" module="demo"/>

    <configurations>
        <conf name="repo" description="Artifacts that make up local repository"/>
    </configurations>

    <dependencies>
        <dependency org="org.jogamp.jogl" name="jogl-all-main" rev="2.1.5-01" conf="repo->default">
            <artifact name="jogl-all-main"/>
            <artifact name="jogl-all-main" e:classifier="sources"/>
            <artifact name="jogl-all-main" e:classifier="javadoc"/>
        </dependency>

        <dependency org="org.jogamp.jogl" name="jogl-all" rev="2.1.5-01" conf="repo->default">
            <artifact name="jogl-all"/>
            <artifact name="jogl-all" e:classifier="sources"/>
            <artifact name="jogl-all" e:classifier="javadoc"/>
            <artifact name="jogl-all" e:classifier="natives-android-armv6"/>
            <artifact name="jogl-all" e:classifier="natives-linux-amd64"/>
            <artifact name="jogl-all" e:classifier="natives-linux-armv6"/>
            <artifact name="jogl-all" e:classifier="natives-linux-armv6hf"/>
            <artifact name="jogl-all" e:classifier="natives-linux-i586"/>
            <artifact name="jogl-all" e:classifier="natives-macosx-universal"/>
            <artifact name="jogl-all" e:classifier="natives-solaris-amd64"/>
            <artifact name="jogl-all" e:classifier="natives-solaris-i586"/>
            <artifact name="jogl-all" e:classifier="natives-windows-amd64"/>
            <artifact name="jogl-all" e:classifier="natives-windows-i586"/>
        </dependency>
    </dependencies>

</ivy-module>

注意:

  • 需要明确列出要下载的每个所需工件。如上所述,只有&#34; javadoc&#34;和&#34;来源&#34;可以假设分类器。

的build.xml

<project name="demo" default="install" xmlns:ivy="antlib:org.apache.ivy.ant">

    <!--
    ================
    Build properties
    ================
    -->
    <property name="repo.dir" location="target"/>

    <!--
    ===========
    Build repo
    ===========
    -->
    <target name="install" description="Download and install dependencies">
        <ivy:retrieve pattern="${repo.dir}/[conf]/[orgPath]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]"/>
    </target>

</project>