You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ivy-commits@incubator.apache.org by "Oystein Aadland (JIRA)" <ji...@apache.org> on 2007/06/26 10:23:25 UTC

[jira] Commented: (IVY-541) Transitive dependencies resolves incorrectly when different modules uses the same dependency with different configurations in the same build

    [ https://issues.apache.org/jira/browse/IVY-541?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12508135 ] 

Oystein Aadland commented on IVY-541:
-------------------------------------

I think that I have identified the offending code. The problem lies in IvyNode.loadData() line 704. This line only adds artifacts specifically included and not all if none is specified. So I propose changing the code from:

<--- CLIP
        DependencyDescriptor dd = getDependencyDescriptor(getParent());
        if (dd != null) {
            addDependencyArtifactsIncludes(_rootModuleConf, dd.getDependencyArtifactsIncludes(getParentConf())); // LINE 704
        }
<--- CLIP 

To: 

<--- CLIP 
       DependencyDescriptor dd = getDependencyDescriptor(getParent());
        if (dd != null) {
            DependencyArtifactDescriptor[] deps = dd.getDependencyArtifactsIncludes(getParentConf());
            if (deps.length == 0 && _md != null) {
              deps = getDefaultIncludedForConfiguration(dd);
            }
            addDependencyArtifactsIncludes(_rootModuleConf, deps);

        }

...

private DependencyArtifactDescriptor[] getDefaultIncludedForConfiguration(DependencyDescriptor dd) {
    DependencyArtifactDescriptor[] deps;
    Artifact[] arts = _md.getArtifacts(getRootModuleConf());
    deps = new DependencyArtifactDescriptor[arts.length];
    for (int i=0; i<arts.length; i++) {
      Artifact art = arts[i];
      DefaultDependencyArtifactDescriptor ddad = new DefaultDependencyArtifactDescriptor(
          new DefaultDependencyDescriptor(_md, _md.getModuleRevisionId(), dd.isForce(), dd.isChanging(), dd.isTransitive()),
          art.getName(),
          art.getType(),
          art.getExt(),
          true,
          ExactPatternMatcher.getInstance()
      );
      ddad.addConfiguration(getRootModuleConf());
      deps[i] = ddad;
    }
    return deps;
}

<--- CLIP 

This worked in my case, but please understand that I am not very familiar with the ivy source so I might have missed some other important point. Anyway, it's probably a good start. 

> Transitive dependencies resolves incorrectly when different modules uses the same dependency with different configurations in the same build
> --------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: IVY-541
>                 URL: https://issues.apache.org/jira/browse/IVY-541
>             Project: Ivy
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 1.4.1
>         Environment: NA
>            Reporter: Oystein Aadland
>
> When modules that uses the same dependencies with different configuration(or different includes) then only the first module that is resolved gets the artifacts that it specifies. The other gets what was last resolved.
> Module A that uses module B.
> Module B uses a build configuration of module C
> Module A uses a build configuration of module C and a runtime configuration
> of module B
> Module B downloads explicit jars from C depending on configuration.
> When I resolve A in build configuration I only get the explicit defined
> runtime jars that B defines for module C.
> Here are snippets of the ivy files.
> Module A:
> ...
> <dependencies>
>   <dependency org="myorg" name="B" rev="1.6" conf="build->runtime" />
>   <dependency org="myorg" name="C" rev="1.10" conf="build,runtime->default"
> />
> </dependencies>
> ...
> Module B
> ...
> <configurations>
>     <conf name="build" visibility="private"/>
>     <conf name="runtime"/>
> </configurations>
> <dependencies>
>   <dependency org="myorg" name="C" rev="1.10" conf="build,runtime->default">
>       <artifact name="art1" type="jar" conf="runtime"/>
>       <artifact name="art2" type="jar" conf="runtime"/>
>       <artifact name="art3" type="jar" conf="runtime"/>
>   </dependency>
> </dependencies>
> ...
> Module C
> ...
> <publications>
>         <artifact name="art1" type="jar" conf="default"/>
>         <artifact name="art2" type="jar" conf="default"/>
>         <artifact name="art3" type="jar" conf="default"/>
>         <artifact name="art4" type="jar" conf="default"/>
> </publications>
> ...
> If module A had explicitly added the artifacts that it needed for module C it would have worked fine. The way it should work is that if no specific artifacts are included, the all artifacts for the given configuration should have been included.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.