Skip to content

Commit 78058d7

Browse files
authored
Let the user ignore automatic dependencies (#869)
In some circumstances, automatic dependencies can get in the way. This should be rare but there was no built-in mechanism to ignore such dependencies. It is now possible to list these using the `micronaut` extension, for example: ``` micronaut { ignoredAutomaticDependencies.add("io.micronaut.data:micronaut-data-processor") } ``` The responsibility of adding these is then shifted to the user. Fixes micronaut-projects/micronaut-sql#1157
1 parent 341f391 commit 78058d7

File tree

3 files changed

+73
-23
lines changed

3 files changed

+73
-23
lines changed

Diff for: minimal-plugin/src/main/java/io/micronaut/gradle/MicronautExtension.java

+11
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.gradle.api.model.ObjectFactory;
55
import org.gradle.api.plugins.ExtensionAware;
66
import org.gradle.api.provider.Property;
7+
import org.gradle.api.provider.SetProperty;
78

89
import javax.inject.Inject;
910
import java.util.LinkedHashMap;
@@ -34,6 +35,16 @@ public abstract class MicronautExtension implements ExtensionAware {
3435
*/
3536
public abstract Property<Boolean> getImportMicronautPlatform();
3637

38+
/**
39+
* The Micronaut plugins can automatically add dependencies to your project.
40+
* If, for some reason, a dependency shouldn't be automatically added, you can
41+
* add its coordinates to this set. The format is "group:name". It must not include
42+
* the version.
43+
*
44+
* @return the set of ignored automatic dependencies, as group:name strings.
45+
*/
46+
public abstract SetProperty<String> getIgnoredAutomaticDependencies();
47+
3748
@Inject
3849
public MicronautExtension(ObjectFactory objectFactory, SourceSetConfigurer sourceSetConfigurer) {
3950
this.processing = objectFactory.newInstance(AnnotationProcessing.class, sourceSetConfigurer);

Diff for: minimal-plugin/src/main/java/io/micronaut/gradle/internal/AutomaticDependency.java

+30-23
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,12 @@
2121
import org.gradle.api.artifacts.MinimalExternalModuleDependency;
2222
import org.gradle.api.artifacts.VersionCatalog;
2323
import org.gradle.api.artifacts.VersionCatalogsExtension;
24-
import org.gradle.api.artifacts.dsl.DependencyHandler;
2524
import org.gradle.api.provider.Property;
2625
import org.gradle.api.provider.Provider;
2726

27+
import java.util.List;
2828
import java.util.Optional;
29+
import java.util.Set;
2930

3031
/**
3132
* Represents a dependency which is automatically
@@ -43,36 +44,42 @@ public record AutomaticDependency(
4344
) {
4445
public void applyTo(Project p) {
4546
p.getPlugins().withType(MicronautComponentPlugin.class, unused -> {
46-
DependencyHandler dependencyHandler = p.getDependencies();
47-
MicronautExtension micronautExtension = p.getExtensions().getByType(MicronautExtension.class);
48-
dependencyHandler.addProvider(configuration, p.getProviders().provider(() -> {
49-
if (versionProperty.isPresent()) {
50-
Property<String> provider = (Property<String>) micronautExtension.getExtensions().findByName(versionProperty.get().dslName());
51-
if (provider != null && provider.isPresent()) {
52-
return dependencyHandler.create(coordinates + ":" + provider.get());
47+
var dependencyHandler = p.getDependencies();
48+
var micronautExtension = p.getExtensions().getByType(MicronautExtension.class);
49+
var ignoredDependencies = micronautExtension.getIgnoredAutomaticDependencies();
50+
p.getConfigurations().getByName(configuration).getDependencies().addAllLater(
51+
p.getProviders().provider(() -> {
52+
var ignored = ignoredDependencies.getOrElse(Set.of());
53+
if (ignored.contains(coordinates)) {
54+
return List.of();
5355
}
54-
}
55-
// If the Micronaut version catalog is applied via the settings plugin, we won't use an "empty" version
56-
// but fetch it from the catalog if possible
57-
VersionCatalogsExtension versionCatalogs = p.getExtensions().findByType(VersionCatalogsExtension.class);
58-
if (versionCatalogs != null) {
59-
Optional<VersionCatalog> mn = versionCatalogs.find("mn");
60-
if (mn.isPresent()) {
61-
VersionCatalog micronautCatalog = mn.get();
62-
Optional<Provider<MinimalExternalModuleDependency>> dependencyProvider = micronautCatalog.getLibraryAliases()
56+
if (versionProperty.isPresent()) {
57+
Property<String> provider = (Property<String>) micronautExtension.getExtensions().findByName(versionProperty.get().dslName());
58+
if (provider != null && provider.isPresent()) {
59+
return List.of(dependencyHandler.create(coordinates + ":" + provider.get()));
60+
}
61+
}
62+
// If the Micronaut version catalog is applied via the settings plugin, we won't use an "empty" version
63+
// but fetch it from the catalog if possible
64+
VersionCatalogsExtension versionCatalogs = p.getExtensions().findByType(VersionCatalogsExtension.class);
65+
if (versionCatalogs != null) {
66+
Optional<VersionCatalog> mn = versionCatalogs.find("mn");
67+
if (mn.isPresent()) {
68+
VersionCatalog micronautCatalog = mn.get();
69+
Optional<Provider<MinimalExternalModuleDependency>> dependencyProvider = micronautCatalog.getLibraryAliases()
6370
.stream()
6471
.map(micronautCatalog::findLibrary)
6572
.map(Optional::get)
6673
.filter(d -> coordinates.equals(d.get().getModule().toString()))
6774
.findFirst();
68-
if (dependencyProvider.isPresent()) {
69-
return dependencyProvider.get().get();
75+
if (dependencyProvider.isPresent()) {
76+
return List.of(dependencyProvider.get().get());
77+
}
7078
}
7179
}
72-
}
73-
return dependencyHandler.create(coordinates);
74-
}));
75-
80+
return List.of(dependencyHandler.create(coordinates));
81+
})
82+
);
7683
});
7784
}
7885

Diff for: minimal-plugin/src/test/groovy/io/micronaut/gradle/MicronautMinimalApplicationPluginSpec.groovy

+32
Original file line numberDiff line numberDiff line change
@@ -331,4 +331,36 @@ public class ExampleTest {
331331
result.output.contains('Could not find io.micronaut:micronaut-http-server-netty:2048')
332332

333333
}
334+
335+
def "can ignore an automatic dependency"() {
336+
given:
337+
settingsFile << "rootProject.name = 'hello-world'"
338+
buildFile << """
339+
plugins {
340+
id "io.micronaut.minimal.application"
341+
}
342+
343+
micronaut {
344+
version "$micronautVersion"
345+
runtime "netty"
346+
testRuntime "junit5"
347+
ignoredAutomaticDependencies.add("io.micronaut:micronaut-inject-java")
348+
}
349+
350+
$repositoriesBlock
351+
mainClassName="example.Application"
352+
"""
353+
testProjectDir.newFolder("src", "test", "java", "example")
354+
def javaFile = writeExampleClass()
355+
when:
356+
def result = build('test')
357+
358+
def task = result.task(":test")
359+
println result.output
360+
361+
then:
362+
!result.output.contains('Creating bean classes for 1 type elements')
363+
task.outcome == TaskOutcome.FAILED
364+
365+
}
334366
}

0 commit comments

Comments
 (0)