Skip to content

Commit 2f2beab

Browse files
committed
Upgrade to version 2.0.0, enhance compatibility with Gradle 8.11+ to 9.0+, and update Java source compatibility to 17. Refactor test dependencies and improve task handling in the module plugin.
1 parent 34139d3 commit 2f2beab

26 files changed

Lines changed: 163 additions & 151 deletions

README.md

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,16 @@ The plugin supports the following test engines:
3232

3333
An example application using this plugin is available [here](https://github.com/java9-modularity/gradle-modules-plugin-example).
3434

35-
Compatability
35+
Compatibility
3636
===
3737

38-
| Plugin Version | Gradle Versions | Java Version | Kotlin Version | Notes |
39-
|------------------|-----------------|--------------|----------------|--------------------------------------------------------------------------------------------|
40-
| - -> 1.8.12 | 5.+ -> 7.5.+ | 11+ | 1.0.+ -> 1.6.+ | |
41-
| 1.8.12 -> 1.8.13 | 5.+ -> 7.5.+ | 11+ | 1.0.+ -> 1.9.+ | Adds support for Kotlin 1.7 and above. |
42-
| 1.8.14 | 5.+ -> 7.6.+ | 11+ | 1.0.+ -> 1.9.+ | Fixes compatibility issue with Gradle 7.6 |
43-
| 1.8.15 -> + | 5.+ -> 8.6.+ | 11+ | 1.6.+ -> 1.9.+ | Fixes compatibility issues with Gradle 8.0.<br>Use JUnit v5.8.0 or above if using Gradle 8 |
38+
| Plugin Version | Gradle Versions | Java Version | Kotlin Version | Notes |
39+
| ---------------- | --------------- | ------------ | -------------- | ------------------------------------------------------------ |
40+
| - -> 1.8.12 | 5.+ -> 7.5.+ | 11+ | 1.0.+ -> 1.6.+ | |
41+
| 1.8.12 -> 1.8.13 | 5.+ -> 7.5.+ | 11+ | 1.0.+ -> 1.9.+ | Adds support for Kotlin 1.7 and above. |
42+
| 1.8.14 | 5.+ -> 7.6.+ | 11+ | 1.0.+ -> 1.9.+ | Fixes compatibility issue with Gradle 7.6 |
43+
| 1.8.15 -> 1.8.x | 5.+ -> 8.6.+ | 11+ | 1.6.+ -> 1.9.+ | Fixes compatibility issues with Gradle 8.0.<br>Use JUnit v5.8.0 or above if using Gradle 8 |
44+
| 2.0.0 | 8.11.+ -> 9.+ | 17+ | 1.8.+ -> 2.x+ | Adds support for Gradle 9.x.<br>Minimum Java version raised to 17 |
4445

4546
Setup
4647
===
@@ -76,7 +77,7 @@ The main build file should look as follows:
7677

7778
```groovy
7879
plugins {
79-
id 'org.javamodularity.moduleplugin' version '1.8.15' apply false
80+
id 'org.javamodularity.moduleplugin' version '2.0.0' apply false
8081
}
8182
8283
subprojects {
@@ -85,8 +86,8 @@ subprojects {
8586
8687
version "1.0-SNAPSHOT"
8788
88-
sourceCompatibility = 11
89-
targetCompatibility = 11
89+
sourceCompatibility = 17
90+
targetCompatibility = 17
9091
9192
repositories {
9293
mavenCentral()
@@ -101,19 +102,21 @@ subprojects {
101102
}
102103
103104
dependencies {
104-
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1'
105-
testImplementation 'org.junit.jupiter:junit-jupiter-params:5.3.1'
106-
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.3.1'
105+
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.2'
106+
testImplementation 'org.junit.jupiter:junit-jupiter-params:5.10.2'
107+
testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.10.2'
108+
testRuntimeOnly "org.junit.platform:junit-platform-launcher:1.10.2"
107109
}
108110
}
109111
```
110112
</details>
113+
111114
<details>
112115
<summary>Kotlin DSL</summary>
113116

114117
```kotlin
115118
plugins {
116-
id("org.javamodularity.moduleplugin") version "1.8.15" apply false
119+
id("org.javamodularity.moduleplugin") version "2.0.0" apply false
117120
}
118121

119122
subprojects {
@@ -124,7 +127,7 @@ subprojects {
124127

125128
java {
126129
toolchain {
127-
languageVersion.set(JavaLanguageVersion.of(11))
130+
languageVersion.set(JavaLanguageVersion.of(17))
128131
}
129132
}
130133

@@ -141,9 +144,10 @@ subprojects {
141144
}
142145

143146
dependencies {
144-
testImplementation("org.junit.jupiter:junit-jupiter-api:5.3.1")
145-
testImplementation("org.junit.jupiter:junit-jupiter-params:5.3.1")
146-
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.3.1")
147+
testImplementation("org.junit.jupiter:junit-jupiter-api:5.10.1")
148+
testImplementation("org.junit.jupiter:junit-jupiter-params:5.10.2")
149+
testImplementation("org.junit.jupiter:junit-jupiter-engine:5.10.2")
150+
testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.10.2")
147151
}
148152
}
149153
```
@@ -952,7 +956,7 @@ Please file issues if you run into any problems or have additional requirements!
952956
Requirements
953957
===
954958

955-
This plugin requires JDK 11 or newer to be used when running Gradle.
959+
This plugin requires JDK 17 or newer to be used when running Gradle.
956960

957961
The minimum Gradle version supported by this plugin is 5.1.
958962
However, we strongly recommend to use at least Gradle 6.0, because there are a few special cases that cannot be handled correctly when using older versions.

build.gradle

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@ buildScan {
1313
}
1414

1515
group 'org.javamodularity'
16-
version '1.8.16-SNAPSHOT'
16+
version '2.0.0'
1717

18-
sourceCompatibility = 11
19-
targetCompatibility = 11
18+
java {
19+
sourceCompatibility = JavaVersion.VERSION_17
20+
targetCompatibility = JavaVersion.VERSION_17
21+
}
2022

2123
repositories {
2224
mavenCentral()
@@ -39,8 +41,8 @@ dependencies {
3941
testImplementation 'com.google.guava:guava-io:r03'
4042
testImplementation "org.junit.jupiter:junit-jupiter-api:$jUnitVersion"
4143
testImplementation "org.junit.jupiter:junit-jupiter-params:$jUnitVersion"
44+
testImplementation "org.junit.jupiter:junit-jupiter-engine:$jUnitVersion"
4245
testImplementation 'org.junit-pioneer:junit-pioneer:2.2.0'
43-
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$jUnitVersion"
4446
testRuntimeOnly 'org.junit.platform:junit-platform-launcher' // required when testing in Eclipse
4547
}
4648

@@ -96,21 +98,18 @@ dependencies {
9698

9799
gradlePlugin {
98100
plugins {
101+
website = 'https://github.com/java9-modularity/gradle-modules-plugin'
102+
vcsUrl = 'https://github.com/java9-modularity/gradle-modules-plugin'
99103
modulesPlugin {
100104
id = 'org.javamodularity.moduleplugin'
101105
displayName = 'Java Modularity Gradle Plugin'
102106
description = 'Plugin that makes it easy to work with the Java Platform Module System'
103107
implementationClass = 'org.javamodularity.moduleplugin.ModuleSystemPlugin'
108+
tags = ['java', 'modules', 'jpms', 'modularity']
104109
}
105110
}
106111
}
107112

108-
pluginBundle {
109-
website = 'https://github.com/java9-modularity/gradle-modules-plugin'
110-
vcsUrl = 'https://github.com/java9-modularity/gradle-modules-plugin'
111-
tags = ['java', 'modules', 'jpms', 'modularity']
112-
}
113-
114113
publishing { // used for publishing to local maven repository
115114
publications {
116115
pluginMaven(MavenPublication) {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-all.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists

src/main/java/org/javamodularity/moduleplugin/TestEngine.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,17 @@ public static Collection<TestEngine> selectMultiple(Project project, Set<File> f
104104

105105
}
106106

107+
private static Stream<GroupArtifact> getDirectDependencies(Configuration origCfg) {
108+
LOGGER.debug("Configuration {} cannot be resolved, using direct dependencies only", origCfg.getName());
109+
return origCfg.getDependencies().stream()
110+
.map(dep -> new GroupArtifact(dep.getGroup(), dep.getName()));
111+
}
112+
107113
private static Stream<GroupArtifact> getModuleIdentifiers(Configuration origCfg, Set<File> files) {
114+
if (!origCfg.isCanBeResolved()) {
115+
return getDirectDependencies(origCfg);
116+
}
117+
108118
Configuration cfg = origCfg.copyRecursive();
109119
cfg.setCanBeResolved(true);
110120
try {
@@ -116,9 +126,7 @@ private static Stream<GroupArtifact> getModuleIdentifiers(Configuration origCfg,
116126
.map(dep -> GroupArtifact.fromModuleIdentifier(dep.getModule().getId().getModule()));
117127
} catch (ResolveException e) {
118128
LOGGER.debug("Cannot resolve transitive dependencies of configuration " + cfg.getName(), e);
119-
LOGGER.info("Using direct dependencies of configuration {}.", origCfg.getName());
120-
return origCfg.getDependencies().stream()
121-
.map(dep -> new GroupArtifact(dep.getGroup(), dep.getName()));
129+
return getDirectDependencies(origCfg);
122130
}
123131
}
124132

src/main/java/org/javamodularity/moduleplugin/internal/CompileModuleInfoHelper.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@
22

33
import org.gradle.api.Project;
44
import org.gradle.api.Task;
5+
import org.gradle.api.artifacts.Dependency;
56
import org.gradle.api.artifacts.ProjectDependency;
67
import org.gradle.api.logging.Logger;
78
import org.gradle.api.logging.Logging;
9+
import org.gradle.api.tasks.TaskContainer;
810
import org.gradle.api.tasks.compile.JavaCompile;
11+
import org.gradle.util.GradleVersion;
912
import org.javamodularity.moduleplugin.extensions.CompileModuleOptions;
1013

1114
import java.util.Objects;
15+
import java.util.function.Function;
1216
import java.util.stream.Stream;
1317

1418
public final class CompileModuleInfoHelper {
@@ -32,10 +36,15 @@ public static void dependOnOtherCompileModuleInfoJavaTasks(JavaCompile javaCompi
3236
* @return a {@link Stream} of {@code compileModuleInfoJava} tasks from dependent projects
3337
*/
3438
private static Stream<Task> dependentCompileModuleInfoJavaTaskStream(Project project) {
39+
final Function<Dependency, TaskContainer> mapToTaskContainer = dependency ->
40+
GradleVersion.current().compareTo(GradleVersion.version("8.11")) < 0
41+
? ((ProjectDependency) dependency).getDependencyProject().getTasks()
42+
: project.project(((ProjectDependency) dependency).getPath()).getTasks();
43+
3544
return project.getConfigurations().stream()
3645
.flatMap(configuration -> configuration.getDependencies().stream())
3746
.filter(dependency -> dependency instanceof ProjectDependency)
38-
.map(dependency -> ((ProjectDependency) dependency).getDependencyProject().getTasks())
47+
.map(mapToTaskContainer)
3948
.map(tasks -> tasks.findByName(CompileModuleOptions.COMPILE_MODULE_INFO_TASK_NAME))
4049
.filter(Objects::nonNull)
4150
.filter(task -> task.getProject() != project);

src/main/java/org/javamodularity/moduleplugin/tasks/AbstractExecutionMutator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ abstract class AbstractExecutionMutator {
2424
protected final String getMainClassName() {
2525
if(GradleVersion.current().compareTo(GradleVersion.version("6.4")) < 0) {
2626
String mainClassName = Objects.requireNonNull(
27-
execTask.getMain(),
27+
execTask.getMainClass().getOrNull(),
2828
"Main class name not found. Try setting 'application.mainClassName' in your Gradle build file."
2929
);
3030
if (!mainClassName.contains("/")) {

src/main/java/org/javamodularity/moduleplugin/tasks/CompileModuleInfoTask.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public void execute(Task task) {
7171
// https://docs.gradle.org/6.1/javadoc/org/gradle/api/file/SourceDirectorySet.html#getClassesDirectory--
7272
classesDir = helper().mainSourceSet().getJava().getClassesDirectory().get().getAsFile();
7373
} else {
74-
classesDir = helper().mainSourceSet().getJava().getOutputDir();
74+
classesDir = helper().mainSourceSet().getJava().getDestinationDirectory().get().getAsFile();
7575
}
7676

7777
File mainModuleInfoFile = new File(classesDir, "module-info.class");

src/main/java/org/javamodularity/moduleplugin/tasks/ModularCreateStartScripts.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import org.gradle.api.GradleException;
44
import org.gradle.api.Project;
55
import org.gradle.api.plugins.ApplicationPluginConvention;
6+
import org.gradle.api.plugins.JavaApplication;
7+
import org.gradle.api.tasks.Input;
68
import org.gradle.api.tasks.Internal;
79
import org.gradle.api.tasks.application.CreateStartScripts;
810

@@ -22,22 +24,22 @@ public ModularCreateStartScripts() {
2224
setClasspath(getProject().files());
2325
}
2426

27+
@Input
2528
@Nullable
26-
@Override
2729
public String getMainClassName() {
2830
String main = changedMain;
2931
if(main == null) {
30-
main = super.getMainClassName();
32+
main = super.getMainClass().getOrNull();
3133
}
3234
if(main == null) {
3335
main = UNDEFINED_MAIN_CLASS_NAME;
3436
}
3537
return main;
3638
}
3739

38-
@Override
3940
public void setMainClassName(@Nullable String mainClassName) {
4041
changedMain = mainClassName;
42+
getMainClass().set(mainClassName);
4143
}
4244

4345
public ModularJavaExec getRunTask() {
@@ -59,10 +61,10 @@ private static void configureAfterEvaluate(Project project) {
5961
}
6062

6163
private static void configure(ModularCreateStartScripts startScriptsTask, Project project) {
62-
var appConvention = project.getConvention().findPlugin(ApplicationPluginConvention.class);
63-
if (appConvention != null) {
64-
var distDir = project.file(project.getBuildDir() + "/install/" + appConvention.getApplicationName());
65-
startScriptsTask.setOutputDir(new File(distDir, appConvention.getExecutableDir()));
64+
final var appExtension = project.getExtensions().findByType(JavaApplication.class);
65+
if (appExtension != null) {
66+
var distDir = project.file(project.getLayout().getBuildDirectory().get().getAsFile() + "/install/" + appExtension.getApplicationName());
67+
startScriptsTask.setOutputDir(new File(distDir, appExtension.getExecutableDir()));
6668
}
6769

6870
ModularJavaExec runTask = startScriptsTask.getRunTask();

src/main/java/org/javamodularity/moduleplugin/tasks/ModularJavaExec.java

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -65,22 +65,12 @@ public void setJvmArgs(Iterable<?> arguments) {
6565
}
6666

6767
@Input
68-
@Override
6968
public String getMain() {
70-
if(GradleVersion.current().compareTo(GradleVersion.version("6.4")) >= 0) {
71-
return stripModule(getMainClass().getOrNull());
72-
} else {
73-
return super.getMain();
74-
}
69+
return stripModule(getMainClass().getOrNull());
7570
}
7671

77-
@Override
7872
public JavaExec setMain(String mainClassName) {
79-
if(GradleVersion.current().compareTo(GradleVersion.version("6.4")) >= 0) {
80-
getMainClass().set(stripModule(mainClassName));
81-
} else {
82-
super.setMain(mainClassName);
83-
}
73+
getMainClass().set(stripModule(mainClassName));
8474
return this;
8575
}
8676

src/main/java/org/javamodularity/moduleplugin/tasks/StartScriptsMutator.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,9 @@ private void configureStartScriptsDoFirst(CreateStartScripts startScriptsTask) {
6868
startScriptsTask.setDefaultJvmOpts(jvmArgs);
6969
startScriptsTask.setClasspath(project.files());
7070

71-
if(GradleVersion.current().compareTo(GradleVersion.version("6.4")) < 0) {
72-
if (ModularCreateStartScripts.UNDEFINED_MAIN_CLASS_NAME.equals(startScriptsTask.getMainClassName())) {
73-
startScriptsTask.setMainClassName(execTask.getMain());
74-
}
71+
final var mainClass = startScriptsTask.getMainClass();
72+
if (ModularCreateStartScripts.UNDEFINED_MAIN_CLASS_NAME.equals(mainClass.getOrNull())) {
73+
mainClass.set(execTask.getMainClass());
7574
}
7675
}
7776

0 commit comments

Comments
 (0)