Fui pesquisar aqui e descobri umas coisas interessantes, não sei se cobre sua necessidade, mas veja o que eu consegui:
O app
Eu tenho este código fonte:
import org.apache.commons.text.WordUtils;
public class App {
public static String getGreeting() {
return WordUtils.capitalizeFully("aaa bbb ccc");
}
public static void main(String... args) {
System.out.println(getGreeting());
}
}
Este teste JUnit:
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
class AppTest {
@Test
void shouldCapitalizeAllWords() {
assertEquals("Aaa Bbb Ccc", App.getGreeting());
}
}
e este build.gradle
:
plugins {
// id 'greeting-java' version '0.1'
id 'greeting-groovy' version '0.1'
}
application {
mainClass = 'App'
}
sourceSets {
main.java.srcDirs = ['src']
test.java.srcDirs = ['test']
}
Como vc pode ver, meu código depende da Apache Commons e da JUnit, mas no build.gradle
eu não adiciono nenhuma das 2, fora que normalmente a gente acrescentaria o plugin ‘application’, mas eu adicionei apenas o meu próprio plugin. Eu fiz o mesmo plugin em Java e Groovy, por isso eu deixei comentado ali.
O plugin Java
Meu src/GreetingPlugin.java
:
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.tasks.testing.Test;
public class GreetingPlugin implements Plugin<Project> {
public void apply(Project project) {
project.getPluginManager().apply(org.gradle.api.plugins.ApplicationPlugin.class);
project.getRepositories().mavenCentral();
project.getDependencies().add("testImplementation", "org.junit.jupiter:junit-jupiter:5.7.2");
project.getDependencies().add("implementation", "org.apache.commons:commons-text:1.9");
project.getTasks().named("test", Test.class, (action) -> action.useJUnitPlatform());
project.task("hello", (action) -> {
System.out.println("Hello from Java");
});
}
}
O build.gradle
:
plugins {
id 'java-gradle-plugin'
id 'maven-publish'
}
group = 'greeting-java'
version = '0.1'
sourceSets {
main.java.srcDirs = ['src']
}
gradlePlugin {
plugins {
greetingsPlugin {
id = 'greeting-java'
implementationClass = 'GreetingPlugin'
}
}
}
O plugin Groovy
É o mesmo do Java, fiz só para comparação, este é o src/GreetingPlugin.groovy
:
import org.gradle.api.Plugin
import org.gradle.api.Project
class GreetingPlugin implements Plugin<Project> {
void apply(Project project) {
project.configure(project) {
apply plugin: 'application'
repositories {
mavenCentral()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter:5.7.2'
implementation 'org.apache.commons:commons-text:1.9'
}
tasks.named('test') {
useJUnitPlatform()
}
project.task('hello') {
println 'Hello from Groovy'
}
}
}
}
O build.gradle
(a diferença aqui é que no Java usa-se o plugin ‘java-gradle-plugin’ e aqui é o ‘groovy-gradle-plugin’):
plugins {
id 'groovy-gradle-plugin'
id 'maven-publish'
}
group = 'greeting-groovy'
version = '0.1'
sourceSets {
main.groovy.srcDirs = ['src']
}
gradlePlugin {
plugins {
greetingsPlugin {
id = 'greeting-groovy'
implementationClass = 'GreetingPlugin'
}
}
}
Na prática
Eu usei o plugin ‘maven-publish’ para publicar o meu plugin. Como eu não quis colocar online, eu usei o seguinte comando para publica apenas no meu repositório local que fica, por padrão, em ~/.m2
.
gradle clean build publishToMavenLocal
Como o plugin está só no local, eu tive que adicionar no meu app um arquivo settings.gradle
com o conteúdo abaixo para ele poder localizar corretamente, mas se vc publicar online, eu acho que não precisaria disso:
pluginManagement {
repositories {
mavenLocal()
}
}
Eu fiz um projetinho aqui para vc experimentar: testes-com-plugins-do-gradle.zip (4,6,KB)