Skip to content

Commit 72c106d

Browse files
committed
write module CSV
1 parent f5d5dac commit 72c106d

File tree

3 files changed

+59
-11
lines changed

3 files changed

+59
-11
lines changed

README.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
[![Supported JVM Versions](https://img.shields.io/badge/JVM-22-brightgreen.svg?&logo=openjdk)](https://github.com/quarkusio/quarkus/actions/runs/113853915/)
1+
![Supported JVM Versions](https://img.shields.io/badge/JVM-22-brightgreen.svg?&logo=openjdk)
22
[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/avaje/avaje-inject/blob/master/LICENSE)
33

44
# Avaje Build Maven Plugin
@@ -20,15 +20,17 @@ This plugin uses the JDK 22 [Class-File API](https://openjdk.org/jeps/457). As t
2020
<executions>
2121
<execution>
2222
<goals>
23-
<goal>provides</goal>
24-
<goal>module-spi</goal>
23+
<!-- Will generate files that will disable avaje APT module-info spi validation -->
24+
<goal>provides</goal>
25+
<!-- Will transform a module-info after compilation -->
26+
<goal>aug-spi</goal>
2527
</goals>
2628
</execution>
2729
</executions>
2830
</plugin>
2931
```
3032

31-
## Example `Module-Info.class` transformation
33+
## Example `module-info.class` transformation
3234

3335
Given a module-info like:
3436

src/main/java/io/avaje/inject/mojo/AutoProvidesMojo.java

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
import org.apache.maven.plugins.annotations.ResolutionScope;
1414
import org.apache.maven.project.MavenProject;
1515

16+
import static java.util.stream.Collectors.joining;
17+
import static java.util.stream.Collectors.toList;
18+
1619
import java.io.File;
1720
import java.io.FileWriter;
1821
import java.io.IOException;
@@ -41,6 +44,8 @@ public class AutoProvidesMojo extends AbstractMojo {
4144
@Parameter(defaultValue = "${project}", readonly = true, required = true)
4245
private MavenProject project;
4346

47+
private final List<AvajeModule> modules = new ArrayList<>();
48+
4449
@Override
4550
public void execute() throws MojoExecutionException {
4651
final var listUrl = compileDependencies();
@@ -51,14 +56,16 @@ public void execute() throws MojoExecutionException {
5156
}
5257

5358
try (var newClassLoader = createClassLoader(listUrl);
54-
var f = createFileWriter("avaje-plugin-exists.txt");
59+
var flagFile = createFileWriter("avaje-plugin-exists.txt");
5560
var moduleWriter = createFileWriter("avaje-module-provides.txt");
56-
var pluginWriter = createFileWriter("avaje-plugin-provides.txt")) {
61+
var pluginWriter = createFileWriter("avaje-plugin-provides.txt");
62+
var moduleCSV = createFileWriter("avaje-module-dependencies.csv")) {
5763

58-
f.append(DISABLING_AVAJE_MODULE_VERIFICATION);
64+
flagFile.append(DISABLING_AVAJE_MODULE_VERIFICATION);
5965
getLog().info(DISABLING_AVAJE_MODULE_VERIFICATION);
6066
writeProvidedPlugins(newClassLoader, pluginWriter);
6167
writeProvidedModules(newClassLoader, moduleWriter);
68+
writeModuleCSV(moduleCSV);
6269

6370
} catch (final IOException e) {
6471
throw new MojoExecutionException("Failed to write spi classes", e);
@@ -117,17 +124,37 @@ private void writeProvidedModules(URLClassLoader newClassLoader, FileWriter modu
117124

118125
final Log log = getLog();
119126
for (final var module : ServiceLoader.load(Module.class, newClassLoader)) {
120-
log.info("Detected External Module: " + module.getClass().getCanonicalName());
121127

128+
final var name = module.getClass().getCanonicalName();
129+
log.info("Detected External Module: " + name);
130+
131+
final var provides = new ArrayList<String>();
122132
for (final Class<?> provide : module.provides()) {
123-
providedTypes.add(provide.getCanonicalName());
133+
var type = provide.getCanonicalName();
134+
providedTypes.add(type);
135+
provides.add(type);
124136
}
125137
for (final Class<?> provide : module.autoProvides()) {
126-
providedTypes.add(provide.getCanonicalName());
138+
var type = provide.getCanonicalName();
139+
providedTypes.add(type);
140+
provides.add(type);
127141
}
128142
for (final Class<?> provide : module.autoProvidesAspects()) {
129-
providedTypes.add(wrapAspect(provide.getCanonicalName()));
143+
var type = wrapAspect(provide.getCanonicalName());
144+
providedTypes.add(type);
145+
provides.add(type);
130146
}
147+
148+
final var requires =
149+
Arrays.stream(module.requires()).map(Class::getCanonicalName).collect(toList());
150+
151+
Arrays.stream(module.autoRequires()).map(Class::getCanonicalName).forEach(requires::add);
152+
Arrays.stream(module.requiresPackages()).map(Class::getCanonicalName).forEach(requires::add);
153+
Arrays.stream(module.autoRequiresAspects())
154+
.map(Class::getCanonicalName)
155+
.map(AutoProvidesMojo::wrapAspect)
156+
.forEach(requires::add);
157+
modules.add(new AvajeModule(name, provides, requires));
131158
}
132159

133160
for (final String providedType : providedTypes) {
@@ -136,6 +163,20 @@ private void writeProvidedModules(URLClassLoader newClassLoader, FileWriter modu
136163
}
137164
}
138165

166+
private void writeModuleCSV(FileWriter moduleWriter) throws IOException {
167+
moduleWriter.write("External Module Type|Provides|Requires");
168+
for (AvajeModule avajeModule : modules) {
169+
moduleWriter.write("\n");
170+
moduleWriter.write(avajeModule.name());
171+
moduleWriter.write("|");
172+
var provides = avajeModule.provides().stream().collect(joining(","));
173+
moduleWriter.write(provides.isEmpty() ? " " : provides);
174+
moduleWriter.write("|");
175+
var requires = avajeModule.requires().stream().collect(joining(","));
176+
moduleWriter.write(requires.isEmpty() ? " " : requires);
177+
}
178+
}
179+
139180
private static String wrapAspect(String aspect) {
140181
return "io.avaje.inject.aop.AspectProvider<" + aspect + ">";
141182
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package io.avaje.inject.mojo;
2+
3+
import java.util.List;
4+
5+
record AvajeModule(String name, List<String> provides, List<String> requires) {}

0 commit comments

Comments
 (0)