IVY-1485 Ensure dependency is applicable to all configurations

This commit is contained in:
twogee 2018-02-01 14:54:30 +01:00
parent 994fff7f62
commit c6ae2533d5
17 changed files with 577 additions and 3 deletions

View File

@ -122,6 +122,7 @@ Here is the list of people who have contributed source code and documentation up
* Stéphane Bailliez
* Karl Baum
* Andrew Bernhagen
* Timothy Bingaman
* Mikkel Bjerg
* Per Arnold Blaasmo
* Jeffrey Blattman

View File

@ -438,7 +438,7 @@ public class IvyNode implements Comparable<IvyNode> {
return loadedRootModuleConfs.add(rootModuleConf);
}
private boolean isRootModuleConfLoaded(String rootModuleConf) {
public boolean isRootModuleConfLoaded(String rootModuleConf) {
return loadedRootModuleConfs.contains(rootModuleConf);
}

View File

@ -67,6 +67,7 @@ import org.apache.ivy.plugins.parser.ModuleDescriptorParserRegistry;
import org.apache.ivy.plugins.repository.url.URLResource;
import org.apache.ivy.plugins.resolver.DependencyResolver;
import org.apache.ivy.plugins.version.VersionMatcher;
import org.apache.ivy.util.ConfigurationUtils;
import org.apache.ivy.util.Message;
import org.apache.ivy.util.filter.Filter;
@ -329,11 +330,27 @@ public class ResolveEngine {
String forcedRev = forcedRevisionId == null ? rev : forcedRevisionId
.getRevision();
String[] moduleConfigurations = ConfigurationUtils.replaceWildcards(
dd.getModuleConfigurations(), md);
boolean dependencyConfApplicableToAllTopLevelDepConfs = true;
for (String moduleConfiguration : moduleConfigurations) {
if (!dependency.isRootModuleConfLoaded(moduleConfiguration)) {
dependencyConfApplicableToAllTopLevelDepConfs = false;
break;
}
}
// The evicted modules have no description, so we can't put the status
String status = depDescriptor == null ? "?" : depDescriptor.getStatus();
Message.debug("storing dependency " + depResolvedId + " in props");
props.put(depRevisionId.encodeToString(), rev + " " + status + " "
+ forcedRev + " " + depResolvedId.getBranch());
String depRevisionIdString = depRevisionId.encodeToString();
// don't replace a dep revision we've already added unless it is
// applicable to all the confs of the matching top-level dep.
if (!props.containsKey(depRevisionIdString)
|| dependencyConfApplicableToAllTopLevelDepConfs) {
props.put(depRevisionIdString, rev + " " + status + " " + forcedRev
+ " " + depResolvedId.getBranch());
}
}
}
}

View File

