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 .VariantVersionMappingStrategy ;
5053 * </ul>
5154 * </ul>
5255 *
53- * <p/>
54- *
5556 * @author Andy Wilkinson
5657 * @author Christoph Dreis
5758 * @author Mike Smithson
@@ -79,7 +80,9 @@ void apply(Project project) {
7980
8081 private void customizeMavenPublication (MavenPublication publication , Project project ) {
8182 customizePom (publication .getPom (), project );
82- project .getPlugins ().withType (JavaPlugin .class ).all ((javaPlugin ) -> customizeJavaMavenPublication (publication ));
83+ project .getPlugins ().withType (JavaPlugin .class )
84+ .all ((javaPlugin ) -> customizeJavaMavenPublication (publication , project ));
85+ suppressMavenOptionalFeatureWarnings (publication );
8386 }
8487
8588 private void customizePom (MavenPom pom , Project project ) {
@@ -97,13 +100,36 @@ private void customizePom(MavenPom pom, Project project) {
97100 }
98101 }
99102
100- private void customizeJavaMavenPublication (MavenPublication publication ) {
103+ private void customizeJavaMavenPublication (MavenPublication publication , Project project ) {
104+ addMavenOptionalFeature (project );
101105 publication .versionMapping ((strategy ) -> strategy .usage (Usage .JAVA_API , (mappingStrategy ) -> mappingStrategy
102106 .fromResolutionOf (JavaPlugin .RUNTIME_CLASSPATH_CONFIGURATION_NAME )));
103107 publication .versionMapping (
104108 (strategy ) -> strategy .usage (Usage .JAVA_RUNTIME , VariantVersionMappingStrategy ::fromResolutionResult ));
105109 }
106110
111+ /**
112+ * Add a feature that allows maven plugins to declare optional dependencies that
113+ * appear in the POM. This is required to make m2e in Eclipse happy.
114+ * @param project the project to add the feature to
115+ */
116+ private void addMavenOptionalFeature (Project project ) {
117+ JavaPluginExtension extension = project .getExtensions ().getByType (JavaPluginExtension .class );
118+ JavaPluginConvention convention = project .getConvention ().getPlugin (JavaPluginConvention .class );
119+ extension .registerFeature ("mavenOptional" ,
120+ (feature ) -> feature .usingSourceSet (convention .getSourceSets ().getByName ("main" )));
121+ AdhocComponentWithVariants javaComponent = (AdhocComponentWithVariants ) project .getComponents ()
122+ .findByName ("java" );
123+ javaComponent .addVariantsFromConfiguration (
124+ project .getConfigurations ().findByName ("mavenOptionalRuntimeElements" ),
125+ ConfigurationVariantDetails ::mapToOptional );
126+ }
127+
128+ private void suppressMavenOptionalFeatureWarnings (MavenPublication publication ) {
129+ publication .suppressPomMetadataWarningsFor ("mavenOptionalApiElements" );
130+ publication .suppressPomMetadataWarningsFor ("mavenOptionalRuntimeElements" );
131+ }
132+
107133 private void customizeOrganization (MavenPomOrganization organization ) {
108134 organization .getName ().set ("Pivotal Software, Inc." );
109135 organization .getUrl ().set ("https://spring.io" );
0 commit comments