in src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorBuilder.java [267:365]
public void addDependency(Resource res, PomDependencyData dep) {
String scope = dep.getScope();
if (!isNullOrEmpty(scope) && !MAVEN2_CONF_MAPPING.containsKey(scope)) {
// unknown scope, defaulting to 'compile'
scope = "compile";
}
String version = dep.getVersion();
if (isNullOrEmpty(version)) {
version = getDefaultVersion(dep);
}
ModuleRevisionId moduleRevId = ModuleRevisionId.newInstance(dep.getGroupId(),
dep.getArtifactId(), version);
// Some POMs depend on themselves; Ivy doesn't allow this. Don't add this dependency!
// Example: https://repo1.maven.org/maven2/net/jini/jsk-platform/2.1/jsk-platform-2.1.pom
ModuleRevisionId mRevId = ivyModuleDescriptor.getModuleRevisionId();
if (mRevId != null && mRevId.getModuleId().equals(moduleRevId.getModuleId())) {
return;
}
// experimentation shows the following, excluded modules are
// inherited from parent POMs if either of the following is true:
// the <exclusions> element is missing or the <exclusions> element
// is present, but empty.
List<ModuleId> excluded = dep.getExcludedModules();
if (excluded.isEmpty()) {
excluded = getDependencyMgtExclusions(ivyModuleDescriptor, dep);
}
final boolean excludeAllTransitiveDeps = shouldExcludeAllTransitiveDeps(excluded);
// the same dependency mrid could appear twice in the module descriptor,
// so we check if we already have created a dependency descriptor for the dependency mrid
final DependencyDescriptor existing = this.ivyModuleDescriptor.depDescriptors.get(moduleRevId);
final String[] existingConfigurations = existing == null ? new String[0]
: existing.getModuleConfigurations();
final DefaultDependencyDescriptor dd = (existing != null && existing instanceof DefaultDependencyDescriptor)
? (DefaultDependencyDescriptor) existing
: new PomDependencyDescriptor(dep, ivyModuleDescriptor, moduleRevId, !excludeAllTransitiveDeps);
if (isNullOrEmpty(scope)) {
scope = getDefaultScope(dep);
}
ConfMapper mapping = MAVEN2_CONF_MAPPING.get(scope);
mapping.addMappingConfs(dd, dep.isOptional());
Map<String, String> extraAtt = new HashMap<>();
final String optionalizedScope = dep.isOptional() ? "optional" : scope;
if (isNonDefaultArtifact(dep)) {
if (existing != null && existing.getAllDependencyArtifacts().length == 0) {
String moduleConfiguration = existingConfigurations.length == 1
? existingConfigurations[0] : optionalizedScope;
// previously added dependency has been the "default artifact"
dd.addDependencyArtifact(moduleConfiguration, createDefaultArtifact(dd));
}
String type = "jar";
if (dep.getType() != null) {
type = dep.getType();
}
String ext = type;
// if type is 'test-jar', the extension is 'jar' and the classifier is 'tests'
// Cfr. http://maven.apache.org/guides/mini/guide-attached-tests.html
if ("test-jar".equals(type)) {
ext = "jar";
extraAtt.put("m:classifier", "tests");
} else if (JAR_PACKAGINGS.contains(type)) {
ext = "jar";
}
// we deal with classifiers by setting an extra attribute and forcing the
// dependency to assume such an artifact is published
if (dep.getClassifier() != null) {
extraAtt.put("m:classifier", dep.getClassifier());
}
final DefaultDependencyArtifactDescriptor depArtifact = new DefaultDependencyArtifactDescriptor(
dd, dd.getDependencyId().getName(), type, ext, null, extraAtt);
// here we have to assume a type and ext for the artifact, so this is a limitation
// compared to how m2 behave with classifiers
depArtifact.addConfiguration(optionalizedScope);
dd.addDependencyArtifact(optionalizedScope, depArtifact);
} else if (existing != null) {
// this is the "default" artifact and some non-default artifact has already been added
dd.addDependencyArtifact(optionalizedScope, createDefaultArtifact(dd));
}
for (ModuleId excludedModule : excluded) {
// This represents exclude all transitive dependencies, which we have already taken
// in account while defining the DefaultDependencyDescriptor itself
if ("*".equals(excludedModule.getOrganisation()) && "*".equals(excludedModule.getName())) {
continue;
}
for (String conf : dd.getModuleConfigurations()) {
dd.addExcludeRule(conf, new DefaultExcludeRule(new ArtifactId(excludedModule,
PatternMatcher.ANY_EXPRESSION, PatternMatcher.ANY_EXPRESSION,
PatternMatcher.ANY_EXPRESSION), ExactPatternMatcher.INSTANCE, null));
}
}
// intentional identity check to make sure we don't re-add the same dependency
if (existing != dd) {
ivyModuleDescriptor.addDependency(dd);
}
}