Skip to content

Commit 707c3a7

Browse files
koentsjesebersole
authored andcommitted
HHH-18644 - New and improved hibernate-maven-plugin
Signed-off-by: Koen Aers <koen.aers@gmail.com>
1 parent 817355f commit 707c3a7

File tree

17 files changed

+1586
-9
lines changed

17 files changed

+1586
-9
lines changed

local-build-plugins/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ dependencies {
3333
implementation "org.apache.maven:maven-compat:3.9.9"
3434
implementation "org.apache.maven.resolver:maven-resolver-connector-basic:1.9.18"
3535
implementation "org.apache.maven.resolver:maven-resolver-transport-http:1.9.18"
36+
implementation "org.slf4j:slf4j-simple:1.7.36"
3637
}
3738

3839
tasks.compileJava {

local-build-plugins/src/main/java/org/hibernate/build/maven/embedder/MavenEmbedderPlugin.java

Lines changed: 175 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
import org.gradle.api.tasks.SourceSetContainer;
1010
import org.gradle.api.tasks.TaskProvider;
1111

12+
import java.io.File;
13+
import java.util.ArrayList;
14+
import java.util.List;
15+
1216
/**
1317
* Plugin for integrating Maven Embedder into the Gradle build to execute
1418
* some Maven tasks/goals/mojos.
@@ -29,23 +33,43 @@ public void apply(Project project) {
2933
MavenEmbedderConfig.class
3034
);
3135

36+
final Provider<Directory> workingDirectory = project.getLayout().getBuildDirectory().dir("maven-embedder/workspace");
37+
3238
// add the MavenEmbedderService shared-build-service
3339
final Provider<MavenEmbedderService> embedderServiceProvider = sharedServices.registerIfAbsent(
3440
"maven-embedder",
3541
MavenEmbedderService.class, (spec) -> {
3642
spec.getParameters().getProjectVersion().set( project.getVersion().toString() );
37-
spec.getParameters().getWorkingDirectory().set( project.getLayout().getProjectDirectory() );
43+
spec.getParameters().getWorkingDirectory().set( workingDirectory );
3844
spec.getParameters().getMavenLocalDirectory().set( dsl.getLocalRepositoryDirectory() );
3945
}
4046
);
4147

48+
project.getTasks().register(
49+
"installHibernateCore",
50+
RunMavenTask.class,
51+
(task) -> {
52+
configureInstallHibernateCoreTask(
53+
configureInstallTask( configureRunMavenTask( task, embedderServiceProvider ) ) );
54+
});
55+
56+
project.getTasks().register(
57+
"installHibernateScanJandex",
58+
RunMavenTask.class,
59+
(task) -> {
60+
configureInstallHibernateScanJandexTask(
61+
configureInstallTask( configureRunMavenTask( task, embedderServiceProvider ) ));
62+
} );
63+
4264
// Via the plugin's POM, we tell Maven to generate the descriptors into
4365
// `target/generated/sources/plugin-descriptors/META-INF/maven`.
4466
// `META-INF/maven` is the relative path we need inside the jar, so we
4567
// configure the "resource directory" in Gradle to be just the
4668
// `target/generated/sources/plugin-descriptors` part.
4769
final Provider<Directory> descriptorsDir = project.getLayout().getBuildDirectory().dir( "generated/sources/plugin-descriptors" );
4870

71+
72+
4973
// create the "mirror" task which calls the appropriate Maven tasks/goals/mojos behind the scenes using the embedder service
5074
final TaskProvider<MavenPluginDescriptorTask> generatePluginDescriptorTask = project.getTasks().register( "generatePluginDescriptor", MavenPluginDescriptorTask.class, (task) -> {
5175
task.setGroup( "maven embedder" );
@@ -61,11 +85,160 @@ public void apply(Project project) {
6185
final SourceSet mainSourceSet = sourceSets.getByName( "main" );
6286
mainSourceSet.getResources().srcDir( task.getDescriptorDirectory() );
6387

88+
// the hibernate-core jar needs to be present in the local repository
6489
// we need compilation to happen before we generate the descriptors
65-
task.dependsOn( "compileJava" );
90+
task.dependsOn( "prepareWorkspace", "installHibernateCore", "installHibernateScanJandex");
6691
} );
6792

93+
project.getTasks().register(
94+
"createMavenWrapper",
95+
RunMavenTask.class,
96+
(task) -> {
97+
configuraCreateMavenWrapperTask(
98+
configureRunMavenTask( task, embedderServiceProvider ));
99+
} );
100+
101+
project.getTasks().register(
102+
"installHibernateMavenPlugin",
103+
RunMavenTask.class,
104+
(task) -> {
105+
configureInstallHibernateMavenPluginTask(
106+
configureInstallTask(
107+
configureRunMavenTask( task, embedderServiceProvider )));
108+
} );
109+
110+
project.getTasks().register(
111+
"integrationTest",
112+
RunMavenTask.class,
113+
(task) -> {
114+
configureIntegrationTestTask(
115+
configureRunMavenTask( task, embedderServiceProvider ));
116+
} );
117+
68118
// we need the descriptor generation to happen before we jar
69119
project.getTasks().named( "jar", (jarTask) -> jarTask.dependsOn( generatePluginDescriptorTask ) );
120+
project.getTasks().named( "check" , (checkTask) -> checkTask.dependsOn( "integrationTest", generatePluginDescriptorTask ) );
121+
}
122+
123+
private void configureInstallHibernateMavenPluginTask(RunMavenTask task) {
124+
List<String> arguments = new ArrayList<String>(task.getArguments().get());
125+
arguments.add("-Dfile=" + getHibernateMavenPluginArtifactFilePath( task.getProject() ));
126+
arguments.add("-DartifactId=hibernate-maven-plugin");
127+
arguments.add( "-DpomFile=" + getHibernateMavenPluginPomFilePath( task.getProject() ) );
128+
task.getArguments().set( arguments );
129+
task.dependsOn("jar", "generatePluginDescriptor");
130+
}
131+
132+
private void configureInstallHibernateCoreTask(RunMavenTask task) {
133+
List<String> arguments = new ArrayList<String>(task.getArguments().get());
134+
arguments.add("-Dfile=" + getHibernateCoreArtifactFilePath( task.getProject() ));
135+
arguments.add("-DartifactId=hibernate-core");
136+
arguments.add( "-DpomFile=" + getHibernateCorePomFilePath( task.getProject() ) );
137+
task.getArguments().set( arguments );
138+
task.dependsOn(":hibernate-core:generatePomFileForPublishedArtifactsPublication", ":hibernate-core:jar");
139+
}
140+
141+
private void configureInstallHibernateScanJandexTask(RunMavenTask task) {
142+
List<String> arguments = new ArrayList<String>(task.getArguments().get());
143+
arguments.add("-Dfile=" + getHibernateScanJandexArtifactFilePath( task.getProject() ));
144+
arguments.add("-DartifactId=hibernate-scan-jandex");
145+
task.getArguments().set( arguments );
146+
task.dependsOn(":hibernate-scan-jandex:jar");
147+
}
148+
149+
private void configureIntegrationTestTask(RunMavenTask task) {
150+
task.getGoals().set( "invoker:run" );
151+
task.dependsOn("createMavenWrapper", "installHibernateMavenPlugin");
152+
}
153+
154+
private void configuraCreateMavenWrapperTask(RunMavenTask task) {
155+
task.getGoals().set("wrapper:wrapper");
156+
task.getArguments().set( List.of("-f" + getIntegrationTestFolderPath( task.getProject() ) ));
157+
task.dependsOn( "prepareWorkspace" );
158+
}
159+
160+
private String getHibernateMavenPluginPomFilePath(Project project) {
161+
return project
162+
.getLayout()
163+
.getBuildDirectory()
164+
.file( "publications/publishedArtifacts/pom-default.xml")
165+
.get()
166+
.getAsFile()
167+
.getAbsolutePath();
70168
}
169+
170+
private String getHibernateMavenPluginArtifactFilePath(Project project) {
171+
final String artifactName = "hibernate-maven-plugin-" + project.getVersion() + ".jar";
172+
final File libsFolder = project.getLayout().getBuildDirectory().dir("libs" ).get().getAsFile();
173+
return new File(libsFolder, artifactName).getAbsolutePath();
174+
}
175+
176+
private RunMavenTask configureRunMavenTask(
177+
RunMavenTask task,
178+
Provider<MavenEmbedderService> embedderServiceProvider) {
179+
task.setGroup( "maven embedder" );
180+
task.getMavenEmbedderService().set( embedderServiceProvider );
181+
task.usesService( embedderServiceProvider );
182+
return task;
183+
}
184+
185+
private Directory getWorkingDirectory(Project project) {
186+
return project.getLayout().getBuildDirectory().dir("maven-embedder/workspace").get();
187+
}
188+
189+
private String getIntegrationTestFolderPath(Project project) {
190+
return getWorkingDirectory( project).dir( "src/it/enhance" ).getAsFile().getAbsolutePath();
191+
}
192+
193+
private RunMavenTask configureInstallTask(RunMavenTask task) {
194+
task.getGoals().set( "install:install-file" );
195+
ArrayList<String> arguments = new ArrayList<String>();
196+
arguments.add("-DgroupId=" + task.getProject().getGroup().toString());
197+
arguments.add("-Dversion=" + task.getProject().getVersion());
198+
arguments.add("-Dpackaging=jar");
199+
task.getArguments().set( arguments );
200+
return task;
201+
}
202+
203+
private String getHibernateCoreArtifactFilePath(Project project) {
204+
final String artifactName = "hibernate-core-" + project.getVersion() + ".jar";
205+
final File hibernateCoreLibsFolder = getHibernateCoreBuildDirectory( project )
206+
.dir( "libs" )
207+
.getAsFile();
208+
return new File(hibernateCoreLibsFolder, artifactName).getAbsolutePath();
209+
}
210+
211+
private String getHibernateCorePomFilePath(Project project) {
212+
return getHibernateCoreBuildDirectory( project )
213+
.file( "publications/publishedArtifacts/pom-default.xml" )
214+
.getAsFile()
215+
.getAbsolutePath();
216+
}
217+
218+
private String getHibernateScanJandexArtifactFilePath(Project project) {
219+
final String artifactName = "hibernate-scan-jandex-" + project.getVersion() + ".jar";
220+
final File hibernateScanJandexLibsFolder = getHibernateScanJandexBuildDirectory( project )
221+
.dir( "libs" )
222+
.getAsFile();
223+
return new File(hibernateScanJandexLibsFolder, artifactName).getAbsolutePath();
224+
}
225+
226+
private Directory getHibernateCoreBuildDirectory(Project project) {
227+
return project
228+
.getRootProject()
229+
.project( "hibernate-core" )
230+
.getLayout()
231+
.getBuildDirectory()
232+
.get();
233+
}
234+
235+
private Directory getHibernateScanJandexBuildDirectory(Project project) {
236+
return project
237+
.getRootProject()
238+
.project( "hibernate-scan-jandex" )
239+
.getLayout()
240+
.getBuildDirectory()
241+
.get();
242+
}
243+
71244
}

local-build-plugins/src/main/java/org/hibernate/build/maven/embedder/MavenEmbedderService.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.hibernate.build.maven.embedder;
22

33
import org.apache.maven.cli.MavenCli;
4+
import org.gradle.api.GradleException;
45
import org.gradle.api.file.Directory;
56
import org.gradle.api.file.DirectoryProperty;
67
import org.gradle.api.provider.Property;
@@ -37,7 +38,7 @@ public void execute(String... tasksAndArgs) {
3738
Collections.addAll( cml, tasksAndArgs );
3839

3940
final Directory mavenLocalDirectory = getParameters().getMavenLocalDirectory().get();
40-
cml.add( "-Dmaven.repo.local=\"" + mavenLocalDirectory.getAsFile().getAbsolutePath() + "\"" );
41+
cml.add( "-Dmaven.repo.local=" + mavenLocalDirectory.getAsFile().getAbsolutePath() );
4142
cml.add( "-Dorm.project.version=" + getParameters().getProjectVersion().get() );
4243

4344
final Directory workingDirectory = getParameters().getWorkingDirectory().get();
@@ -46,6 +47,12 @@ public void execute(String... tasksAndArgs) {
4647
// todo : consider bridging Maven out/err to Gradle logging
4748

4849
final int resultCode = embedder.doMain( cml.toArray(new String[0]), workingDirectoryPath, System.out, System.err );
49-
// todo : do something with result-code
50+
if (resultCode != 0) {
51+
StringBuilder sb = new StringBuilder();
52+
for (String s : tasksAndArgs) {
53+
sb.append( s );
54+
}
55+
throw new GradleException("Maven execution has failed: " + sb);
56+
}
5057
}
5158
}

local-build-plugins/src/main/java/org/hibernate/build/maven/embedder/MavenPluginDescriptorTask.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,11 @@ public MavenPluginDescriptorTask() {
2828

2929
@TaskAction
3030
public void generateDescriptor() {
31+
performDescriptorGeneration();
32+
}
33+
34+
private void performDescriptorGeneration() {
3135
getMavenEmbedderService().get().execute( "plugin:descriptor" );
32-
// todo : anything else? e.g.
33-
//getMavenEmbedderService().get().execute( "plugin:addPluginArtifactMetadata" );
34-
//getMavenEmbedderService().get().execute( "plugin:helpmojo" );
3536
}
37+
3638
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.hibernate.build.maven.embedder;
2+
3+
import org.gradle.api.DefaultTask;
4+
import org.gradle.api.provider.ListProperty;
5+
import org.gradle.api.provider.Property;
6+
import org.gradle.api.services.ServiceReference;
7+
import org.gradle.api.tasks.Input;
8+
import org.gradle.api.tasks.TaskAction;
9+
10+
import java.util.ArrayList;
11+
import java.util.List;
12+
13+
public abstract class RunMavenTask extends DefaultTask {
14+
15+
@ServiceReference
16+
abstract Property<MavenEmbedderService> getMavenEmbedderService();
17+
18+
@Input
19+
abstract Property<String> getGoals();
20+
21+
@Input
22+
abstract ListProperty<String> getArguments();
23+
24+
@TaskAction
25+
public void run() {
26+
getMavenEmbedderService().get().execute( constructTaskAndArgs() );
27+
}
28+
29+
private String[] constructTaskAndArgs() {
30+
List<String> args = new ArrayList<String>();
31+
args.add( getGoals().get() );
32+
args.addAll( getArguments().get() );
33+
return args.toArray(new String[0]);
34+
}
35+
36+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.hibernate.build.maven.embedder.logging;
2+
3+
import org.apache.maven.cli.logging.impl.Slf4jSimpleConfiguration;
4+
import org.slf4j.LoggerFactory;
5+
import org.slf4j.impl.MavenSlf4jSimpleFriend;
6+
7+
import java.lang.reflect.InvocationTargetException;
8+
import java.lang.reflect.Method;
9+
10+
public class Slf4jConfiguration extends Slf4jSimpleConfiguration {
11+
@Override
12+
public void activate() {
13+
resetLoggerFactory();
14+
initMavenSlf4jSimpleFriend();
15+
}
16+
17+
private void resetLoggerFactory() {
18+
try {
19+
Method m = LoggerFactory.class.getDeclaredMethod("reset", new Class[]{});
20+
m.setAccessible(true);
21+
m.invoke(null);
22+
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | InvocationTargetException e) {
23+
throw new RuntimeException(e);
24+
}
25+
}
26+
27+
private void initMavenSlf4jSimpleFriend() {
28+
MavenSlf4jSimpleFriend.init();
29+
}
30+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
org.gradle.internal.logging.slf4j.OutputEventListenerBackedLoggerContext org.hibernate.build.maven.embedder.logging.Slf4jConfiguration

0 commit comments

Comments
 (0)