@ -2312,6 +2312,197 @@ public class ResolveTest {
assertFalse(getArchiveFileInCache("org1", "mod1.2", "2.0", "mod1.2", "jar", "jar").exists());
}
/**
* Test case for IVY-1485.
*
* @throws Exception if something goes wrong
* @see <a href="https://issues.apache.org/jira/browse/IVY-1485">IVY-1485</a>
*/
@Test
public void testDeliverWithTransitiveDepsInDifferentConfs() throws Exception {
ivy = Ivy.newInstance();
ivy.configure(new File("test/repositories/IVY-1485/ivysettings.xml"));
ResolveOptions opts = new ResolveOptions();
opts.setConfs(new String[] {"*"});
opts.setResolveId("resolveid");
opts.setTransitive(true);
ResolveReport report = ivy.resolve(
new File("test/repositories/IVY-1485/ivy-simple.xml").toURI().toURL(), opts);
assertFalse(report.hasError());
ModuleRevisionId modAExpectedRevId = ModuleRevisionId.newInstance("simple", "modA", "5");
// check that the resolve report has the expected results, namely that the transitive dep on modA#1 has not
// overridden the direct dep on modA#5. This is about testing the consistency of results between the resolve
// report and the delivered descriptor.
Set reportMrids = report.getConfigurationReport("conf1").getModuleRevisionIds();
assertEquals(new HashSet<>(Collections.singletonList(modAExpectedRevId)), reportMrids);
DeliverOptions dopts = new DeliverOptions();
dopts.setGenerateRevConstraint(true);
dopts.setConfs(new String[] { "*" });
dopts.setStatus("release");
dopts.setPubdate(new Date());
dopts.setResolveId("resolveid");
String pubrev = "1";
String deliveryPattern = "build/test/deliver/assembly-[revision].xml";
ivy.deliver(pubrev, deliveryPattern, dopts);
// now check that the resolve report has the same info as the delivered descriptor
File deliveredIvyFile = new File("build/test/deliver/assembly-1.xml");
assertTrue(deliveredIvyFile.exists());
ModuleDescriptor md = XmlModuleDescriptorParser.getInstance().parseDescriptor(
ivy.getSettings(), deliveredIvyFile.toURI().toURL(), false);
DependencyDescriptor[] dds = md.getDependencies();
assertEquals(2, dds.length);
assertEquals(ModuleRevisionId.newInstance("simple", "modB", "1"), dds[1].getDependencyRevisionId());
assertEquals(ModuleRevisionId.newInstance("simple", "modA", "5"), dds[0].getDependencyRevisionId());
}
/**
* Test case for IVY-1485.
*
* @throws Exception if something goes wrong
* @see <a href="https://issues.apache.org/jira/browse/IVY-1485">IVY-1485</a>
*/
@Test
public void testDeliverWithTransitiveDepsInOverlappingConfsTransitiveNewer() throws Exception {
ivy = Ivy.newInstance();
ivy.configure(new File("test/repositories/IVY-1485/ivysettings.xml"));
ResolveOptions opts = new ResolveOptions();
opts.setConfs(new String[] {"*"});
opts.setResolveId("resolveid");
opts.setTransitive(true);
ResolveReport report = ivy.resolve(
new File("test/repositories/IVY-1485/ivy-overlap-transitive-newer.xml").toURI().toURL(), opts);
assertFalse(report.hasError());
ModuleRevisionId conf1ModAExpectedRevId = ModuleRevisionId.newInstance("overlap-newer", "modA", "1");
ModuleRevisionId conf2ModBExpectedRevId = ModuleRevisionId.newInstance("overlap-newer", "modB", "1");
ModuleRevisionId conf2ModAExpectedRevId = ModuleRevisionId.newInstance("overlap-newer", "modA", "5");
ModuleRevisionId conf3ModBExpectedRevId = ModuleRevisionId.newInstance("overlap-newer", "modB", "1");
ModuleRevisionId conf3ModAExpectedRevId = ModuleRevisionId.newInstance("overlap-newer", "modA", "5");
Set<ModuleRevisionId> conf1ReportMrids = report.getConfigurationReport("conf1").getModuleRevisionIds();
assertEquals(new HashSet<>(Collections.singletonList(conf1ModAExpectedRevId)), conf1ReportMrids);
Set<ModuleRevisionId> conf2ReportMrids = report.getConfigurationReport("conf2").getModuleRevisionIds();
assertEquals(new HashSet<>(Arrays.asList(conf2ModBExpectedRevId, conf2ModAExpectedRevId)),
conf2ReportMrids);
Set<ModuleRevisionId> conf3ReportMrids = report.getConfigurationReport("conf3").getModuleRevisionIds();
assertEquals(new HashSet<>(Arrays.asList(conf3ModBExpectedRevId, conf3ModAExpectedRevId)),
conf3ReportMrids);
DeliverOptions dopts = new DeliverOptions();
dopts.setGenerateRevConstraint(true);
dopts.setConfs(new String[] { "*" });
dopts.setStatus("release");
dopts.setPubdate(new Date());
dopts.setResolveId("resolveid");
String pubrev = "1";
String deliveryPattern = "build/test/deliver/assembly-[revision].xml";
ivy.deliver(pubrev, deliveryPattern, dopts);
// now check that the resolve report has the same info as the delivered descriptor
File deliveredIvyFile = new File("build/test/deliver/assembly-1.xml");
assertTrue(deliveredIvyFile.exists());
ResolveReport report2 = ivy.resolve(deliveredIvyFile.toURI().toURL(), opts);
assertFalse(report.hasError());
Set<ModuleRevisionId> conf1ReportMrids2 = report2.getConfigurationReport("conf1").getModuleRevisionIds();
assertEquals(new HashSet<>(Collections.singletonList(conf1ModAExpectedRevId)), conf1ReportMrids2);
Set<ModuleRevisionId> conf2ReportMrids2 = report2.getConfigurationReport("conf2").getModuleRevisionIds();
assertEquals(new HashSet<>(Arrays.asList(conf2ModBExpectedRevId, conf2ModAExpectedRevId)),
conf2ReportMrids2);
Set<ModuleRevisionId> conf3ReportMrids2 = report2.getConfigurationReport("conf3").getModuleRevisionIds();
assertEquals(new HashSet<>(Arrays.asList(conf3ModBExpectedRevId, conf3ModAExpectedRevId)),
conf3ReportMrids2);
ModuleDescriptor md = XmlModuleDescriptorParser.getInstance().parseDescriptor(
ivy.getSettings(), deliveredIvyFile.toURI().toURL(), false);
DependencyDescriptor[] dds = md.getDependencies();
assertEquals(2, dds.length);
assertEquals(ModuleRevisionId.newInstance("overlap-newer", "modA", "1"), dds[0].getDependencyRevisionId());
assertEquals(ModuleRevisionId.newInstance("overlap-newer", "modB", "1"), dds[1].getDependencyRevisionId());
}
/**
* Test case for IVY-1485.
*
* @throws Exception if something goes wrong
* @see <a href="https://issues.apache.org/jira/browse/IVY-1485">IVY-1485</a>
*/
@Test
public void testDeliverWithTransitiveDepsInOverlappingConfsTransitiveOlder() throws Exception {
ivy = Ivy.newInstance();
ivy.configure(new File("test/repositories/IVY-1485/ivysettings.xml"));
ResolveOptions opts = new ResolveOptions();
opts.setConfs(new String[] {"*"});
opts.setResolveId("resolveid");
opts.setTransitive(true);
ResolveReport report = ivy.resolve(
new File("test/repositories/IVY-1485/ivy-overlap-transitive-older.xml").toURI().toURL(), opts);
assertFalse(report.hasError());
ModuleRevisionId conf1ModAExpectedRevId = ModuleRevisionId.newInstance("overlap-older", "modA", "5");
ModuleRevisionId conf2ModBExpectedRevId = ModuleRevisionId.newInstance("overlap-older", "modB", "1");
ModuleRevisionId conf2ModAExpectedRevId = ModuleRevisionId.newInstance("overlap-older", "modA", "5");
ModuleRevisionId conf3ModBExpectedRevId = ModuleRevisionId.newInstance("overlap-older", "modB", "1");
ModuleRevisionId conf3ModAExpectedRevId = ModuleRevisionId.newInstance("overlap-older", "modA", "1");
Set<ModuleRevisionId> conf1ReportMrids = report.getConfigurationReport("conf1").getModuleRevisionIds();
assertEquals(new HashSet<>(Collections.singletonList(conf1ModAExpectedRevId)), conf1ReportMrids);
Set<ModuleRevisionId> conf2ReportMrids = report.getConfigurationReport("conf2").getModuleRevisionIds();
assertEquals(new HashSet<>(Arrays.asList(conf2ModBExpectedRevId, conf2ModAExpectedRevId)),
conf2ReportMrids);
Set<ModuleRevisionId> conf3ReportMrids = report.getConfigurationReport("conf3").getModuleRevisionIds();
assertEquals(new HashSet<>(Arrays.asList(conf3ModBExpectedRevId, conf3ModAExpectedRevId)),
conf3ReportMrids);
DeliverOptions dopts = new DeliverOptions();
dopts.setGenerateRevConstraint(true);
dopts.setConfs(new String[] { "*" });
dopts.setStatus("release");
dopts.setPubdate(new Date());
dopts.setResolveId("resolveid");
String pubrev = "1";
String deliveryPattern = "build/test/deliver/assembly-[revision].xml";
ivy.deliver(pubrev, deliveryPattern, dopts);
// now check that the resolve report has the same info as the delivered descriptor
File deliveredIvyFile = new File("build/test/deliver/assembly-1.xml");
assertTrue(deliveredIvyFile.exists());
ResolveReport report2 = ivy.resolve(deliveredIvyFile.toURI().toURL(), opts);
assertFalse(report.hasError());
Set<ModuleRevisionId> conf1ReportMrids2 = report2.getConfigurationReport("conf1").getModuleRevisionIds();
assertEquals(new HashSet<>(Collections.singletonList(conf1ModAExpectedRevId)), conf1ReportMrids2);
Set<ModuleRevisionId> conf2ReportMrids2 = report2.getConfigurationReport("conf2").getModuleRevisionIds();
assertEquals(new HashSet<>(Arrays.asList(conf2ModBExpectedRevId, conf2ModAExpectedRevId)),
conf2ReportMrids2);
ModuleDescriptor md = XmlModuleDescriptorParser.getInstance().parseDescriptor(
ivy.getSettings(), deliveredIvyFile.toURI().toURL(), false);
DependencyDescriptor[] dds = md.getDependencies();
assertEquals(2, dds.length);
assertEquals(ModuleRevisionId.newInstance("overlap-older", "modA", "5"), dds[0].getDependencyRevisionId());
assertEquals(ModuleRevisionId.newInstance("overlap-older", "modB", "1"), dds[1].getDependencyRevisionId());
}
/**
* Test case for IVY-590.
*

View File

@ -0,0 +1,32 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<ivy-module version="2.0">
<info organisation="overlap-newer" module="projectassembly" revision="1"/>
<configurations>
<conf name="conf1"/>
<conf name="conf2"/>
<conf name="conf3"/>
</configurations>
<publications>
</publications>
<dependencies>
<dependency name="modA" rev="1" conf="conf1,conf2->default"/>
<dependency name="modB" rev="1" conf="conf2,conf3->default"/>
</dependencies>
</ivy-module>

View File

@ -0,0 +1,32 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<ivy-module version="2.0">
<info organisation="overlap-older" module="projectassembly" revision="1"/>
<configurations>
<conf name="conf1"/>
<conf name="conf2"/>
<conf name="conf3"/>
</configurations>
<publications>
</publications>
<dependencies>
<dependency name="modA" rev="5" conf="conf1,conf2->default"/>
<dependency name="modB" rev="1" conf="conf2,conf3->default"/>
</dependencies>
</ivy-module>

View File

@ -0,0 +1,31 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<ivy-module version="2.0">
<info organisation="simple" module="projectassembly" revision="1"/>
<configurations>
<conf name="conf1"/>
<conf name="conf2"/>
</configurations>
<publications>
</publications>
<dependencies>
<dependency name="modA" rev="5" conf="conf1->default"/>
<dependency name="modB" rev="1" conf="conf2->default"/>
</dependencies>
</ivy-module>

View File

@ -0,0 +1,27 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<ivysettings>
<settings defaultResolver="local" />
<resolvers>
<filesystem name="local" checkmodified="true" local="true">
<ivy pattern="${ivy.settings.dir}/[organisation]/[module]/[revision]/ivy.xml"/>
<artifact pattern="${ivy.settings.dir}/[organisation]/[module]/[revision]/[artifact].[ext]"/>
</filesystem>
</resolvers>
</ivysettings>

View File

@ -0,0 +1,26 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<ivy-module version="2.0">
<info organisation="overlap-newer" module="modA" revision="1" />
<configurations>
<conf name="default"/>
</configurations>
<publications>
</publications>
</ivy-module>

View File

@ -0,0 +1,26 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<ivy-module version="2.0">
<info organisation="overlap-newer" module="modA" revision="5" />
<configurations>
<conf name="default"/>
</configurations>
<publications>
</publications>
</ivy-module>

View File

@ -0,0 +1,29 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<ivy-module version="2.0">
<info organisation="overlap-newer" module="modB" revision="1" />
<configurations>
<conf name="default"/>
</configurations>
<publications>
</publications>
<dependencies>
<dependency org="overlap-newer" name="modA" rev="5" conf="default->default"/>
</dependencies>
</ivy-module>

View File

@ -0,0 +1,26 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<ivy-module version="2.0">
<info organisation="overlap-older" module="modA" revision="1" />
<configurations>
<conf name="default"/>
</configurations>
<publications>
</publications>
</ivy-module>

View File

@ -0,0 +1,26 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<ivy-module version="2.0">
<info organisation="overlap-older" module="modA" revision="5" />
<configurations>
<conf name="default"/>
</configurations>
<publications>
</publications>
</ivy-module>

View File

@ -0,0 +1,29 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<ivy-module version="2.0">
<info organisation="overlap-older" module="modB" revision="1" />
<configurations>
<conf name="default"/>
</configurations>
<publications>
</publications>
<dependencies>
<dependency org="overlap-older" name="modA" rev="1" conf="default->default"/>
</dependencies>
</ivy-module>

View File

@ -0,0 +1,26 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<ivy-module version="2.0">
<info organisation="simple" module="modA" revision="1" />
<configurations>
<conf name="default"/>
</configurations>
<publications>
</publications>
</ivy-module>

View File

@ -0,0 +1,26 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<ivy-module version="2.0">
<info organisation="simple" module="modA" revision="5" />
<configurations>
<conf name="default"/>
</configurations>
<publications>
</publications>
</ivy-module>

View File

@ -0,0 +1,29 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<ivy-module version="2.0">
<info organisation="simple" module="modB" revision="1" />
<configurations>
<conf name="default"/>
</configurations>
<publications>
</publications>
<dependencies>
<dependency org="simple" name="modA" rev="1" conf="default->default"/>
</dependencies>
</ivy-module>