Skip to content

Commit 3824c87

Browse files
committed
Support more classspaths when using 'requireAllDefinedDependencies()'
#40
1 parent a18d579 commit 3824c87

File tree

3 files changed

+74
-9
lines changed

3 files changed

+74
-9
lines changed

src/main/java/org/gradlex/javamodule/moduleinfo/ExtraJavaModuleInfoPlugin.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@
2121
import org.gradle.api.Project;
2222
import org.gradle.api.Transformer;
2323
import org.gradle.api.artifacts.Configuration;
24+
import org.gradle.api.artifacts.ConfigurationContainer;
2425
import org.gradle.api.artifacts.component.ComponentIdentifier;
2526
import org.gradle.api.artifacts.component.ModuleComponentIdentifier;
27+
import org.gradle.api.artifacts.dsl.DependencyHandler;
2628
import org.gradle.api.artifacts.result.DependencyResult;
2729
import org.gradle.api.artifacts.result.ResolvedArtifactResult;
2830
import org.gradle.api.artifacts.result.ResolvedDependencyResult;
@@ -104,13 +106,15 @@ private void configureTransform(Project project, ExtraJavaModuleInfoPluginExtens
104106
}
105107

106108
private void registerTransform(String fileExtension, Project project, ExtraJavaModuleInfoPluginExtension extension, Configuration javaModulesMergeJars, Attribute<String> artifactType, Attribute<Boolean> javaModule) {
109+
DependencyHandler dependencies = project.getDependencies();
110+
ConfigurationContainer configurations = project.getConfigurations();
111+
SourceSetContainer sourceSets = project.getExtensions().getByType(SourceSetContainer.class);
112+
107113
// all Jars have a javaModule=false attribute by default; the transform also recognizes modules and returns them without modification
108-
project.getDependencies().getArtifactTypes().maybeCreate(fileExtension).getAttributes().attribute(javaModule, false);
109-
Configuration compileClasspath = project.getConfigurations().getByName(JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME);
110-
Configuration runtimeClasspath = project.getConfigurations().getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME);
114+
dependencies.getArtifactTypes().maybeCreate(fileExtension).getAttributes().attribute(javaModule, false);
111115

