Skip to content

Commit 7cd7317

Browse files
committed
requireAllDefinedDependencies: Modules are not always on compile path
Fixes #47 Resolves #43
1 parent 9a71d23 commit 7cd7317

File tree

3 files changed

+96
-2
lines changed

3 files changed

+96
-2
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Extra Java Module Info Gradle Plugin - Changelog
22

33
## Version 1.4
4+
* [Fixed] [#47](https://github.com/gradlex-org/extra-java-module-info/issues/47) - requireAllDefinedDependencies() gives error when dependency only appears on runtime path (Thanks [Sola](https://github.com/unlimitedsola) for reporting!)
45
* [Fixed] [#45](https://github.com/gradlex-org/extra-java-module-info/issues/45) - Sub-folders in 'META-INF/services' are not ignored (Thanks [Jonas Beyer](https://github.com/j-beyer) for reporting!)
56
* [Fixed] [#44](https://github.com/gradlex-org/extra-java-module-info/issues/44) - Name resolution for jars with '-' character failing if Jars are taken from local .m2 repository (Thanks [Aidan Do](https://github.com/REslim30) for reporting!)
67

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -304,15 +304,21 @@ private byte[] addModuleInfo(ModuleInfo moduleInfo, Map<String, List<String>> pr
304304
Set<String> compileDependencies = getParameters().getCompileClasspathDependencies().get().get(moduleInfo.getIdentifier());
305305
Set<String> runtimeDependencies = getParameters().getRuntimeClasspathDependencies().get().get(moduleInfo.getIdentifier());
306306

307-
if (compileDependencies == null || runtimeDependencies == null) {
307+
if (compileDependencies == null && runtimeDependencies == null) {
308308
throw new RuntimeException("[requires directives from metadata] " +
309309
"Cannot find dependencies for '" + moduleInfo.getModuleName() + "'. " +
310310
"Are '" + moduleInfo.getIdentifier() + "' the correct component coordinates?");
311311
}
312312

313+
if (compileDependencies == null) {
314+
compileDependencies = Collections.emptySet();
315+
}
316+
if (runtimeDependencies == null) {
317+
runtimeDependencies = Collections.emptySet();
318+
}
313319
Set<String> allDependencies = new TreeSet<>();
314320
allDependencies.addAll(compileDependencies);
315-
allDependencies.addAll(runtimeDependencies );
321+
allDependencies.addAll(runtimeDependencies);
316322
for (String ga: allDependencies) {
317323
String moduleName = gaToModuleName(ga);
318324
if (compileDependencies.contains(ga) && runtimeDependencies.contains(ga)) {

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

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,93 @@ class RequireAllDefinedDependenciesFunctionalTest extends Specification {
7878
run().task(':run').outcome == TaskOutcome.SUCCESS
7979
}
8080

81+
// See: https://github.com/gradlex-org/extra-java-module-info/issues/47
82+
def "does not fail in case of runtime-only dependencies"() {
83+
given:
84+
file("src/main/java/org/gradle/sample/app/Main.java") << """
85+
package org.gradle.sample.app;
86+
87+
public class Main {
88+
public static void main(String[] args) throws Exception {
89+
}
90+
}
91+
"""
92+
file("src/main/java/module-info.java") << """
93+
module org.gradle.sample.app {
94+
exports org.gradle.sample.app;
95+
96+
requires kotlin.scripting.jvm.host;
97+
}
98+
"""
99+
buildFile << """
100+
dependencies {
101+
implementation("org.jetbrains.kotlin:kotlin-scripting-jvm-host:1.8.20")
102+
}
103+
104+
tasks.register("resolveRuntimeClasspath") {
105+
doLast { configurations.runtimeClasspath.get().resolve() }
106+
}
107+
108+
extraJavaModuleInfo {
109+
knownModule("org.jetbrains.kotlin:kotlin-stdlib", "kotlin.stdlib")
110+
knownModule("net.java.dev.jna:jna", "com.sun.jna")
111+
module("org.jetbrains.kotlin:kotlin-stdlib-common", "kotlin.stdlib.common") {
112+
exportAllPackages()
113+
requireAllDefinedDependencies()
114+
}
115+
module("org.jetbrains:annotations", "org.jetbrains.annotations") {
116+
exportAllPackages()
117+
requireAllDefinedDependencies()
118+
}
119+
module("org.jetbrains.kotlin:kotlin-reflect", "kotlin.reflect") {
120+
exportAllPackages()
121+
requireAllDefinedDependencies()
122+
}
123+
module("org.jetbrains.kotlin:kotlin-scripting-jvm-host", "kotlin.scripting.jvm.host") {
124+
exportAllPackages()
125+
requireAllDefinedDependencies()
126+
}
127+
module("org.jetbrains.kotlin:kotlin-script-runtime", "kotlin.script.runtime") {
128+
exportAllPackages()
129+
requireAllDefinedDependencies()
130+
}
131+
module("org.jetbrains.kotlin:kotlin-scripting-common", "kotlin.scripting.common") {
132+
exportAllPackages()
133+
requireAllDefinedDependencies()
134+
}
135+
module("org.jetbrains.kotlin:kotlin-scripting-jvm", "kotlin.scripting.jvm") {
136+
exportAllPackages()
137+
requireAllDefinedDependencies()
138+
}
139+
module("org.jetbrains.kotlin:kotlin-compiler-embeddable", "kotlin.compiler.embeddable") {
140+
exportAllPackages()
141+
requireAllDefinedDependencies()
142+
}
143+
module("org.jetbrains.intellij.deps:trove4j", "trove4j") {
144+
exportAllPackages()
145+
requireAllDefinedDependencies()
146+
}
147+
module("org.jetbrains.kotlin:kotlin-daemon-embeddable", "kotlin.daemon.embeddable") {
148+
exportAllPackages()
149+
requireAllDefinedDependencies()
150+
}
151+
module("org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable", "kotlin.scripting.compiler.embeddable") {
152+
exportAllPackages()
153+
requireAllDefinedDependencies()
154+
}
155+
module("org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable", "kotlin.scripting.compiler.impl.embeddable") {
156+
exportAllPackages()
157+
requireAllDefinedDependencies()
158+
}
159+
}
160+
"""
161+
162+
expect:
163+
// The patched modules in this example do not run because of split-package and service provider issues
164+
// run().task(':run').outcome == TaskOutcome.SUCCESS
165+
runner('resolveRuntimeClasspath').build().task(':resolveRuntimeClasspath').outcome == TaskOutcome.SUCCESS
166+
}
167+
81168
def "can automatically add requires directives based on component metadata when module is only used in test"() {
82169
given:
83170
file("src/test/java/org/gradle/sample/app/test/AppTest.java") << """

0 commit comments

Comments
 (0)