忽略Ivy检索中的源代码jar包

12
我想仅检索库jar文件,当我在我的ivy.xml中使用依赖项条目来使用Red5(或任何项目)时。无论我如何配置,我仍然会得到依赖项的“源”jar文件。我已经查看了文档和谷歌,并且尚未找到使用Ivy 2.2.0的可行解决方案。 这组节点在我的ivy.xml中似乎对大多数库最有效,但Spring忽略它们。
    <exclude ext="txt" />
    <exclude type="src" />
    <exclude artifact="!sources" />
如果有人有任何能起作用的提示,请分享! 源XML文件链接 http://red5.googlecode.com/svn/java/server/trunk/ivy.xml http://red5.googlecode.com/svn/java/server/trunk/ivysettings.xml http://red5.googlecode.com/svn/java/server/trunk/build.xml 注意事项 不要说这是重复的,因为他们的答案并没有起作用: ivy:防止下载源码和.txt文件 让ivy不下载源码和许可证文件 更新1
<dependency org="org.springframework" name="org.springframework.core" rev="3.0.5.RELEASE" transitive="false" />

在我的 lib 目录下生成这两个文件:

org.springframework.core-3.0.5.RELEASE.jar
org.springframework.core-sources-3.0.5.RELEASE.jar

更新2 对于赏金,我希望您的解决方案能够与Red5主干一起使用,该主干作为开源软件对所有人都可用。源码JAR文件对我来说只是一个烦恼,但值得这些赏金分数。


尝试使用此答案:https://dev59.com/PWw15IYBdhLWcg3w1_UN#6367998 当排除直接位于依赖项下时,似乎无法起作用。 - oers
我之前也尝试过类似的方法,但也没有成功。你的答案将会排除库A的依赖库B和不包含库A的“源jar”文件。 - Paul Gregoire
在代码库中,sources.jar 标记为源代码类型了吗?还是只是普通的 jar 类型? - oers
我不同意你引用的答案无效,因为它们是我的 :-) - Mark O'Connor
马克,这是你的权利,但请随意拿起项目并验证我的结果。 - Paul Gregoire
我已经修改了下面的答案。我建议使用ibiblio解析器而不是url。它更强大,可能是您问题的根源。希望这可以帮助到您。 - Mark O'Connor
5个回答

10

我在build.xml中使用这个来只获取jar包。

<ivy:retrieve type="jar"/>

3
在添加了这个属性之前,Ivy也会拉取Javadoc和源码Jar。在做出这个更改后,它只检索jar文件。谢谢! - Karthik Sankar

9
我已经修改了你的 ivy.xmlivysettings.xml 文件。
我使用了一个默认配置映射来阻止源文件,避免需要为每个依赖项添加“conf”属性。
    <configurations defaultconfmapping="default">
    ..
    ..

Spring现在通过Maven中央发布他们的软件,因此我修改了ivy设置文件,使用这些代替旧的ivy bundle存储库。

修改后的ivy.xml