112116
// register the transform for Jars and "javaModule=false -> javaModule=true"; the plugin extension object fills the input parameter
113-
project.getDependencies().registerTransform(ExtraJavaModuleInfoTransform.class, t -> {
117+
dependencies.registerTransform(ExtraJavaModuleInfoTransform.class, t -> {
114118
t.parameters(p -> {
115119
p.getModuleSpecs().set(extension.getModuleSpecs());
116120
p.getFailOnMissingModuleInfo().set(extension.getFailOnMissingModuleInfo());
@@ -121,14 +125,16 @@ private void registerTransform(String fileExtension, Project project, ExtraJavaM
121125
p.getMergeJarIds().set(artifacts.map(new IdExtractor()));
122126
p.getMergeJars().set(artifacts.map(new FileExtractor(project.getLayout())));
123127
p.getCompileClasspathDependencies().set(project.provider(() ->
124-
compileClasspath.getIncoming().getResolutionResult().getAllComponents().stream().collect(Collectors.toMap(
128+
sourceSets.stream().flatMap(s -> configurations.getByName(s.getCompileClasspathConfigurationName()).getIncoming().getResolutionResult().getAllComponents().stream()).collect(Collectors.toMap(
125129
c -> ga(c.getId()),
126-
c -> c.getDependencies().stream().map(ExtraJavaModuleInfoPlugin::ga).collect(Collectors.toSet())
130+
c -> c.getDependencies().stream().map(ExtraJavaModuleInfoPlugin::ga).collect(Collectors.toSet()),
131+
(dependencies1, dependencies2) -> dependencies1 // There can be duplications which are assumed to be the same
127132
))));
128133
p.getRuntimeClasspathDependencies().set(project.provider(() ->
129-
runtimeClasspath.getIncoming().getResolutionResult().getAllComponents().stream().collect(Collectors.toMap(
134+
sourceSets.stream().flatMap(s -> configurations.getByName(s.getRuntimeClasspathConfigurationName()).getIncoming().getResolutionResult().getAllComponents().stream()).collect(Collectors.toMap(
130135
c -> ga(c.getId()),
131-
c -> c.getDependencies().stream().map(ExtraJavaModuleInfoPlugin::ga).collect(Collectors.toSet())
136+
c -> c.getDependencies().stream().map(ExtraJavaModuleInfoPlugin::ga).collect(Collectors.toSet()),
137+
(dependencies1, dependencies2) -> dependencies1 // There can be duplications which are assumed to be the same
132138
))));
133139
});
134140
t.getFrom().attribute(artifactType, fileExtension).attribute(javaModule, false);

src/test/groovy/org/gradlex/javamodule/moduleinfo/test/RequireAllDefinedDependenciesFunctionalTest.groovy

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ class RequireAllDefinedDependenciesFunctionalTest extends Specification {
3535
import org.apache.http.client.methods.HttpPost;
3636
import org.apache.http.client.entity.UrlEncodedFormEntity;
3737
import org.apache.http.message.BasicNameValuePair;
38-
3938
import java.util.List;
4039
import java.util.ArrayList;
4140
@@ -79,6 +78,62 @@ class RequireAllDefinedDependenciesFunctionalTest extends Specification {
7978
run().task(':run').outcome == TaskOutcome.SUCCESS
8079
}
8180

81+
def "can automatically add requires directives based on component metadata when module is only used in test"() {
82+
given:
83+
file("src/test/java/org/gradle/sample/app/test/AppTest.java") << """
84+
package org.gradle.sample.app.test;
85+
86+
import org.apache.http.NameValuePair;
87+
import org.apache.http.client.methods.HttpPost;
88+
import org.apache.http.client.entity.UrlEncodedFormEntity;
89+
import org.apache.http.message.BasicNameValuePair;
90+
import org.junit.Test;
91+
import java.util.List;
92+
import java.util.ArrayList;
93+
94+
public class AppTest {
95+
96+
@Test
97+
public void testPost() throws Exception {
98+
HttpPost httpPost = new HttpPost("http://targethost/login");
99+
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
100+
nvps.add(new BasicNameValuePair("username", "vip"));
101+
nvps.add(new BasicNameValuePair("password", "secret"));
102+
httpPost.setEntity(new UrlEncodedFormEntity(nvps));
103+
}
104+
}
105+
"""
106+
file("src/test/java/module-info.java") << """
107+
open module org.gradle.sample.app.test {
108+
requires junit;
109+
requires org.apache.httpcomponents.httpclient;
110+
}
111+
"""
112+
buildFile << """
113+
dependencies {
114+
testImplementation("junit:junit:4.13.2")
115+
testImplementation("org.apache.httpcomponents:httpclient:4.5.14")
116+
}
117+
118+
extraJavaModuleInfo {
119+
automaticModule("org.hamcrest:hamcrest-core", "org.hamcrest.core")
120+
module("${libs.commonsHttpClient}", "org.apache.httpcomponents.httpclient") {
121+
exportAllPackages()
122+
requireAllDefinedDependencies()
123+
}
124+
module("${libs.commonsLogging}", "org.apache.commons.logging") {
125+
exportAllPackages()
126+
requireAllDefinedDependencies()
127+
}
128+
knownModule("commons-codec:commons-codec", "org.apache.commons.codec")
129+
knownModule("org.apache.httpcomponents:httpcore", "org.apache.httpcomponents.httpcore")
130+
}
131+
"""
132+
133+
expect:
134+
test().task(':test').outcome == TaskOutcome.SUCCESS
135+
}
136+
82137
def "gives error if dependencies cannot be discovered"() {
83138
given:
84139
file("src/main/java/org/gradle/sample/app/Main.java") << """

src/test/groovy/org/gradlex/javamodule/moduleinfo/test/fixture/GradleBuild.groovy

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ class GradleBuild {
3434
runner('run').build()
3535
}
3636

37+
BuildResult test() {
38+
runner('test').build()
39+
}
40+
3741
BuildResult fail() {
3842
runner('build').buildAndFail()
3943
}

0 commit comments

Comments
 (0)