11/*
2- * Copyright 2012-2020 the original author or authors.
2+ * Copyright 2012-2021 the original author or authors.
33 *
44 * Licensed under the Apache License, Version 2.0 (the "License");
55 * you may not use this file except in compliance with the License.
1919import org .apache .maven .artifact .repository .MavenArtifactRepository ;
2020import org .gradle .api .Project ;
2121import org .gradle .api .attributes .Usage ;
22+ import org .gradle .api .component .AdhocComponentWithVariants ;
23+ import org .gradle .api .component .ConfigurationVariantDetails ;
2224import org .gradle .api .plugins .JavaPlugin ;
25+ import org .gradle .api .plugins .JavaPluginConvention ;
2326import org .gradle .api .plugins .JavaPluginExtension ;
2427import org .gradle .api .publish .PublishingExtension ;
2528import org .gradle .api .publish .maven .MavenPom ;
4952 * </ul>
5053 * </ul>
5154 *
52- * <p/>
53- *
5455 * @author Andy Wilkinson
5556 * @author Christoph Dreis
5657 * @author Mike Smithson
@@ -80,6 +81,7 @@ private void customizeMavenPublication(MavenPublication publication, Project pro
8081 customizePom (publication .getPom (), project );
8182 project .getPlugins ().withType (JavaPlugin .class )
8283 .all ((javaPlugin ) -> customizeJavaMavenPublication (publication , project ));
84+ suppressMavenOptionalFeatureWarnings (publication );
8385 }
8486
8587 private void customizePom (MavenPom pom , Project project ) {
@@ -98,12 +100,35 @@ private void customizePom(MavenPom pom, Project project) {
98100 }
99101
100102 private void customizeJavaMavenPublication (MavenPublication publication , Project project ) {
103+ addMavenOptionalFeature (project );
101104 publication .versionMapping ((strategy ) -> strategy .usage (Usage .JAVA_API , (mappingStrategy ) -> mappingStrategy
102105 .fromResolutionOf (JavaPlugin .RUNTIME_CLASSPATH_CONFIGURATION_NAME )));
103106 publication .versionMapping ((strategy ) -> strategy .usage (Usage .JAVA_RUNTIME ,
104107 (mappingStrategy ) -> mappingStrategy .fromResolutionResult ()));
105108 }
106109
110+ /**
111+ * Add a feature that allows maven plugins to declare optional dependencies that
112+ * appear in the POM. This is required to make m2e in Eclipse happy.
113+ * @param project the project to add the feature to
114+ */
115+ private void addMavenOptionalFeature (Project project ) {
116+ JavaPluginExtension extension = project .getExtensions ().getByType (JavaPluginExtension .class );
117+ JavaPluginConvention convention = project .getConvention ().getPlugin (JavaPluginConvention .class );
118+ extension .registerFeature ("mavenOptional" ,
119+ (feature ) -> feature .usingSourceSet (convention .getSourceSets ().getByName ("main" )));
120+ AdhocComponentWithVariants javaComponent = (AdhocComponentWithVariants ) project .getComponents ()
121+ .findByName ("java" );
122+ javaComponent .addVariantsFromConfiguration (
123+ project .getConfigurations ().findByName ("mavenOptionalRuntimeElements" ),
124+ ConfigurationVariantDetails ::mapToOptional );
125+ }
126+
127+ private void suppressMavenOptionalFeatureWarnings (MavenPublication publication ) {
128+ publication .suppressPomMetadataWarningsFor ("mavenOptionalApiElements" );
129+ publication .suppressPomMetadataWarningsFor ("mavenOptionalRuntimeElements" );
130+ }
131+
107132 private void customizeOrganization (MavenPomOrganization organization ) {
108133 organization .getName ().set ("Pivotal Software, Inc." );
109134 organization .getUrl ().set ("https://spring.io" );
0 commit comments