Skip to content

Commit af1325b

Browse files
committed
HHH-18644 - New and improved hibernate-maven-plugin
- Add MavenInstallTask to install artifacts in local repo - Add MavenInvokerRunTask to run the integration tests - Integrate both tasks in MavenEmbedderPlugin - Add the hibernate-maven-plugin implementation Signed-off-by: Koen Aers <[email protected]>
1 parent 3e0568a commit af1325b

File tree

15 files changed

+1482
-3
lines changed

15 files changed

+1482
-3
lines changed

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

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import org.gradle.api.tasks.SourceSetContainer;
1010
import org.gradle.api.tasks.TaskProvider;
1111

12+
import java.io.File;
13+
1214
/**
1315
* Plugin for integrating Maven Embedder into the Gradle build to execute
1416
* some Maven tasks/goals/mojos.
@@ -39,13 +41,26 @@ public void apply(Project project) {
3941
}
4042
);
4143

44+
final Project coreProject = project.getRootProject().project( "hibernate-core" );
45+
final Provider<Directory> hibernateCoreLibsFolder = coreProject.getLayout().getBuildDirectory().dir("libs");
46+
47+
final TaskProvider<MavenInstallArtifactTask> installHibernateCoreTask = project.getTasks().register( "installHibernateCore", MavenInstallArtifactTask.class, (task) -> {
48+
task.setGroup( "maven embedder" );
49+
task.getMavenEmbedderService().set( embedderServiceProvider );
50+
task.usesService( embedderServiceProvider );
51+
task.artifactId = "hibernate-core";
52+
task.getArtifactFolder().set( hibernateCoreLibsFolder );
53+
} );
54+
4255
// Via the plugin's POM, we tell Maven to generate the descriptors into
4356
// `target/generated/sources/plugin-descriptors/META-INF/maven`.
4457
// `META-INF/maven` is the relative path we need inside the jar, so we
4558
// configure the "resource directory" in Gradle to be just the
4659
// `target/generated/sources/plugin-descriptors` part.
4760
final Provider<Directory> descriptorsDir = project.getLayout().getBuildDirectory().dir( "generated/sources/plugin-descriptors" );
4861

62+
63+
4964
// create the "mirror" task which calls the appropriate Maven tasks/goals/mojos behind the scenes using the embedder service
5065
final TaskProvider<MavenPluginDescriptorTask> generatePluginDescriptorTask = project.getTasks().register( "generatePluginDescriptor", MavenPluginDescriptorTask.class, (task) -> {
5166
task.setGroup( "maven embedder" );
@@ -61,11 +76,38 @@ public void apply(Project project) {
6176
final SourceSet mainSourceSet = sourceSets.getByName( "main" );
6277
mainSourceSet.getResources().srcDir( task.getDescriptorDirectory() );
6378

79+
// the hibernate-core jar needs to be present in the local repository
6480
// we need compilation to happen before we generate the descriptors
65-
task.dependsOn( "compileJava" );
81+
task.dependsOn("installHibernateCore", "compileJava" );
82+
83+
} );
84+
85+
final Provider<Directory> mavenPluginLibsFolder = project.getLayout().getBuildDirectory().dir("libs");
86+
87+
final TaskProvider<MavenInstallArtifactTask> installMavenPluginTask = project.getTasks().register("installMavenPlugin", MavenInstallArtifactTask.class, (task) -> {
88+
task.setGroup( "maven embedder" );
89+
90+
task.getMavenEmbedderService().set( embedderServiceProvider );
91+
task.usesService( embedderServiceProvider );
92+
93+
task.artifactId = "hibernate-maven-plugin";
94+
task.getArtifactFolder().set( mavenPluginLibsFolder );
95+
96+
task.dependsOn( "jar" );
97+
});
98+
99+
final TaskProvider<MavenInvokerRunTask> integrationTestTask = project.getTasks().register( "integrationTest", MavenInvokerRunTask.class, (task) -> {
100+
task.setGroup( "maven embedder" );
101+
102+
task.getMavenEmbedderService().set( embedderServiceProvider );
103+
task.usesService( embedderServiceProvider );
104+
105+
task.dependsOn("installMavenPlugin");
106+
66107
} );
67108

68109
// we need the descriptor generation to happen before we jar
69110
project.getTasks().named( "jar", (jarTask) -> jarTask.dependsOn( generatePluginDescriptorTask ) );
111+
project.getTasks().named( "check" , (checkTask) -> checkTask.dependsOn( integrationTestTask ) );
70112
}
71113
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public void execute(String... tasksAndArgs) {
3737
Collections.addAll( cml, tasksAndArgs );
3838

3939
final Directory mavenLocalDirectory = getParameters().getMavenLocalDirectory().get();
40-
cml.add( "-Dmaven.repo.local=\"" + mavenLocalDirectory.getAsFile().getAbsolutePath() + "\"" );
40+
cml.add( "-Dmaven.repo.local=" + mavenLocalDirectory.getAsFile().getAbsolutePath() );
4141
cml.add( "-Dorm.project.version=" + getParameters().getProjectVersion().get() );
4242

4343
final Directory workingDirectory = getParameters().getWorkingDirectory().get();
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package org.hibernate.build.maven.embedder;
2+
3+
import org.gradle.api.DefaultTask;
4+
import org.gradle.api.Project;
5+
import org.gradle.api.file.DirectoryProperty;
6+
import org.gradle.api.provider.Property;
7+
import org.gradle.api.services.ServiceReference;
8+
import org.gradle.api.tasks.Input;
9+
import org.gradle.api.tasks.InputDirectory;
10+
import org.gradle.api.tasks.InputFile;
11+
import org.gradle.api.tasks.TaskAction;
12+
13+
import java.io.File;
14+
import java.util.ArrayList;
15+
16+
public abstract class MavenInstallArtifactTask extends DefaultTask {
17+
18+
@ServiceReference
19+
abstract Property<MavenEmbedderService> getMavenEmbedderService();
20+
21+
String artifactId;
22+
23+
@InputDirectory
24+
abstract DirectoryProperty getArtifactFolder();
25+
26+
@TaskAction
27+
public void installArtifact() {
28+
getMavenEmbedderService().get().execute( constructTaskAndArgs() );
29+
}
30+
31+
private String[] constructTaskAndArgs() {
32+
ArrayList<String> taskAndArgs = new ArrayList<String>();
33+
taskAndArgs.add("install:install-file");
34+
taskAndArgs.add("-DgroupId=" + getGroupId());
35+
taskAndArgs.add("-Dversion=" + getProjectVersion());
36+
taskAndArgs.add("-Dpackaging=jar");
37+
taskAndArgs.add("-DlocalRepositoryPath=" + getPathToLocalRepository());
38+
taskAndArgs.add("-Dfile=" + getPathToArtifact());
39+
taskAndArgs.add("-DartifactId=" + artifactId);
40+
return taskAndArgs.toArray(new String[0]);
41+
}
42+
43+
private String getPathToArtifact() {
44+
File artifactFolder = getArtifactFolder().getAsFile().get();
45+
File artifactFile = new File(artifactFolder, getArtifactName());
46+
return artifactFile.getAbsolutePath();
47+
}
48+
49+
private String getPathToLocalRepository() {
50+
return getMavenEmbedderService()
51+
.get()
52+
.getParameters()
53+
.getMavenLocalDirectory()
54+
.getAsFile()
55+
.get()
56+
.getAbsolutePath();
57+
}
58+
59+
private String getProjectVersion() {
60+
return getMavenEmbedderService().get().getParameters().getProjectVersion().get();
61+
}
62+
63+
private String getArtifactName() {
64+
return artifactId + "-" + getProjectVersion() + ".jar";
65+
}
66+
67+
private String getGroupId() {
68+
return getProject().getGroup().toString();
69+
}
70+
71+
}
72+
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.hibernate.build.maven.embedder;
2+
3+
import org.gradle.api.DefaultTask;
4+
import org.gradle.api.provider.Property;
5+
import org.gradle.api.services.ServiceReference;
6+
import org.gradle.api.tasks.TaskAction;
7+
8+
import java.util.ArrayList;
9+
10+
public abstract class MavenInvokerRunTask extends DefaultTask {
11+
12+
@ServiceReference
13+
abstract Property<MavenEmbedderService> getMavenEmbedderService();
14+
15+
@TaskAction
16+
public void runInvoker() {
17+
getMavenEmbedderService().get().execute( "invoker:integration-test");
18+
}
19+
20+
}

tooling/hibernate-maven-plugin/hibernate-maven-plugin.gradle

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,6 @@ dependencies {
1616
implementation "org.apache.maven:maven-plugin-api:3.6.3"
1717
implementation "org.apache.maven.plugin-tools:maven-plugin-annotations:3.6.0"
1818
implementation "org.apache.maven:maven-project:2.2.1"
19-
}
19+
implementation "org.apache.maven.shared:file-management:3.1.0"
20+
}
21+
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0"
2+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4+
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<packaging>maven-plugin</packaging>
8+
9+
<!--
10+
#################################################################
11+
Much of this descriptor is duplicative with the Gradle project,
12+
and/or could very easily be generated from the Gradle project.
13+
#################################################################
14+
-->
15+
16+
<properties>
17+
<project.group>org.hibernate.orm</project.group>
18+
<project.artifact>hibernate-maven-plugin</project.artifact>
19+
<project.version>7.0.0-SNAPSHOT</project.version>
20+
<project.name>Hibernate ORM Maven Plugin</project.name>
21+
<project.url>http://hibernate.org</project.url>
22+
<descriptors.dir>target/generated/sources/plugin-descriptors/META-INF/maven</descriptors.dir>
23+
</properties>
24+
25+
<groupId>org.hibernate.orm</groupId>
26+
<artifactId>hibernate-maven-plugin</artifactId>
27+
<version>7.0.0-SNAPSHOT</version>
28+
<name>Hibernate ORM Maven Plugin</name>
29+
<url>http://hibernate.org</url>
30+
31+
<!-- <groupId>${project.group}</groupId>
32+
<artifactId>${project.artifact}</artifactId>
33+
<version>${project.version}</version>
34+
<name>${project.name}</name>
35+
<url>${project.url}</url> -->
36+
37+
<build>
38+
<plugins>
39+
<plugin>
40+
<groupId>org.apache.maven.plugins</groupId>
41+
<artifactId>maven-plugin-plugin</artifactId>
42+
<version>3.15.0</version>
43+
<configuration>
44+
<goalPrefix>plugin</goalPrefix>
45+
<outputDirectory>${descriptors.dir}</outputDirectory>
46+
</configuration>
47+
</plugin>
48+
<plugin>
49+
<groupId>org.apache.maven.plugins</groupId>
50+
<artifactId>maven-invoker-plugin</artifactId>
51+
<version>3.8.0</version>
52+
<configuration>
53+
<debug>true</debug>
54+
<cloneProjectsTo>${project.build.directory}/maven-embedder/it</cloneProjectsTo>
55+
<localRepositoryPath>${project.build.directory}/maven-embedder/maven-local</localRepositoryPath>
56+
<!-- <postBuildHookScript>verify</postBuildHookScript> -->
57+
</configuration>
58+
</plugin>
59+
</plugins>
60+
</build>
61+
62+
<dependencies>
63+
<dependency>
64+
<groupId>org.hibernate.orm</groupId>
65+
<artifactId>hibernate-core</artifactId>
66+
<version>${project.version}</version>
67+
</dependency>
68+
<dependency>
69+
<groupId>org.apache.maven</groupId>
70+
<artifactId>maven-plugin-api</artifactId>
71+
<version>3.6.3</version>
72+
<scope>provided</scope>
73+
</dependency>
74+
<dependency>
75+
<groupId>org.apache.maven.plugin-tools</groupId>
76+
<artifactId>maven-plugin-annotations</artifactId>
77+
<version>3.6.0</version>
78+
<scope>provided</scope>
79+
</dependency>
80+
<dependency>
81+
<groupId>org.apache.maven</groupId>
82+
<artifactId>maven-project</artifactId>
83+
<version>2.2.1</version>
84+
<scope>provided</scope>
85+
</dependency>
86+
<dependency>
87+
<groupId>org.apache.maven.shared</groupId>
88+
<artifactId>file-management</artifactId>
89+
<version>3.1.0</version>
90+
</dependency>
91+
</dependencies>
92+
93+
</project>
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import java.io.File;
2+
import java.io.FileNotFoundException;
3+
import java.nio.file.Files;
4+
import java.util.List;
5+
import java.util.ArrayList;
6+
7+
8+
File targetFolder = new File(basedir, "target");
9+
if (!targetFolder.exists()) {
10+
throw new FileNotFoundException("Folder should exist: " + targetFolder);
11+
}
12+
if (targetFolder.isFile()) {
13+
throw new FileNotFoundException("Folder should be a folder: " + targetFolder);
14+
}
15+
File classesFolder = new File(targetFolder, "classes");
16+
if (!classesFolder.exists()) {
17+
throw new FileNotFoundException("Folder should exist: " + classesFolder);
18+
}
19+
File barClassFile = new File(classesFolder, "org/foo/Bar.class");
20+
if (!barClassFile.exists()) {
21+
throw new FileNotFoundException("File should exist: " + barClassFile);
22+
}
23+
int amountOfBytes = Files.readAllBytes(barClassFile.toPath()).length;
24+
25+
File fooClassFile = new File(classesFolder, "org/foo/Foo.class");
26+
if (!fooClassFile.exists()) {
27+
throw new FileNotFoundException("File should exist: " + fooClassFile);
28+
}
29+
30+
File bazClassFile = new File(classesFolder, "org/foo/Baz.class");
31+
if (!bazClassFile.exists()) {
32+
throw new FileNotFoundException("File should exist: " + bazClassFile);
33+
}
34+
35+
File buildLog = new File(basedir, "build.log");
36+
if (!buildLog.exists()) {
37+
throw new FileNotFoundException("File should exist: " + buildLog);
38+
}
39+
List<String> listOfStrings = new ArrayList<String>();
40+
listOfStrings = Files.readAllLines(buildLog.toPath());
41+
assert listOfStrings.contains("[DEBUG] Configuring mojo execution 'org.hibernate.orm:hibernate-maven-plugin:0.0.1-SNAPSHOT:enhance:enhance' with basic configurator -->");
42+
assert listOfStrings.contains("[DEBUG] (f) classesDirectory = " + classesFolder);
43+
assert listOfStrings.contains("[DEBUG] (f) enableAssociationManagement = false");
44+
assert listOfStrings.contains("[DEBUG] (f) enableDirtyTracking = false");
45+
assert listOfStrings.contains("[DEBUG] (f) enableLazyInitialization = true");
46+
assert listOfStrings.contains("[DEBUG] (f) enableExtendedEnhancement = false");
47+
assert listOfStrings.contains("[DEBUG] Starting execution of enhance mojo");
48+
assert listOfStrings.contains("[DEBUG] Starting assembly of the source set");
49+
assert listOfStrings.contains("[DEBUG] Processing FileSet");
50+
assert listOfStrings.contains("[DEBUG] Using base directory: " + classesFolder);
51+
assert listOfStrings.contains("[INFO] Added file to source set: " + barClassFile);
52+
assert listOfStrings.contains("[INFO] Added file to source set: " + fooClassFile);
53+
assert !listOfStrings.contains("[INFO] Added file to source set: " + bazClassFile);
54+
assert listOfStrings.contains("[DEBUG] FileSet was processed succesfully");
55+
assert listOfStrings.contains("[DEBUG] Ending the assembly of the source set");
56+
assert listOfStrings.contains("[DEBUG] Creating bytecode enhancer");
57+
assert listOfStrings.contains("[DEBUG] Creating enhancement context");
58+
assert listOfStrings.contains("[DEBUG] Creating URL ClassLoader for folder: " + classesFolder);
59+
assert listOfStrings.contains("[DEBUG] Starting type discovery");
60+
assert listOfStrings.contains("[DEBUG] Trying to discover types for classes in file: " + barClassFile);
61+
assert listOfStrings.contains("[DEBUG] Determining class name for file: " + barClassFile);
62+
assert listOfStrings.contains("[INFO] Succesfully discovered types for classes in file: " + barClassFile);
63+
assert listOfStrings.contains("[DEBUG] Trying to discover types for classes in file: " + fooClassFile);
64+
assert listOfStrings.contains("[DEBUG] Determining class name for file: " + fooClassFile);
65+
assert listOfStrings.contains("[INFO] Succesfully discovered types for classes in file: " + fooClassFile);
66+
assert listOfStrings.contains("[DEBUG] Ending type discovery");
67+
assert listOfStrings.contains("[DEBUG] Starting class enhancement");
68+
assert listOfStrings.contains("[DEBUG] Trying to enhance class file: " + barClassFile);
69+
assert listOfStrings.contains("[INFO] Succesfully cleared the contents of file: " + barClassFile);
70+
assert listOfStrings.contains("[DEBUG] " + amountOfBytes + " bytes were succesfully written to file: " +barClassFile);
71+
assert listOfStrings.contains("[INFO] Succesfully enhanced class file: " + barClassFile);
72+
assert listOfStrings.contains("[DEBUG] Trying to enhance class file: " + fooClassFile);
73+
assert listOfStrings.contains("[INFO] Skipping file: " + fooClassFile);
74+
assert listOfStrings.contains("[DEBUG] Ending class enhancement");
75+
assert listOfStrings.contains("[DEBUG] Ending execution of enhance mojo");

0 commit comments

Comments
 (0)