improved lombok plugin to support JPMS

This commit is contained in:
2023-07-16 22:39:46 +08:00
parent 34810e9263
commit c8222ca9aa
5 changed files with 126 additions and 92 deletions

View File

@@ -1,8 +1,8 @@
woggioniMavenRepositoryUrl=https://mvn.woggioni.net/
lys.catalog.version=2023.07.08
lys.catalog.version=2023.07.16
version.myGradlePlugins=2023.07.09
version.myGradlePlugins=2023.07.16
version.gradle=7.6
version.felix.config.admin=1.9.26
version.felix=7.0.5

View File

@@ -1,8 +1,18 @@
package net.woggioni.gradle.lombok;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.file.FileCollection;
import org.gradle.api.file.RegularFileProperty;
import org.gradle.api.file.SourceDirectorySet;
import org.gradle.api.provider.Property;
import org.gradle.api.provider.Provider;
import org.gradle.api.tasks.InputFiles;
import org.gradle.api.tasks.Internal;
import org.gradle.api.tasks.JavaExec;
import org.gradle.api.tasks.OutputDirectory;
import org.gradle.api.tasks.SourceSet;
import org.gradle.internal.jvm.JavaModuleDetector;
import javax.inject.Inject;
import java.io.File;
@@ -10,12 +20,10 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Delombok extends JavaExec {
@Getter
@OutputDirectory
private final File outputDir;
@RequiredArgsConstructor(onConstructor_ = {@Inject})
public abstract class Delombok extends JavaExec {
private final JavaModuleDetector javaModuleDetector;
private static String buildClasspathString(Iterable<File> classpath) {
StringBuilder sb = new StringBuilder();
Iterator<File> it = classpath.iterator();
@@ -33,19 +41,56 @@ public class Delombok extends JavaExec {
return sb.toString();
}
@Inject
public Delombok(File lombokJar, File outputDir, Iterable<File> sourceDirs, String classpath) {
this.outputDir = outputDir;
classpath(lombokJar);
@InputFiles
public Provider<FileCollection> getSourceClasspath() {
return getSourceSet()
.map(SourceSet::getCompileClasspath);
}
@Internal
abstract public Property<SourceSet> getSourceSet();
@Internal
abstract public Property<Configuration> getLombokJar();
@Internal
abstract public Property<Boolean> getInferModulePath();
@OutputDirectory
abstract public RegularFileProperty getOutputDir();
@InputFiles
public Provider<FileCollection> getInputFiles() {
return getSourceSet()
.map(SourceSet::getAllSource)
.map(SourceDirectorySet::getSourceDirectories)
.zip(getLombokJar(), FileCollection::plus);
}
@Override
public void exec() {
classpath(getLombokJar());
List<String> args = new ArrayList<>();
args.add("delombok");
args.add("-d");
args.add(outputDir.getPath());
args.add("-c");
args.add(classpath);
for(File sourceDir : sourceDirs) args.add(sourceDir.getPath());
args.add(getOutputDir().getAsFile().get().getPath());
SourceSet sourceSet = getSourceSet().get();
Boolean inferModulePath = getInferModulePath().get();
FileCollection classpath = javaModuleDetector.inferClasspath(inferModulePath, sourceSet.getCompileClasspath());
if(!classpath.isEmpty()) {
args.add("-c");
args.add(classpath.getAsPath());
}
if(inferModulePath) {
FileCollection modulepath = javaModuleDetector.inferModulePath(true, sourceSet.getCompileClasspath());
if(!modulepath.isEmpty()) {
args.add("--module-path");
args.add(modulepath.getAsPath());
}
}
for(File sourceDir : sourceSet.getJava().getSrcDirs()) {
args.add(sourceDir.getPath());
}
Object[] argsArray = new String[args.size()];
args.toArray(argsArray);
args(argsArray);
super.exec();
}
}

View File

@@ -1,13 +1,7 @@
package net.woggioni.gradle.lombok;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.gradle.api.provider.Property;
import javax.inject.Inject;
@RequiredArgsConstructor(onConstructor_ = { @Inject })
public class LombokExtension {
@Getter
private final Property<String> version;
abstract public class LombokExtension {
abstract public Property<String> getVersion();
}

View File

@@ -7,6 +7,7 @@ import org.gradle.api.Task;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.dsl.DependencyHandler;
import org.gradle.api.model.ObjectFactory;
import org.gradle.api.plugins.ExtraPropertiesExtension;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.plugins.JavaPluginExtension;
import org.gradle.api.provider.Provider;
@@ -28,76 +29,71 @@ public class LombokPlugin implements Plugin<Project> {
public void apply(Project project) {
project.getPluginManager().apply(JavaPlugin.class);
ObjectFactory objectFactory = project.getObjects();
LombokExtension ext = project.getExtensions()
.create("lombok", LombokExtension.class,
objectFactory.property(String.class)
.convention(project.provider(
() -> (String) project.getExtensions().getExtraProperties().get("version.lombok")))
);
project.afterEvaluate(p -> {
SourceSetContainer sourceSetContainer = project.getExtensions().findByType(JavaPluginExtension.class).getSourceSets();
Provider<Map<String, String>> dependencyNotationProvider = project.provider(() -> {
Map<String, String> m = new HashMap<>();
m.put("group", "org.projectlombok");
m.put("name", "lombok");
m.put("version", ext.getVersion().get());
return Collections.unmodifiableMap(m);
});
Configuration lombokConfiguration = project.getConfigurations().create("lombok");
project.getDependencies().addProvider(
lombokConfiguration.getName(),
LombokExtension ext = project.getExtensions().create("lombok", LombokExtension.class);
ExtraPropertiesExtension epe = project.getExtensions().getExtraProperties();
if(epe.has("version.lombok")) {
ext.getVersion().convention(
project.provider(() -> (String) epe.get("version.lombok"))
);
}
JavaPluginExtension javaPluginExtension = project.getExtensions().findByType(JavaPluginExtension.class);
SourceSetContainer sourceSetContainer = javaPluginExtension.getSourceSets();
Provider<Map<String, String>> dependencyNotationProvider = ext.getVersion().map((String version) -> {
Map<String, String> m = new HashMap<>();
m.put("group", "org.projectlombok");
m.put("name", "lombok");
m.put("version", version);
return Collections.unmodifiableMap(m);
});
Configuration lombokConfiguration = project.getConfigurations().create("lombok");
project.getDependencies().addProvider(
lombokConfiguration.getName(),
dependencyNotationProvider,
externalModuleDependency -> {
}
);
for (SourceSet ss : sourceSetContainer) {
DependencyHandler dependencyHandler = project.getDependencies();
dependencyHandler.addProvider(
ss.getCompileOnlyConfigurationName(),
dependencyNotationProvider,
externalModuleDependency -> {
}
);
for (SourceSet ss : sourceSetContainer) {
DependencyHandler dependencyHandler = project.getDependencies();
dependencyHandler.addProvider(
ss.getCompileOnlyConfigurationName(),
dependencyNotationProvider,
externalModuleDependency -> {
});
dependencyHandler.addProvider(
ss.getAnnotationProcessorConfigurationName(),
dependencyNotationProvider,
externalModuleDependency -> {
});
TaskContainer tasks = project.getTasks();
String javadocTaskName = ss.getJavadocTaskName();
Task javadocTask = tasks.findByName(javadocTaskName);
if(javadocTask != null) {
String delombokTaskName = "delombok" + ss.getName().substring(0, 1).toUpperCase() + ss.getName().substring(1);
File outputDir = new File(new File(project.getBuildDir(), "delombok"), ss.getName());
Javadoc javadoc = (Javadoc) javadocTask;
TaskProvider<Delombok> delombokTaskProvider = tasks.register(delombokTaskName,
Delombok.class,
lombokConfiguration.getSingleFile(),
outputDir,
ss.getJava().getSrcDirs(),
ss.getCompileClasspath().getAsPath()
);
delombokTaskProvider.configure(delombokTask -> {
delombokTask.getInputs().files(ss.getAllSource().getSourceDirectories());
});
javadoc.setSource(outputDir);
javadoc.getInputs().files(delombokTaskProvider);
dependencyHandler.addProvider(
ss.getAnnotationProcessorConfigurationName(),
dependencyNotationProvider,
externalModuleDependency -> {
});
TaskContainer tasks = project.getTasks();
String javadocTaskName = ss.getJavadocTaskName();
Task javadocTask = tasks.findByName(javadocTaskName);
if(javadocTask != null) {
String delombokTaskName = "delombok" + ss.getName().substring(0, 1).toUpperCase() + ss.getName().substring(1);
File outputDir = new File(new File(project.getBuildDir(), "delombok"), ss.getName());
Javadoc javadoc = (Javadoc) javadocTask;
TaskProvider<Delombok> delombokTaskProvider = tasks.register(delombokTaskName, Delombok.class, (delombok -> {
delombok.getSourceSet().set(ss);
delombok.getOutputDir().set(outputDir);
delombok.getLombokJar().set(lombokConfiguration);
delombok.getInferModulePath().set(javaPluginExtension.getModularity().getInferModulePath());
}));
javadoc.setSource(outputDir);
javadoc.getInputs().files(delombokTaskProvider);
}
}
JavaToolchainSpec toolchain = javaPluginExtension.getToolchain();
if(toolchain.getLanguageVersion().isPresent()) {
project.afterEvaluate((Project pro) -> {
if(toolchain.getLanguageVersion().get().asInt() >= 16) {
pro.getTasks().withType(JavaCompile.class, t -> {
t.getOptions().getForkOptions().getJvmArgs().add("--illegal-access=permit");
});
}
}
JavaPluginExtension javaPluginExtension = project.getExtensions().findByType(JavaPluginExtension.class);
JavaToolchainSpec toolchain = javaPluginExtension.getToolchain();
if(toolchain.getLanguageVersion().isPresent()) {
project.afterEvaluate((Project pro) -> {
if(toolchain.getLanguageVersion().get().asInt() >= 16) {
pro.getTasks().withType(JavaCompile.class, t -> {
t.getOptions().getForkOptions().getJvmArgs().add("--illegal-access=permit");
});
}
});
} else if(JavaVersion.current().compareTo(JavaVersion.VERSION_16) >= 0) {
project.getTasks().withType(JavaCompile.class, t -> {
t.getOptions().getForkOptions().getJvmArgs().add("--illegal-access=permit");
});
}
});
});
} else if(JavaVersion.current().compareTo(JavaVersion.VERSION_16) >= 0) {
project.getTasks().withType(JavaCompile.class, t -> {
t.getOptions().getForkOptions().getJvmArgs().add("--illegal-access=permit");
});
}
}
}

View File

@@ -10,7 +10,6 @@ dependencyResolutionManagement {
versionCatalogs {
catalog {
from group: 'com.lys', name: 'lys-catalog', version: getProperty('lys.catalog.version')
version("slf4j", "1.7.36")
}
}
}