[BAEL-3443] How To Write A Quarkus Extension (#8260)
* quarkus extension * add the extension module to default-first profile. * 1.0.0.CR1 ==> 1.0.0.CR2 * Quarkus version ==> 1.0.0.Final * remove comment. * reorder module builds
This commit is contained in:
parent
d7adefab3f
commit
2a9171fbeb
1
pom.xml
1
pom.xml
@ -635,6 +635,7 @@
|
|||||||
<module>java-blockchain</module>
|
<module>java-blockchain</module>
|
||||||
<module>machine-learning</module>
|
<module>machine-learning</module>
|
||||||
<module>wildfly</module>
|
<module>wildfly</module>
|
||||||
|
<module>quarkus-extension</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
</profile>
|
</profile>
|
||||||
|
18
quarkus-extension/pom.xml
Normal file
18
quarkus-extension/pom.xml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>com.baeldung.quarkus.extension</groupId>
|
||||||
|
<artifactId>quarkus-extension</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<name>Quarkus - Liquibase Extension</name>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
|
<modules>
|
||||||
|
<module>quarkus-liquibase</module>
|
||||||
|
<module>quarkus-app</module>
|
||||||
|
</modules>
|
||||||
|
|
||||||
|
</project>
|
71
quarkus-extension/quarkus-app/pom.xml
Normal file
71
quarkus-extension/quarkus-app/pom.xml
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>com.baeldung.quarkus.app</groupId>
|
||||||
|
<artifactId>quarkus-app</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<properties>
|
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
<surefire-plugin.version>2.22.0</surefire-plugin.version>
|
||||||
|
<maven.compiler.parameters>true</maven.compiler.parameters>
|
||||||
|
<quarkus.version>1.0.0.Final</quarkus.version>
|
||||||
|
<compiler-plugin.version>3.8.1</compiler-plugin.version>
|
||||||
|
<maven.compiler.source>1.8</maven.compiler.source>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<maven.compiler.target>1.8</maven.compiler.target>
|
||||||
|
</properties>
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.quarkus</groupId>
|
||||||
|
<artifactId>quarkus-universe-bom</artifactId>
|
||||||
|
<version>${quarkus.version}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.baeldung.quarkus.liquibase</groupId>
|
||||||
|
<artifactId>quarkus-liquibase</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.quarkus</groupId>
|
||||||
|
<artifactId>quarkus-jdbc-h2</artifactId>
|
||||||
|
<version>${quarkus.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>io.quarkus</groupId>
|
||||||
|
<artifactId>quarkus-maven-plugin</artifactId>
|
||||||
|
<version>${quarkus.version}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>build</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>${compiler-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>${surefire-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<systemProperties>
|
||||||
|
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
|
||||||
|
</systemProperties>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
@ -0,0 +1,10 @@
|
|||||||
|
# configure datasource
|
||||||
|
#quarkus.datasource.url=jdbc:h2:tcp://localhost/~/test
|
||||||
|
quarkus.datasource.url=jdbc:h2:mem:testdb
|
||||||
|
quarkus.datasource.driver=org.h2.Driver
|
||||||
|
quarkus.datasource.username=sa
|
||||||
|
quarkus.datasource.password=
|
||||||
|
|
||||||
|
#quarkus
|
||||||
|
quarkus.liquibase.change-log=db/liquibase-changelog-master.xml
|
||||||
|
|
@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<databaseChangeLog
|
||||||
|
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
|
||||||
|
|
||||||
|
<changeSet id="1" author="baeldung">
|
||||||
|
<createTable tableName="person">
|
||||||
|
<column name="id" type="int" autoIncrement="true">
|
||||||
|
<constraints primaryKey="true" nullable="false"/>
|
||||||
|
</column>
|
||||||
|
<column name="firstname" type="varchar(50)"/>
|
||||||
|
<column name="lastname" type="varchar(50)">
|
||||||
|
<constraints nullable="false"/>
|
||||||
|
</column>
|
||||||
|
<column name="state" type="char(2)"/>
|
||||||
|
</createTable>
|
||||||
|
</changeSet>
|
||||||
|
|
||||||
|
</databaseChangeLog>
|
61
quarkus-extension/quarkus-liquibase/deployment/pom.xml
Normal file
61
quarkus-extension/quarkus-liquibase/deployment/pom.xml
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<parent>
|
||||||
|
<artifactId>quarkus-liquibase-parent</artifactId>
|
||||||
|
<groupId>com.baeldung.quarkus.liquibase</groupId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<name>Quarkus - Liquibase - Deployment</name>
|
||||||
|
|
||||||
|
<artifactId>quarkus-liquibase-deployment</artifactId>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.quarkus</groupId>
|
||||||
|
<artifactId>quarkus-core-deployment</artifactId>
|
||||||
|
<version>${quarkus.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.quarkus</groupId>
|
||||||
|
<artifactId>quarkus-arc-deployment</artifactId>
|
||||||
|
<version>${quarkus.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.quarkus</groupId>
|
||||||
|
<artifactId>quarkus-agroal-deployment</artifactId>
|
||||||
|
<version>${quarkus.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.baeldung.quarkus.liquibase</groupId>
|
||||||
|
<artifactId>quarkus-liquibase</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.8.1</version>
|
||||||
|
<configuration>
|
||||||
|
<annotationProcessorPaths>
|
||||||
|
<path>
|
||||||
|
<groupId>io.quarkus</groupId>
|
||||||
|
<artifactId>quarkus-extension-processor</artifactId>
|
||||||
|
<version>${quarkus.version}</version>
|
||||||
|
</path>
|
||||||
|
</annotationProcessorPaths>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,40 @@
|
|||||||
|
package com.baeldung.quarkus.liquibase;
|
||||||
|
|
||||||
|
import io.quarkus.agroal.deployment.DataSourceInitializedBuildItem;
|
||||||
|
import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
|
||||||
|
import io.quarkus.arc.deployment.BeanContainerBuildItem;
|
||||||
|
import io.quarkus.arc.deployment.BeanContainerListenerBuildItem;
|
||||||
|
import io.quarkus.deployment.annotations.BuildProducer;
|
||||||
|
import io.quarkus.deployment.annotations.BuildStep;
|
||||||
|
import io.quarkus.deployment.annotations.ExecutionTime;
|
||||||
|
import io.quarkus.deployment.annotations.Record;
|
||||||
|
import io.quarkus.deployment.builditem.FeatureBuildItem;
|
||||||
|
import liquibase.exception.LiquibaseException;
|
||||||
|
|
||||||
|
public class LiquibaseProcessor {
|
||||||
|
|
||||||
|
private LiquibaseConfig liquibaseConfig;
|
||||||
|
|
||||||
|
@Record(ExecutionTime.STATIC_INIT)
|
||||||
|
@BuildStep
|
||||||
|
void build(BuildProducer<AdditionalBeanBuildItem> additionalBeanProducer,
|
||||||
|
BuildProducer<FeatureBuildItem> featureProducer,
|
||||||
|
LiquibaseRecorder recorder,
|
||||||
|
BuildProducer<BeanContainerListenerBuildItem> containerListenerProducer,
|
||||||
|
DataSourceInitializedBuildItem dataSourceInitializedBuildItem) {
|
||||||
|
|
||||||
|
featureProducer.produce(new FeatureBuildItem("liquibase"));
|
||||||
|
|
||||||
|
AdditionalBeanBuildItem unremovableProducer = AdditionalBeanBuildItem.unremovableOf(LiquibaseProducer.class);
|
||||||
|
additionalBeanProducer.produce(unremovableProducer);
|
||||||
|
|
||||||
|
containerListenerProducer.produce(
|
||||||
|
new BeanContainerListenerBuildItem(recorder.setLiquibaseConfig(liquibaseConfig)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Record(ExecutionTime.RUNTIME_INIT)
|
||||||
|
@BuildStep
|
||||||
|
void processMigration(LiquibaseRecorder recorder, BeanContainerBuildItem beanContainer) throws LiquibaseException {
|
||||||
|
recorder.migrate(beanContainer.getValue());
|
||||||
|
}
|
||||||
|
}
|
25
quarkus-extension/quarkus-liquibase/pom.xml
Normal file
25
quarkus-extension/quarkus-liquibase/pom.xml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>com.baeldung.quarkus.liquibase</groupId>
|
||||||
|
<artifactId>quarkus-liquibase-parent</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<name>Quarkus - Liquibase</name>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>1.8</maven.compiler.source>
|
||||||
|
<maven.compiler.target>1.8</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<quarkus.version>1.0.0.Final</quarkus.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<modules>
|
||||||
|
<module>runtime</module>
|
||||||
|
<module>deployment</module>
|
||||||
|
</modules>
|
||||||
|
|
||||||
|
</project>
|
67
quarkus-extension/quarkus-liquibase/runtime/pom.xml
Normal file
67
quarkus-extension/quarkus-liquibase/runtime/pom.xml
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung.quarkus.liquibase</groupId>
|
||||||
|
<artifactId>quarkus-liquibase-parent</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<name>Quarkus - Liquibase - Runtime</name>
|
||||||
|
|
||||||
|
<artifactId>quarkus-liquibase</artifactId>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.quarkus</groupId>
|
||||||
|
<artifactId>quarkus-core</artifactId>
|
||||||
|
<version>${quarkus.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.quarkus</groupId>
|
||||||
|
<artifactId>quarkus-agroal</artifactId>
|
||||||
|
<version>${quarkus.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.liquibase</groupId>
|
||||||
|
<artifactId>liquibase-core</artifactId>
|
||||||
|
<version>3.8.1</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>io.quarkus</groupId>
|
||||||
|
<artifactId>quarkus-bootstrap-maven-plugin</artifactId>
|
||||||
|
<version>${quarkus.version}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>extension-descriptor</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<deployment>${project.groupId}:${project.artifactId}-deployment:${project.version}
|
||||||
|
</deployment>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.8.1</version>
|
||||||
|
<configuration>
|
||||||
|
<annotationProcessorPaths>
|
||||||
|
<path>
|
||||||
|
<groupId>io.quarkus</groupId>
|
||||||
|
<artifactId>quarkus-extension-processor</artifactId>
|
||||||
|
<version>${quarkus.version}</version>
|
||||||
|
</path>
|
||||||
|
</annotationProcessorPaths>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.baeldung.quarkus.liquibase;
|
||||||
|
|
||||||
|
import io.quarkus.runtime.annotations.ConfigItem;
|
||||||
|
import io.quarkus.runtime.annotations.ConfigPhase;
|
||||||
|
import io.quarkus.runtime.annotations.ConfigRoot;
|
||||||
|
|
||||||
|
@ConfigRoot(name = "liquibase", phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED)
|
||||||
|
public final class LiquibaseConfig {
|
||||||
|
/**
|
||||||
|
* master change log file
|
||||||
|
*/
|
||||||
|
@ConfigItem
|
||||||
|
public String changeLog;
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package com.baeldung.quarkus.liquibase;
|
||||||
|
|
||||||
|
import io.agroal.api.AgroalDataSource;
|
||||||
|
import liquibase.Liquibase;
|
||||||
|
import liquibase.database.jvm.JdbcConnection;
|
||||||
|
import liquibase.resource.ClassLoaderResourceAccessor;
|
||||||
|
import liquibase.resource.ResourceAccessor;
|
||||||
|
|
||||||
|
import javax.enterprise.context.ApplicationScoped;
|
||||||
|
import javax.enterprise.inject.Produces;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
@ApplicationScoped
|
||||||
|
public class LiquibaseProducer {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
AgroalDataSource dataSource;
|
||||||
|
|
||||||
|
private LiquibaseConfig liquibaseConfig;
|
||||||
|
|
||||||
|
@Produces
|
||||||
|
public Liquibase produceLiquibase() throws Exception {
|
||||||
|
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
|
||||||
|
ResourceAccessor classLoaderResourceAccessor = new ClassLoaderResourceAccessor(classLoader);
|
||||||
|
Liquibase liquibase = new Liquibase(liquibaseConfig.changeLog, classLoaderResourceAccessor, new JdbcConnection(dataSource.getConnection()));
|
||||||
|
return liquibase;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLiquibaseConfig(LiquibaseConfig liquibaseConfig) {
|
||||||
|
this.liquibaseConfig = liquibaseConfig;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package com.baeldung.quarkus.liquibase;
|
||||||
|
|
||||||
|
import io.quarkus.arc.runtime.BeanContainer;
|
||||||
|
import io.quarkus.arc.runtime.BeanContainerListener;
|
||||||
|
import io.quarkus.runtime.annotations.Recorder;
|
||||||
|
import liquibase.Contexts;
|
||||||
|
import liquibase.Liquibase;
|
||||||
|
import liquibase.exception.LiquibaseException;
|
||||||
|
|
||||||
|
@Recorder
|
||||||
|
public class LiquibaseRecorder {
|
||||||
|
|
||||||
|
public BeanContainerListener setLiquibaseConfig(LiquibaseConfig liquibaseConfig) {
|
||||||
|
return beanContainer -> {
|
||||||
|
LiquibaseProducer producer = beanContainer.instance(LiquibaseProducer.class);
|
||||||
|
producer.setLiquibaseConfig(liquibaseConfig);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public void migrate(BeanContainer container) throws LiquibaseException {
|
||||||
|
Liquibase liquibase = container.instance(Liquibase.class);
|
||||||
|
liquibase.update(new Contexts());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user