Skip to content

Commit 2cec397

Browse files
committed
Prohibit unwanted dependencies in all modules not just starters
Closes gh-28658
1 parent 0889cdd commit 2cec397

File tree

43 files changed

+429
-136
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+429
-136
lines changed

buildSrc/src/main/java/org/springframework/boot/build/JavaConventions.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,11 @@
4848
import org.gradle.testretry.TestRetryPlugin;
4949
import org.gradle.testretry.TestRetryTaskExtension;
5050

51+
import org.springframework.boot.build.classpath.CheckClasspathForProhibitedDependencies;
5152
import org.springframework.boot.build.optional.OptionalDependenciesPlugin;
5253
import org.springframework.boot.build.testing.TestFailuresPlugin;
5354
import org.springframework.boot.build.toolchain.ToolchainPlugin;
55+
import org.springframework.util.StringUtils;
5456

5557
/**
5658
* Conventions that are applied in the presence of the {@link JavaBasePlugin}. When the
@@ -112,6 +114,7 @@ void apply(Project project) {
112114
configureJarManifestConventions(project);
113115
configureDependencyManagement(project);
114116
configureToolchain(project);
117+
configureProhibitedDependencyChecks(project);
115118
});
116119
}
117120

@@ -239,4 +242,26 @@ private void configureToolchain(Project project) {
239242
project.getPlugins().apply(ToolchainPlugin.class);
240243
}
241244

245+
private void configureProhibitedDependencyChecks(Project project) {
246+
SourceSetContainer sourceSets = project.getExtensions().getByType(SourceSetContainer.class);
247+
sourceSets.all((sourceSet) -> createProhibitedDependenciesChecks(project,
248+
sourceSet.getCompileClasspathConfigurationName(), sourceSet.getRuntimeClasspathConfigurationName()));
249+
}
250+
251+
private void createProhibitedDependenciesChecks(Project project, String... configurationNames) {
252+
ConfigurationContainer configurations = project.getConfigurations();
253+
for (String configurationName : configurationNames) {
254+
Configuration configuration = configurations.getByName(configurationName);
255+
createProhibitedDependenciesCheck(configuration, project);
256+
}
257+
}
258+
259+
private void createProhibitedDependenciesCheck(Configuration classpath, Project project) {
260+
CheckClasspathForProhibitedDependencies checkClasspathForProhibitedDependencies = project.getTasks().create(
261+
"check" + StringUtils.capitalize(classpath.getName() + "ForProhibitedDependencies"),
262+
CheckClasspathForProhibitedDependencies.class);
263+
checkClasspathForProhibitedDependencies.setClasspath(classpath);
264+
project.getTasks().getByName(JavaBasePlugin.CHECK_TASK_NAME).dependsOn(checkClasspathForProhibitedDependencies);
265+
}
266+
242267
}

buildSrc/src/main/java/org/springframework/boot/build/classpath/CheckClasspathForProhibitedDependencies.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ private boolean prohibited(ModuleVersionIdentifier id) {
7070
if (group.equals("javax.batch")) {
7171
return false;
7272
}
73+
if (group.equals("javax.cache")) {
74+
return false;
75+
}
76+
if (group.equals("javax.money")) {
77+
return false;
78+
}
7379
if (group.startsWith("javax")) {
7480
return true;
7581
}

buildSrc/src/main/java/org/springframework/boot/build/starters/StarterPlugin.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import org.springframework.boot.build.ConventionsPlugin;
3434
import org.springframework.boot.build.DeployedPlugin;
3535
import org.springframework.boot.build.classpath.CheckClasspathForConflicts;
36-
import org.springframework.boot.build.classpath.CheckClasspathForProhibitedDependencies;
3736
import org.springframework.boot.build.classpath.CheckClasspathForUnnecessaryExclusions;
3837
import org.springframework.util.StringUtils;
3938

@@ -62,7 +61,6 @@ public void apply(Project project) {
6261
project.getArtifacts().add("starterMetadata", project.provider(starterMetadata::getDestination),
6362
(artifact) -> artifact.builtBy(starterMetadata));
6463
createClasspathConflictsCheck(runtimeClasspath, project);
65-
createProhibitedDependenciesCheck(runtimeClasspath, project);
6664
createUnnecessaryExclusionsCheck(runtimeClasspath, project);
6765
configureJarManifest(project);
6866
}
@@ -75,14 +73,6 @@ private void createClasspathConflictsCheck(Configuration classpath, Project proj
7573
project.getTasks().getByName(JavaBasePlugin.CHECK_TASK_NAME).dependsOn(checkClasspathForConflicts);
7674
}
7775

78-
private void createProhibitedDependenciesCheck(Configuration classpath, Project project) {
79-
CheckClasspathForProhibitedDependencies checkClasspathForProhibitedDependencies = project.getTasks().create(
80-
"check" + StringUtils.capitalize(classpath.getName() + "ForProhibitedDependencies"),
81-
CheckClasspathForProhibitedDependencies.class);
82-
checkClasspathForProhibitedDependencies.setClasspath(classpath);
83-
project.getTasks().getByName(JavaBasePlugin.CHECK_TASK_NAME).dependsOn(checkClasspathForProhibitedDependencies);
84-
}
85-
8676
private void createUnnecessaryExclusionsCheck(Configuration classpath, Project project) {
8777
CheckClasspathForUnnecessaryExclusions checkClasspathForUnnecessaryExclusions = project.getTasks().create(
8878
"check" + StringUtils.capitalize(classpath.getName() + "ForUnnecessaryExclusions"),

buildSrc/src/test/java/org/springframework/boot/build/ConventionsPluginTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,12 @@ void sourceJarIsBuilt() throws IOException {
105105
out.println("version = '1.2.3'");
106106
out.println("sourceCompatibility = '1.8'");
107107
out.println("description 'Test'");
108+
out.println("repositories {");
109+
out.println(" mavenCentral()");
110+
out.println("}");
111+
out.println("dependencies {");
112+
out.println(" implementation(platform(\"org.junit:junit-bom:5.6.0\"))");
113+
out.println("}");
108114
}
109115
runGradle("build");
110116
File file = new File(this.projectDir, "/build/libs/" + this.projectDir.getName() + "-1.2.3-sources.jar");
@@ -134,6 +140,12 @@ void javadocJarIsBuilt() throws IOException {
134140
out.println("version = '1.2.3'");
135141
out.println("sourceCompatibility = '1.8'");
136142
out.println("description 'Test'");
143+
out.println("repositories {");
144+
out.println(" mavenCentral()");
145+
out.println("}");
146+
out.println("dependencies {");
147+
out.println(" implementation(platform(\"org.junit:junit-bom:5.6.0\"))");
148+
out.println("}");
137149
}
138150
runGradle("build");
139151
File file = new File(this.projectDir, "/build/libs/" + this.projectDir.getName() + "-1.2.3-javadoc.jar");

spring-boot-project/spring-boot-actuator-autoconfigure/build.gradle

Lines changed: 52 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ dependencies {
2626
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")
2727

2828
optional("ch.qos.logback:logback-classic")
29-
optional("com.datastax.oss:java-driver-core")
29+
optional("com.datastax.oss:java-driver-core") {
30+
exclude group: "org.slf4j", module: "jcl-over-slf4j"
31+
}
3032
optional("com.fasterxml.jackson.dataformat:jackson-dataformat-xml")
3133
optional("com.github.ben-manes.caffeine:caffeine")
3234
optional("com.hazelcast:hazelcast")
@@ -38,7 +40,9 @@ dependencies {
3840
optional("io.micrometer:micrometer-core")
3941
optional("io.micrometer:micrometer-jersey2")
4042
optional("io.micrometer:micrometer-registry-appoptics")
41-
optional("io.micrometer:micrometer-registry-atlas")
43+
optional("io.micrometer:micrometer-registry-atlas") {
44+
exclude group: "javax.inject", module: "javax.inject"
45+
}
4246
optional("io.micrometer:micrometer-registry-datadog")
4347
optional("io.micrometer:micrometer-registry-dynatrace")
4448
optional("io.micrometer:micrometer-registry-elastic")
@@ -50,37 +54,59 @@ dependencies {
5054
optional("io.micrometer:micrometer-registry-kairos")
5155
optional("io.micrometer:micrometer-registry-new-relic")
5256
optional("io.micrometer:micrometer-registry-prometheus")
53-
optional("io.micrometer:micrometer-registry-stackdriver")
54-
optional("io.prometheus:simpleclient_pushgateway")
57+
optional("io.micrometer:micrometer-registry-stackdriver") {
58+
exclude group: "commons-logging", module: "commons-logging"
59+
exclude group: "javax.annotation", module: "javax.annotation-api"
60+
}
61+
optional("io.prometheus:simpleclient_pushgateway") {
62+
exclude group: "javax.xml.bind", module: "jaxb-api"
63+
}
5564
optional("io.micrometer:micrometer-registry-signalfx")
5665
optional("io.micrometer:micrometer-registry-statsd")
5766
optional("io.micrometer:micrometer-registry-wavefront")
5867
optional("io.projectreactor.netty:reactor-netty-http")
5968
optional("io.r2dbc:r2dbc-pool")
6069
optional("io.r2dbc:r2dbc-spi")
6170
optional("jakarta.jms:jakarta.jms-api")
71+
optional("jakarta.persistence:jakarta.persistence-api")
6272
optional("jakarta.servlet:jakarta.servlet-api")
6373
optional("javax.cache:cache-api")
6474
optional("net.sf.ehcache:ehcache")
65-
optional("org.apache.activemq:activemq-broker")
66-
optional("org.apache.commons:commons-dbcp2")
75+
optional("org.apache.activemq:activemq-broker") {
76+
exclude group: "org.apache.geronimo.specs", module: "geronimo-jms_1.1_spec"
77+
exclude group: "org.apache.geronimo.specs", module: "geronimo-j2ee-management_1.1_spec"
78+
}
79+
optional("org.apache.commons:commons-dbcp2") {
80+
exclude group: "commons-logging", module: "commons-logging"
81+
}
6782
optional("org.apache.kafka:kafka-clients")
6883
optional("org.apache.kafka:kafka-streams")
6984
optional("org.apache.tomcat.embed:tomcat-embed-core")
7085
optional("org.apache.tomcat.embed:tomcat-embed-el")
7186
optional("org.apache.tomcat:tomcat-jdbc")
7287
optional("org.aspectj:aspectjweaver")
73-
optional("org.eclipse.jetty:jetty-server")
88+
optional("org.eclipse.jetty:jetty-server") {
89+
exclude group: "javax.servlet", module: "javax.servlet-api"
90+
}
7491
optional("org.elasticsearch:elasticsearch")
75-
optional("org.elasticsearch.client:elasticsearch-rest-client")
92+
optional("org.elasticsearch.client:elasticsearch-rest-client") {
93+
exclude group: "commons-logging", module: "commons-logging"
94+
}
7695
optional("org.flywaydb:flyway-core")
7796
optional("org.glassfish.jersey.core:jersey-server")
7897
optional("org.glassfish.jersey.containers:jersey-container-servlet-core")
79-
optional("org.hibernate:hibernate-core")
98+
optional("org.hibernate:hibernate-core") {
99+
exclude group: "javax.activation", module: "javax.activation-api"
100+
exclude group: "javax.persistence", module: "javax.persistence-api"
101+
exclude group: "javax.xml.bind", module: "jaxb-api"
102+
exclude group: "org.jboss.spec.javax.transaction", module: "jboss-transaction-api_1.2_spec"
103+
}
80104
optional("org.hibernate.validator:hibernate-validator")
81105
optional("org.influxdb:influxdb-java")
82106
optional("org.jolokia:jolokia-core")
83-
optional("org.liquibase:liquibase-core")
107+
optional("org.liquibase:liquibase-core") {
108+
exclude group: "javax.xml.bind", module: "jaxb-api"
109+
}
84110
optional("org.mongodb:mongodb-driver-reactivestreams")
85111
optional("org.mongodb:mongodb-driver-sync")
86112
optional("org.neo4j.driver:neo4j-java-driver")
@@ -90,12 +116,16 @@ dependencies {
90116
optional("org.springframework:spring-webflux")
91117
optional("org.springframework:spring-webmvc")
92118
optional("org.springframework.amqp:spring-rabbit")
93-
optional("org.springframework.data:spring-data-cassandra")
119+
optional("org.springframework.data:spring-data-cassandra") {
120+
exclude group: "org.slf4j", module: "jcl-over-slf4j"
121+
}
94122
optional("org.springframework.data:spring-data-couchbase")
95123
optional("org.springframework.data:spring-data-ldap")
96124
optional("org.springframework.data:spring-data-mongodb")
97125
optional("org.springframework.data:spring-data-redis")
98-
optional("org.springframework.data:spring-data-elasticsearch")
126+
optional("org.springframework.data:spring-data-elasticsearch") {
127+
exclude group: "commons-logging", module: "commons-logging"
128+
}
99129
optional("org.springframework.data:spring-data-solr")
100130
optional("org.springframework.integration:spring-integration-core")
101131
optional("org.springframework.kafka:spring-kafka")
@@ -112,15 +142,17 @@ dependencies {
112142
testImplementation("com.jayway.jsonpath:json-path")
113143
testImplementation("io.undertow:undertow-core")
114144
testImplementation("io.undertow:undertow-servlet") {
115-
exclude group: "org.jboss.spec.javax.annotation", module: "jboss-annotations-api_1.2_spec"
145+
exclude group: "org.jboss.spec.javax.annotation", module: "jboss-annotations-api_1.3_spec"
116146
exclude group: "org.jboss.spec.javax.servlet", module: "jboss-servlet-api_4.0_spec"
117147
}
118-
testImplementation("javax.xml.bind:jaxb-api")
148+
testImplementation("jakarta.xml.bind:jakarta.xml.bind-api")
119149
testImplementation("org.apache.logging.log4j:log4j-to-slf4j")
120150
testImplementation("org.aspectj:aspectjrt")
121151
testImplementation("org.assertj:assertj-core")
122152
testImplementation("org.awaitility:awaitility")
123-
testImplementation("org.eclipse.jetty:jetty-webapp")
153+
testImplementation("org.eclipse.jetty:jetty-webapp") {
154+
exclude group: "javax.servlet", module: "javax.servlet-api"
155+
}
124156
testImplementation("org.glassfish.jersey.ext:jersey-spring5")
125157
testImplementation("org.glassfish.jersey.media:jersey-media-json-jackson")
126158
testImplementation("org.hamcrest:hamcrest")
@@ -130,16 +162,17 @@ dependencies {
130162
testImplementation("org.mockito:mockito-junit-jupiter")
131163
testImplementation("org.skyscreamer:jsonassert")
132164
testImplementation("org.springframework:spring-orm")
133-
testImplementation("org.springframework.data:spring-data-elasticsearch") {
134-
exclude group: "org.elasticsearch.client", module: "transport"
135-
}
136165
testImplementation("org.springframework.data:spring-data-rest-webmvc")
137166
testImplementation("org.springframework.integration:spring-integration-jmx")
138-
testImplementation("org.springframework.restdocs:spring-restdocs-mockmvc")
167+
testImplementation("org.springframework.restdocs:spring-restdocs-mockmvc") {
168+
exclude group: "javax.servlet", module: "javax.servlet-api"
169+
}
139170
testImplementation("org.springframework.restdocs:spring-restdocs-webtestclient")
140171
testImplementation("org.springframework.security:spring-security-test")
141172
testImplementation("org.yaml:snakeyaml")
142173

174+
testRuntimeOnly("jakarta.management.j2ee:jakarta.management.j2ee-api")
175+
testRuntimeOnly("jakarta.transaction:jakarta.transaction-api")
143176
testRuntimeOnly("org.springframework.security:spring-security-oauth2-jose")
144177
testRuntimeOnly("org.springframework.security:spring-security-oauth2-resource-server")
145178
testRuntimeOnly("org.springframework.security:spring-security-saml2-service-provider")

spring-boot-project/spring-boot-actuator/build.gradle

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ description = "Spring Boot Actuator"
1111
dependencies {
1212
api(project(":spring-boot-project:spring-boot"))
1313

14-
optional("com.datastax.oss:java-driver-core")
14+
optional("com.datastax.oss:java-driver-core") {
15+
exclude group: "org.slf4j", module: "jcl-over-slf4j"
16+
}
1517
optional("com.fasterxml.jackson.core:jackson-databind")
1618
optional("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")
1719
optional("com.github.ben-manes.caffeine:caffeine")
@@ -22,28 +24,36 @@ dependencies {
2224
optional("io.lettuce:lettuce-core")
2325
optional("io.micrometer:micrometer-core")
2426
optional("io.micrometer:micrometer-registry-prometheus")
25-
optional("io.prometheus:simpleclient_pushgateway")
27+
optional("io.prometheus:simpleclient_pushgateway") {
28+
exclude(group: "javax.xml.bind", module: "jaxb-api")
29+
}
2630
optional("io.r2dbc:r2dbc-pool")
2731
optional("io.r2dbc:r2dbc-spi")
2832
optional("io.reactivex:rxjava-reactive-streams")
29-
optional("org.elasticsearch.client:elasticsearch-rest-client")
33+
optional("org.elasticsearch.client:elasticsearch-rest-client") {
34+
exclude(group: "commons-logging", module: "commons-logging")
35+
}
3036
optional("io.undertow:undertow-servlet") {
31-
exclude group: "org.jboss.spec.javax.annotation", module: "jboss-annotations-api_1.2_spec"
37+
exclude group: "org.jboss.spec.javax.annotation", module: "jboss-annotations-api_1.3_spec"
3238
exclude group: "org.jboss.spec.javax.servlet", module: "jboss-servlet-api_4.0_spec"
3339
}
3440
optional("javax.cache:cache-api")
35-
optional("javax.jms:javax.jms-api")
41+
optional("jakarta.jms:jakarta.jms-api")
3642
optional("net.sf.ehcache:ehcache")
3743
optional("org.apache.tomcat.embed:tomcat-embed-core")
3844
optional("org.aspectj:aspectjweaver")
39-
optional("org.eclipse.jetty:jetty-server")
45+
optional("org.eclipse.jetty:jetty-server") {
46+
exclude(group: "javax.servlet", module: "javax.servlet-api")
47+
}
4048
optional("org.elasticsearch:elasticsearch")
4149
optional("org.flywaydb:flyway-core")
4250
optional("org.glassfish.jersey.core:jersey-server")
4351
optional("org.glassfish.jersey.containers:jersey-container-servlet-core")
4452
optional("org.hibernate.validator:hibernate-validator")
4553
optional("org.influxdb:influxdb-java")
46-
optional("org.liquibase:liquibase-core")
54+
optional("org.liquibase:liquibase-core") {
55+
exclude(group: "javax.xml.bind", module: "jaxb-api")
56+
}
4757
optional("org.mongodb:mongodb-driver-reactivestreams")
4858
optional("org.mongodb:mongodb-driver-sync")
4959
optional("org.neo4j.driver:neo4j-java-driver")
@@ -53,9 +63,13 @@ dependencies {
5363
optional("org.springframework:spring-web")
5464
optional("org.springframework:spring-webmvc")
5565
optional("org.springframework.amqp:spring-rabbit")
56-
optional("org.springframework.data:spring-data-cassandra")
66+
optional("org.springframework.data:spring-data-cassandra") {
67+
exclude group: "org.slf4j", module: "jcl-over-slf4j"
68+
}
5769
optional("org.springframework.data:spring-data-couchbase")
58-
optional("org.springframework.data:spring-data-elasticsearch")
70+
optional("org.springframework.data:spring-data-elasticsearch") {
71+
exclude(group: "commons-logging", module: "commons-logging")
72+
}
5973
optional("org.springframework.data:spring-data-ldap")
6074
optional("org.springframework.data:spring-data-mongodb")
6175
optional("org.springframework.data:spring-data-redis")
@@ -86,7 +100,7 @@ dependencies {
86100
testImplementation("org.testcontainers:junit-jupiter")
87101

88102
testRuntimeOnly("io.projectreactor.netty:reactor-netty-http")
89-
testRuntimeOnly("javax.xml.bind:jaxb-api")
103+
testRuntimeOnly("jakarta.xml.bind:jakarta.xml.bind-api")
90104
testRuntimeOnly("org.apache.tomcat.embed:tomcat-embed-el")
91105
testRuntimeOnly("org.glassfish.jersey.ext:jersey-spring5")
92106
testRuntimeOnly("org.hsqldb:hsqldb")

0 commit comments

Comments
 (0)