<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="red5" module="server" />

    <configurations defaultconfmapping="default">
        <conf name="default"/>
        <conf name="java6" extends="default" description="Java 6 dependencies"/>
        <conf name="eclipse" description="Special dependencies in Eclipse"/>
        <conf name="utest" extends="eclipse" description="Unit testing dependencies"/>
    </configurations>

    <dependencies>
        <dependency org="javax" name="javaee-api" rev="5.1.2" />

        <!-- Spring --> 
        <dependency org="org.springframework" name="spring-asm" rev="3.0.5.RELEASE"/>
        <dependency org="org.springframework" name="spring-beans" rev="3.0.5.RELEASE" />
        <dependency org="org.springframework" name="spring-context" rev="3.0.5.RELEASE" />
        <dependency org="org.springframework" name="spring-core" rev="3.0.5.RELEASE" />
        <dependency org="org.springframework" name="spring-expression" rev="3.0.5.RELEASE" />
        <dependency org="org.springframework" name="spring-web" rev="3.0.5.RELEASE" />

        <!-- Logging --> 
        <dependency org="org.slf4j" name="com.springsource.slf4j.api" rev="1.6.1" transitive="false" />
        <dependency org="org.slf4j" name="com.springsource.slf4j.bridge" rev="1.6.1" transitive="false" />

        <dependency name="jul-to-slf4j" rev="1.6.1" />
        <dependency name="log4j-over-slf4j" rev="1.6.1" />
        <dependency name="jcl-over-slf4j" rev="1.6.1" />    
        <dependency name="logback-classic" rev="0.9.28" />
        <dependency name="logback-core" rev="0.9.28" />

        <!-- General --> 
        <dependency org="commons" name="commons-beanutils" rev="1.8.2" />
        <dependency org="org.apache.commons" name="com.springsource.org.apache.commons.codec" rev="1.4.0" transitive="false" />
        <dependency org="org.apache.commons" name="com.springsource.org.apache.commons.collections" rev="3.2.1" transitive="false" />

        <dependency org="commons" name="httpcore" rev="4.1.3" />
        <dependency org="commons" name="httpclient" rev="4.1.2" />

        <dependency org="commons" name="commons-lang3" rev="3.0-beta" />
        <dependency org="org.apache.commons" name="com.springsource.org.apache.commons.modeler" rev="2.0.1" transitive="false" />

        <dependency org="commons" name="commons-pool" rev="1.5.6" />
        <dependency name="quartz" rev="1.8.5" />
        <dependency name="ehcache" rev="2.2.0" />

        <!-- XML -->
        <dependency org="org.apache.xerces" name="com.springsource.org.apache.xerces" rev="2.9.1" transitive="false" />
        <dependency name="xmlrpc" rev="2.0.1" />

        <!-- Mina -->   
        <dependency org="mina" name="mina-integration-beans" rev="2.0.4" />
        <dependency org="mina" name="mina-integration-jmx" rev="2.0.4" />
        <dependency org="mina" name="mina-core" rev="2.0.4" />

        <!-- Scripting -->
        <dependency org="org.objectweb.asm" name="com.springsource.org.objectweb.asm" rev="3.2.0" transitive="false" />
        <dependency org="org.objectweb.asm" name="com.springsource.org.objectweb.asm.commons" rev="3.2.0" transitive="false" />
        <dependency org="org.antlr" name="com.springsource.org.antlr" rev="3.1.3" transitive="false" />
        <dependency org="org.codehaus.groovy" name="com.springsource.org.codehaus.groovy" rev="1.7.0" transitive="false" />
        <dependency name="jruby-complete" rev="1.1.6" />
        <dependency name="jython" rev="2.5" /> 
        <dependency org="org.mozilla.javascript" name="com.springsource.org.mozilla.javascript" rev="1.7.0.R2" transitive="false" />
        <dependency org="javax.xml.stream" name="com.springsource.javax.xml.stream" rev="1.0.1" transitive="false" />
        <dependency org="org.springframework" name="spring-context-support" rev="3.0.5.RELEASE" />

        <!-- Crypto -->
        <dependency name="bcprov-jdk16" rev="145" conf="java6->*" /> 

        <!-- MP3 -->
        <dependency name="jaudiotagger" rev="2.0.4-SNAPSHOT" />           

        <!-- Testing support -->
        <!-- until Eclipse updates their junit version, we have to use this -->
        <dependency org="org.junit" name="com.springsource.org.junit" rev="4.8.1" conf="eclipse->*" transitive="false" />
        <dependency name="GroboUtils" rev="5-core" conf="eclipse->*" />
        <dependency org="org.springframework" name="org.springframework.test" rev="3.0.5.RELEASE" conf="eclipse->*" transitive="false" />
        <dependency org="org.springframework" name="org.springframework.transaction" rev="3.0.5.RELEASE" conf="eclipse->*" transitive="false" />
    </dependencies>
</ivy-module>

修改后的ivysettings.xml文件

<ivysettings>
    <settings defaultResolver="chain"/>
    <resolvers>
        <chain name="chain">
            <ibiblio name='central' m2compatible='true'/>
            <ibiblio name='springsource-external' m2compatible='true' root='http://repository.springsource.com/maven/bundles/external'/>
            <url name="googlecode">
                <artifact pattern="http://red5.googlecode.com/svn/repository/[artifact](-[revision]).[ext]" />
                <artifact pattern="http://red5.googlecode.com/svn/repository/[organisation]/[artifact](-[revision]).[ext]" />
            </url>
        </chain>
    </resolvers>
</ivysettings>

使用 ivyclear 运行效果稍微好一些,我要看看能否快速解决这个问题。 - Paul Gregoire
好的,你赢了,在执行了ivyclear和“ant clean dist”两次之后,一切都按照我要求的那样工作了!谢谢。 - Paul Gregoire

2
我建议不要在依赖声明中使用“transitive”属性,而是尝试使用配置来解决问题。在Ivy中,配置在功能上与Maven中的作用域相同,但更加灵活。通常我会在我的代码中至少声明以下3个配置。
    <configurations>
        <conf name="compile" description="Compile time dependencies"/>
        <conf name="runtime" description="Compile time dependencies" extends="compile"/>
        <conf name="test"    description="Compile time dependencies" extends="runtime"/>
    </configurations>

这对于任何Java项目来说,都需要3组依赖关系。

关键在于如何将依赖关系映射到配置中。如果你只想要jar文件而不需要它的依赖关系,请按照以下方式声明:

<dependency org="org.springframework" name="org.springframework.core" rev="3.0.5.RELEASE" conf="compile->master"/>

本地编译配置映射到远程Maven模块的范围。 Maven中的范围排除了任何传递依赖项。
如果要包含该工件的传递依赖项,则将配置映射声明如下:
<dependency org="org.springframework" name="org.springframework.core" rev="3.0.5.RELEASE" conf="compile->default"/>

有效的ivy.xml文件

这将下载一个单独的jar包。

<?xml version="1.0" encoding="UTF-8"?>
<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="red5" module="server" />
    <configurations>
        <conf name="default"/>
        <conf name="java6" extends="default" description="Java 6 dependencies"/>
        <conf name="utest" extends="eclipse" description="Unit testing dependencies"/>
        <conf name="eclipse" description="Special dependencies in Eclipse"/>
    </configurations>
    <dependencies>
        <dependency org="org.springframework" name="org.springframework.core" rev="3.0.5.RELEASE" conf="default->master"/>
    </dependencies>
</ivy-module>

修改后的设置文件

我建议使用 ibiblio 解析器,它被设计为能够理解 Maven 1 和 Maven 2 仓库格式:

<ivysettings>
    <settings defaultResolver="local"/>
    <resolvers>
        <chain name="local">
            <ibiblio name='springsource-releases' m2compatible='true' root='http://repository.springsource.com/maven/bundles/release'/>
             ..
             ..
        </chain>
    </resolvers>
</ivysettings>

注意:我正在使用Springsource Maven存储库,这个存储库更有可能是最新的。我不知道他们是否仍然正确维护旧的ivy存储库。

到目前为止还不太好 - 无法解决red5#server;working@MAGNUS的依赖关系 未解决的依赖关系:org.springframework#org.springframework.asm;3.0.5.RELEASE:在org.springframework#org.springframework.asm;3.0.5.RELEASE中找不到配置:“master”。它是从red5#server;working@MAGNUS java6所需的。 - Paul Gregoire
使用ibiblio在本地和Hudson上破坏了构建,切换回URL修复了它。Ivy有时确实很让人头疼。 - Paul Gregoire
你收到了什么错误信息?你似乎比正常情况下遭受的还要多。 - Mark O'Connor
我没有打开详细模式,但它们出现在控制台中未解决。我将不得不在另一个时间再试一次。配置部分明确在我们项目的情况下不起作用。 - Paul Gregoire
@Mondain,我决定发布第二个带有工作示例的答案。我认为配置未能生效的原因是因为您使用了旧的Springsource ivy存储库。在可能的情况下,最好将ivy指向Maven存储库。现在Springsource通过Maven中央发布。 - Mark O'Connor

0
你可以尝试这样做。它使用artifact和matcher,这对于排除标签是有效的。但不要将排除放在依赖项内(这似乎存在错误,请参见我的评论):
    <dependencies>
      <dependency org="org.springframework" name="org.springframework.core" rev="3.0.5.RELEASE"">
      </dependency>
      <exclude org="org.springframework" name="org.springframework.core" artifact="*sources*" matcher="glob"/>
</dependencies>

我非常尊重地不同意。排除功能旨在抑制传递依赖项,而不是与Maven模块相关联的构件。如果它能够正常工作,那很好,但我仍然认为最好的解决方案是使用ivy配置映射。 - Mark O'Connor
是的,配置更好,我只是因为问题中给出的细节而假设这些不起作用。 - oers

0

在您的依赖项中,只需通过使用artifact节点指定要检索的各个构件即可。请尝试一下:

<dependency org="org.springframework" name="org.springframework.core" rev="3.0.5.RELEASE" transitive="false">
    <artifact name="org.springframework.core" ext="jar" />
</dependency>

1
我会尝试,但我相当确定这不会起作用,因为源工件是一个扩展名为“jar”的jar文件。 - Paul Gregoire
artifact标签通常用于尝试检索与Maven模块相关联的其他jar,而不是主要的artifact。请参见以下答案http://stackoverflow.com/questions/6942989/ivy-cant-download-because-pom-file-and-the-jar-file-name-arent-matching-pattern - Mark O'Connor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接