diff --git a/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/maven/MojoAdd.java b/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/maven/MojoAdd.java index 72ae58875..ec5e9ef1c 100644 --- a/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/maven/MojoAdd.java +++ b/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/maven/MojoAdd.java @@ -50,6 +50,10 @@ public class MojoAdd extends AbstractMojo { @Parameter(property = "freemarkerVersion", defaultValue = "2.3.32", required = true) protected String freemarkerVersion; + protected String groupIdOverride; + + protected String artifactIdOverride; + @Override public void execute() throws MojoExecutionException, MojoFailureException { String foundVersion = VersionCheck.findVersion( this.version ); @@ -64,8 +68,10 @@ public void execute() throws MojoExecutionException, MojoFailureException { context.setAddLombok( this.addLombok ); context.setAddDependencyOnTop( this.addDependencyOnTop ); context.setFreemarkerVersion( this.freemarkerVersion ); + context.setGroupIdOverride( this.groupIdOverride ); + context.setArtifactIdOverride( this.artifactIdOverride ); this.getLog().info( String.format( "add execute() context : %s", context ) ); - AddVenusFacade.addVenusToMavenProject( context ); + AddVenusFacade.addToProject( context ); } } diff --git a/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/maven/MojoInit.java b/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/maven/MojoInit.java index 15a9f7fca..a00117a23 100644 --- a/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/maven/MojoInit.java +++ b/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/maven/MojoInit.java @@ -66,6 +66,8 @@ public void execute() throws MojoExecutionException, MojoFailureException { this.getLog().info( String.format( "flavour context : %s", context ) ); FlavourFacade.initProject( context ); } ); + super.groupIdOverride = this.groupId; + super.artifactIdOverride = this.artifactId; super.execute(); } diff --git a/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/project/facade/AddVenusFacade.java b/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/project/facade/AddVenusFacade.java index 7b58c30d5..7ac74e515 100644 --- a/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/project/facade/AddVenusFacade.java +++ b/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/project/facade/AddVenusFacade.java @@ -1,7 +1,9 @@ package org.fugerit.java.doc.project.facade; -import freemarker.template.*; +import freemarker.template.Configuration; +import freemarker.template.TemplateException; import lombok.extern.slf4j.Slf4j; +import org.apache.maven.model.Model; import org.fugerit.java.core.cfg.ConfigException; import org.fugerit.java.core.function.SafeFunction; import org.fugerit.java.core.io.FileIO; @@ -11,8 +13,12 @@ import org.fugerit.java.doc.freemarker.process.FreemarkerDocProcessConfig; import org.fugerit.java.doc.freemarker.process.FreemarkerDocProcessConfigFacade; -import java.io.*; -import java.util.*; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; @Slf4j public class AddVenusFacade extends BasicVenusFacade { @@ -115,24 +121,52 @@ private static void addDocFacade( VenusContext context ) throws IOException, Tem configuration.clearTemplateCache(); } - public static boolean addVenusToMavenProject( VenusContext context ) { + public static boolean addToProject( VenusContext context ) { return SafeFunction.get( () -> { File pomFile = new File( context.getProjectDir(), "pom.xml" ); - log.info( "project dir : {}", context.getProjectDir().getCanonicalPath() ); if ( pomFile.exists() ) { - addExtensionList( pomFile, context ); - if ( context.isAddDocFacace() ) { - addDocFacade( context ); - if ( context.isAddJunit5() ) { - log.info( "Generation complete:\n{}\n* For usage open the example junit : {} *\n{}", LINE, "test."+context.getDocConfigPackage()+"."+context.getDocConfigClass()+"Test", LINE ); - } else { - log.info( "Generation complete:\n{}\n* For usage open the example main() : {} *\n{}", LINE, context.getDocConfigPackage()+"."+context.getDocConfigClass()+"Example", LINE ); - } - log.info( "for documentation refer to https://github.com/fugerit-org/fj-doc/blob/main/fj-doc-maven-plugin/README.md" ); - } + return addVenusToMavenProject( pomFile, context ); } else { - addErrorAndLog( String.format( "No pom file in project dir : %s", pomFile.getCanonicalPath() ), context ); - return false; + File gradleFile = new File( context.getProjectDir(), "build.gradle.kts" ); + if ( gradleFile.exists() ) { + return addVenusToGradleKtsProject( gradleFile, context ); + } else { + addErrorAndLog( String.format( "No pom or gradle file in project dir : %s", pomFile.getCanonicalPath() ), context ); + return false; + } + } + } ); + } + + public static boolean addVenusToMavenProject( File pomFile, VenusContext context ) { + return SafeFunction.get( () -> { + log.info( "maven project dir : {}", context.getProjectDir().getCanonicalPath() ); + addExtensionList( pomFile, context ); + if ( context.isAddDocFacace() ) { + addDocFacade( context ); + if ( context.isAddJunit5() ) { + log.info( "Generation complete:\n{}\n* For usage open the example junit : {} *\n{}", LINE, "test."+context.getDocConfigPackage()+"."+context.getDocConfigClass()+"Test", LINE ); + } else { + log.info( "Generation complete:\n{}\n* For usage open the example main() : {} *\n{}", LINE, context.getDocConfigPackage()+"."+context.getDocConfigClass()+"Example", LINE ); + } + log.info( "for documentation refer to https://github.com/fugerit-org/fj-doc/blob/main/fj-doc-maven-plugin/README.md" ); + } + return true; + } ); + } + + public static boolean addVenusToGradleKtsProject( File gradleFile, VenusContext context ) { + return SafeFunction.get( () -> { + log.info( "gradle project dir : {}", context.getProjectDir().getCanonicalPath() ); + addExtensionGradleKtsList( gradleFile, context ); + if ( context.isAddDocFacace() ) { + if ( context.getMavenModel() == null ) { + Model model = new Model(); + model.setGroupId(context.getGroupIdOverride()); + model.setArtifactId(context.getArtifactIdOverride()); + context.setMavenModel(model); + } + addDocFacade( context ); } return true; } ); diff --git a/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/project/facade/BasicVenusFacade.java b/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/project/facade/BasicVenusFacade.java index 8c1712995..0dff61dc9 100644 --- a/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/project/facade/BasicVenusFacade.java +++ b/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/project/facade/BasicVenusFacade.java @@ -5,11 +5,13 @@ import org.codehaus.plexus.util.xml.Xpp3Dom; import org.codehaus.plexus.util.xml.Xpp3DomBuilder; import org.fugerit.java.core.cfg.ConfigRuntimeException; +import org.fugerit.java.core.io.FileIO; import org.fugerit.java.core.io.helper.HelperIOException; import org.fugerit.java.core.lang.helpers.StringUtils; import org.maxxq.maven.dependency.ModelIO; import java.io.*; +import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Properties; @@ -149,6 +151,33 @@ protected static void addExtensionList( File pomFile, VenusContext context ) thr } } + private static final String CONST_IMPLEMENTATION = "implementation"; + + protected static void addExtensionGradleKtsList( File gradleFile, VenusContext context ) throws IOException { + // note, this will currently only work for very simple build.gradle.kts files + String gradleFileContent = FileIO.readString( gradleFile ); + String valVersion = String.format( "val fjDocVersion = \"%s\"\n\ndependencies", context.getVersion() ); + gradleFileContent = gradleFileContent.replaceFirst( "dependencies", valVersion ); + List moduleListGradle = ModuleFacade.toModuleListOptimizedOrder( context.getExtensions() ); + Collections.reverse( moduleListGradle ); + log.info( "moduleListGradle : {}", moduleListGradle ); + for ( String currentModule : moduleListGradle ) { + String moduleNameGradle = ModuleFacade.toModuleName( currentModule ); + String currentImplementation = String.format( "implementation\\(\"org.fugerit.java:%s:\\$fjDocVersion\"\\)%n implementation", moduleNameGradle ); + log.info( "Adding module to gradle file : {}, substitution : {}", moduleNameGradle, currentImplementation ); + gradleFileContent = gradleFileContent.replaceFirst( CONST_IMPLEMENTATION, currentImplementation ); + context.getModules().add( moduleNameGradle ); + } + if (context.isAddLombok() ) { + String lombokVersion = "1.18.36"; + gradleFileContent = gradleFileContent.replaceFirst( CONST_IMPLEMENTATION, String.format( "compileOnly\\(\"org.projectlombok:lombok:%s\"\\)%n %s", lombokVersion, CONST_IMPLEMENTATION ) ); + gradleFileContent = gradleFileContent.replaceFirst( CONST_IMPLEMENTATION, String.format( "annotationProcessor\\(\"org.projectlombok:lombok:%s\"\\)%n %s", lombokVersion, CONST_IMPLEMENTATION ) ); + gradleFileContent = gradleFileContent.replaceFirst( CONST_IMPLEMENTATION, String.format( "testCompileOnly\\(\"org.projectlombok:lombok:%s\"\\)%n %s", lombokVersion, CONST_IMPLEMENTATION ) ); + gradleFileContent = gradleFileContent.replaceFirst( CONST_IMPLEMENTATION, String.format( "testAnnotationProcessor\\(\"org.projectlombok:lombok:%s\"\\)%n %s", lombokVersion, CONST_IMPLEMENTATION ) ); + } + FileIO.writeString( gradleFileContent, gradleFile ); + } + private static void addPlugin( VenusContext context, Model model ) throws IOException { // addVerifyPlugin? if ( context.isAddVerifyPlugin() ) { diff --git a/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/project/facade/FlavourFacade.java b/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/project/facade/FlavourFacade.java index ccfd19b26..0711130f1 100644 --- a/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/project/facade/FlavourFacade.java +++ b/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/project/facade/FlavourFacade.java @@ -25,6 +25,8 @@ private FlavourFacade() {} public static final String FLAVOUR_QUARKUS_3 = "quarkus-3"; + public static final String FLAVOUR_QUARKUS_3_GRADLE_KTS = "quarkus-3-gradle-kts"; + public static final String FLAVOUR_QUARKUS_2 = "quarkus-2"; public static final String FLAVOUR_QUARKUS_LATEST = "quarkus-latest"; @@ -38,9 +40,13 @@ private FlavourFacade() {} private static final Properties FLAVOURS_DEFAULT_VERSION = PropsIO.loadFromClassLoaderSafe( "config/flavour/flavour_versions_default.properties" ); public static final Set SUPPORTED_FLAVOURS = Collections.unmodifiableSet( - new HashSet<>( Arrays.asList( FLAVOUR_VANILLA, FLAVOUR_QUARKUS_3, FLAVOUR_QUARKUS_2, + new HashSet<>( Arrays.asList( FLAVOUR_VANILLA, FLAVOUR_QUARKUS_3, FLAVOUR_QUARKUS_3_GRADLE_KTS, FLAVOUR_QUARKUS_2, FLAVOUR_MICRONAUT_4, FLAVOUR_SPRINGBOOT_3, FLAVOUR_OPENLIBERTY ) ) ); + public static boolean isGradleKtsFlavour(String flavour ) { + return FLAVOUR_QUARKUS_3_GRADLE_KTS.equals( flavour ); + } + private static final Properties MAP_FLAVOURS = SafeFunction.get( () -> { Properties prop = new Properties(); prop.setProperty( FLAVOUR_QUARKUS_LATEST, FLAVOUR_QUARKUS_3 ); diff --git a/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/project/facade/VenusContext.java b/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/project/facade/VenusContext.java index 0afdf04e2..fdd0270bc 100644 --- a/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/project/facade/VenusContext.java +++ b/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/project/facade/VenusContext.java @@ -81,6 +81,12 @@ public static String toResourcePathFmConfigXml( String artifactId ) { @Getter @Setter private String freemarkerVersion; + @Getter @Setter + private String groupIdOverride; + + @Getter @Setter + private String artifactIdOverride; + public void setExcludeXmlApis( boolean excludeXmlApis ) { if ( excludeXmlApis ) { this.setAddExclusions( "xml-apis:xml-apis" ); diff --git a/fj-doc-maven-plugin/src/main/resources/config/flavour/flavour_versions_default.properties b/fj-doc-maven-plugin/src/main/resources/config/flavour/flavour_versions_default.properties index dad421406..378917431 100644 --- a/fj-doc-maven-plugin/src/main/resources/config/flavour/flavour_versions_default.properties +++ b/fj-doc-maven-plugin/src/main/resources/config/flavour/flavour_versions_default.properties @@ -1,5 +1,6 @@ # default flavour versions quarkus-3=3.18.1 +quarkus-3-gradle-kts=3.18.1 quarkus-2=2.16.12.Final micronaut-4=4.7.4 springboot-3=3.4.2 diff --git a/fj-doc-maven-plugin/src/main/resources/config/flavour/quarkus-3-gradle-kts-copy.txt b/fj-doc-maven-plugin/src/main/resources/config/flavour/quarkus-3-gradle-kts-copy.txt new file mode 100644 index 000000000..7cf5d175e --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/flavour/quarkus-3-gradle-kts-copy.txt @@ -0,0 +1,5 @@ +.dockerignore +src/main/docker/Dockerfile.native +src/main/docker/Dockerfile.native-micro +src/main/docker/Dockerfile.legacy-jar +src/main/docker/Dockerfile.jvm diff --git a/fj-doc-maven-plugin/src/main/resources/config/flavour/quarkus-3-gradle-kts/.dockerignore b/fj-doc-maven-plugin/src/main/resources/config/flavour/quarkus-3-gradle-kts/.dockerignore new file mode 100644 index 000000000..4361d2fb3 --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/flavour/quarkus-3-gradle-kts/.dockerignore @@ -0,0 +1,5 @@ +* +!build/*-runner +!build/*-runner.jar +!build/lib/* +!build/quarkus-app/* \ No newline at end of file diff --git a/fj-doc-maven-plugin/src/main/resources/config/flavour/quarkus-3-gradle-kts/src/main/docker/Dockerfile.jvm b/fj-doc-maven-plugin/src/main/resources/config/flavour/quarkus-3-gradle-kts/src/main/docker/Dockerfile.jvm new file mode 100644 index 000000000..731162bae --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/flavour/quarkus-3-gradle-kts/src/main/docker/Dockerfile.jvm @@ -0,0 +1,97 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./gradlew build +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/fj-doc-quarkus-tutorial-jvm . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/fj-doc-quarkus-tutorial-jvm +# +# If you want to include the debug port into your docker image +# you will have to expose the debug port (default 5005 being the default) like this : EXPOSE 8080 5005. +# Additionally you will have to set -e JAVA_DEBUG=true and -e JAVA_DEBUG_PORT=*:5005 +# when running the container +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 quarkus/fj-doc-quarkus-tutorial-jvm +# +# This image uses the `run-java.sh` script to run the application. +# This scripts computes the command line to execute your Java application, and +# includes memory/GC tuning. +# You can configure the behavior using the following environment properties: +# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") +# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options +# in JAVA_OPTS (example: "-Dsome.property=foo") +# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is +# used to calculate a default maximal heap memory based on a containers restriction. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio +# of the container available memory as set here. The default is `50` which means 50% +# of the available memory is used as an upper boundary. You can skip this mechanism by +# setting this value to `0` in which case no `-Xmx` option is added. +# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This +# is used to calculate a default initial heap memory based on the maximum heap memory. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio +# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx` +# is used as the initial heap size. You can skip this mechanism by setting this value +# to `0` in which case no `-Xms` option is added (example: "25") +# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS. +# This is used to calculate the maximum value of the initial heap memory. If used in +# a container without any memory constraints for the container then this option has +# no effect. If there is a memory constraint then `-Xms` is limited to the value set +# here. The default is 4096MB which means the calculated value of `-Xms` never will +# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096") +# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output +# when things are happening. This option, if set to true, will set +# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true"). +# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example: +# true"). +# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787"). +# - CONTAINER_CORE_LIMIT: A calculated core limit as described in +# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2") +# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024"). +# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion. +# (example: "20") +# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking. +# (example: "40") +# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection. +# (example: "4") +# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus +# previous GC times. (example: "90") +# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20") +# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100") +# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should +# contain the necessary JRE command-line options to specify the required GC, which +# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC). +# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080") +# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080") +# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be +# accessed directly. (example: "foo.example.com,bar.example.com") +# +### +FROM registry.access.redhat.com/ubi8/openjdk-21:1.20 + +ENV LANGUAGE='en_US:en' + + +# We make four distinct layers so if there are application changes the library layers can be re-used +COPY --chown=185 build/quarkus-app/lib/ /deployments/lib/ +COPY --chown=185 build/quarkus-app/*.jar /deployments/ +COPY --chown=185 build/quarkus-app/app/ /deployments/app/ +COPY --chown=185 build/quarkus-app/quarkus/ /deployments/quarkus/ + +EXPOSE 8080 +USER 185 +ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" + +ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ] + diff --git a/fj-doc-maven-plugin/src/main/resources/config/flavour/quarkus-3-gradle-kts/src/main/docker/Dockerfile.legacy-jar b/fj-doc-maven-plugin/src/main/resources/config/flavour/quarkus-3-gradle-kts/src/main/docker/Dockerfile.legacy-jar new file mode 100644 index 000000000..2202bba51 --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/flavour/quarkus-3-gradle-kts/src/main/docker/Dockerfile.legacy-jar @@ -0,0 +1,93 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./gradlew build -Dquarkus.package.jar.type=legacy-jar +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.legacy-jar -t quarkus/fj-doc-quarkus-tutorial-legacy-jar . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/fj-doc-quarkus-tutorial-legacy-jar +# +# If you want to include the debug port into your docker image +# you will have to expose the debug port (default 5005 being the default) like this : EXPOSE 8080 5005. +# Additionally you will have to set -e JAVA_DEBUG=true and -e JAVA_DEBUG_PORT=*:5005 +# when running the container +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 quarkus/fj-doc-quarkus-tutorial-legacy-jar +# +# This image uses the `run-java.sh` script to run the application. +# This scripts computes the command line to execute your Java application, and +# includes memory/GC tuning. +# You can configure the behavior using the following environment properties: +# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") +# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options +# in JAVA_OPTS (example: "-Dsome.property=foo") +# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is +# used to calculate a default maximal heap memory based on a containers restriction. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio +# of the container available memory as set here. The default is `50` which means 50% +# of the available memory is used as an upper boundary. You can skip this mechanism by +# setting this value to `0` in which case no `-Xmx` option is added. +# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This +# is used to calculate a default initial heap memory based on the maximum heap memory. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio +# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx` +# is used as the initial heap size. You can skip this mechanism by setting this value +# to `0` in which case no `-Xms` option is added (example: "25") +# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS. +# This is used to calculate the maximum value of the initial heap memory. If used in +# a container without any memory constraints for the container then this option has +# no effect. If there is a memory constraint then `-Xms` is limited to the value set +# here. The default is 4096MB which means the calculated value of `-Xms` never will +# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096") +# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output +# when things are happening. This option, if set to true, will set +# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true"). +# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example: +# true"). +# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787"). +# - CONTAINER_CORE_LIMIT: A calculated core limit as described in +# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2") +# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024"). +# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion. +# (example: "20") +# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking. +# (example: "40") +# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection. +# (example: "4") +# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus +# previous GC times. (example: "90") +# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20") +# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100") +# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should +# contain the necessary JRE command-line options to specify the required GC, which +# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC). +# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080") +# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080") +# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be +# accessed directly. (example: "foo.example.com,bar.example.com") +# +### +FROM registry.access.redhat.com/ubi8/openjdk-21:1.20 + +ENV LANGUAGE='en_US:en' + + +COPY build/lib/* /deployments/lib/ +COPY build/*-runner.jar /deployments/quarkus-run.jar + +EXPOSE 8080 +USER 185 +ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" + +ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ] diff --git a/fj-doc-maven-plugin/src/main/resources/config/flavour/quarkus-3-gradle-kts/src/main/docker/Dockerfile.native b/fj-doc-maven-plugin/src/main/resources/config/flavour/quarkus-3-gradle-kts/src/main/docker/Dockerfile.native new file mode 100644 index 000000000..608711fd2 --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/flavour/quarkus-3-gradle-kts/src/main/docker/Dockerfile.native @@ -0,0 +1,27 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode. +# +# Before building the container image run: +# +# ./gradlew build -Dquarkus.native.enabled=true +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.native -t quarkus/fj-doc-quarkus-tutorial . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/fj-doc-quarkus-tutorial +# +### +FROM registry.access.redhat.com/ubi8/ubi-minimal:8.10 +WORKDIR /work/ +RUN chown 1001 /work \ + && chmod "g+rwX" /work \ + && chown 1001:root /work +COPY --chown=1001:root build/*-runner /work/application + +EXPOSE 8080 +USER 1001 + +ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/fj-doc-maven-plugin/src/main/resources/config/flavour/quarkus-3-gradle-kts/src/main/docker/Dockerfile.native-micro b/fj-doc-maven-plugin/src/main/resources/config/flavour/quarkus-3-gradle-kts/src/main/docker/Dockerfile.native-micro new file mode 100644 index 000000000..a1d6795b3 --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/flavour/quarkus-3-gradle-kts/src/main/docker/Dockerfile.native-micro @@ -0,0 +1,30 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode. +# It uses a micro base image, tuned for Quarkus native executables. +# It reduces the size of the resulting container image. +# Check https://quarkus.io/guides/quarkus-runtime-base-image for further information about this image. +# +# Before building the container image run: +# +# ./gradlew build -Dquarkus.native.enabled=true +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.native-micro -t quarkus/fj-doc-quarkus-tutorial . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/fj-doc-quarkus-tutorial +# +### +FROM quay.io/quarkus/quarkus-micro-image:2.0 +WORKDIR /work/ +RUN chown 1001 /work \ + && chmod "g+rwX" /work \ + && chown 1001:root /work +COPY --chown=1001:root build/*-runner /work/application + +EXPOSE 8080 +USER 1001 + +ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts-fm-yml.ftl b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts-fm-yml.ftl new file mode 100644 index 000000000..acfdc8383 --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts-fm-yml.ftl @@ -0,0 +1,34 @@ +<#import 'flavour-macro.ftl' as fhm> +--- +flavour: ${context.flavour} +process: + - from: flavour/${context.flavour}/settings.gradle.ftl + to: ${context.projectFolder}/settings.gradle.kts + - from: flavour/${context.flavour}/gradle.ftl + to: ${context.projectFolder}/gradle.properties + - from: flavour/${context.flavour}/build.gradle.ftl + to: ${context.projectFolder}/build.gradle.kts + - from: flavour/${context.flavour}/README.ftl + to: ${context.projectFolder}/README.md + - from: flavour/${context.flavour}/gitignore.ftl + to: ${context.projectFolder}/.gitignore + - from: flavour/${context.flavour}/GreetingConfig.ftl + to: ${context.projectFolder}/src/main/java/<@fhm.toProjectPackageFolder context=context/>/GreetingConfig.java + - from: flavour/${context.flavour}/GreetingResource.ftl + to: ${context.projectFolder}/src/main/java/<@fhm.toProjectPackageFolder context=context/>/GreetingResource.java + - from: flavour/${context.flavour}/GreetingResourceTest.ftl + to: ${context.projectFolder}/src/test/java/test/<@fhm.toProjectPackageFolder context=context/>/GreetingResourceTest.java + - from: flavour/${context.flavour}/GreetingResourceIT.ftl + to: ${context.projectFolder}/src/test/java/test/<@fhm.toProjectPackageFolder context=context/>/GreetingResourceIT.java + - from: flavour/${context.flavour}/DocResourceIT.ftl + to: ${context.projectFolder}/src/test/java/test/<@fhm.toProjectPackageFolder context=context/>/DocResourceIT.java + - from: flavour/${context.flavour}/DocResource.ftl + to: ${context.projectFolder}/src/main/java/<@fhm.toProjectPackageFolder context=context/>/DocResource.java + - from: flavour/${context.flavour}/application.ftl + to: ${context.projectFolder}/src/main/resources/application.yml + - from: flavour/${context.flavour}/AppInit.ftl + to: ${context.projectFolder}/src/main/java/<@fhm.toProjectPackageFolder context=context/>/AppInit.java + - from: flavour/${context.flavour}/DocResourceTest.ftl + to: ${context.projectFolder}/src/test/java/test/<@fhm.toProjectPackageFolder context=context/>/DocResourceTest.java + - from: flavour/${context.flavour}/DocHelper.ftl + to: ${context.projectFolder}/src/main/java/<@fhm.toProjectPackageFolder context=context/>/DocHelper.java \ No newline at end of file diff --git a/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/AppInit.ftl b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/AppInit.ftl new file mode 100644 index 000000000..6a834b1ee --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/AppInit.ftl @@ -0,0 +1,30 @@ +<#import '../flavour-macro.ftl' as fhm> +package <@fhm.toProjectPackage context=context/>; + +import io.quarkus.runtime.StartupEvent; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Observes; +import lombok.extern.slf4j.Slf4j; +import io.quarkus.runtime.annotations.RegisterForReflection; +import jakarta.inject.Inject; +import org.fugerit.java.doc.base.config.InitHandler; + +@Slf4j +@ApplicationScoped +@RegisterForReflection( targets = { DocHelper.class, People.class } ) +public class AppInit { + + @Inject + DocHelper docHelper; + + void onStart(@Observes StartupEvent ev) { + log.info("The application is starting..."); + /* + * This will initialize all the doc handlers using async mode. + * (use method InitHandler.initDocAll() for synced startup) + */ + InitHandler.initDocAllAsync( + docHelper.getDocProcessConfig().getFacade().handlers() ); + } + +} diff --git a/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/DocHelper.ftl b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/DocHelper.ftl new file mode 100644 index 000000000..e42b0a65b --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/DocHelper.ftl @@ -0,0 +1,15 @@ +<#import '../flavour-macro.ftl' as fhm> +package <@fhm.toProjectPackage context=context/>; + +import org.fugerit.java.doc.freemarker.process.FreemarkerDocProcessConfig; +import org.fugerit.java.doc.freemarker.process.FreemarkerDocProcessConfigFacade; +import jakarta.enterprise.context.ApplicationScoped; + +@ApplicationScoped +public class DocHelper { + + private FreemarkerDocProcessConfig docProcessConfig = FreemarkerDocProcessConfigFacade.loadConfigSafe( "cl://${context.resourcePathFmConfigXml}" ); + + public FreemarkerDocProcessConfig getDocProcessConfig() { return this.docProcessConfig; } + +} diff --git a/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/DocResource.ftl b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/DocResource.ftl new file mode 100644 index 000000000..3b2248eba --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/DocResource.ftl @@ -0,0 +1,61 @@ +<#import '../flavour-macro.ftl' as fhm> +package <@fhm.toProjectPackage context=context/>; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import lombok.extern.slf4j.Slf4j; +import org.fugerit.java.doc.base.config.DocConfig; +import org.fugerit.java.doc.base.process.DocProcessContext; + +import java.io.ByteArrayOutputStream; +import java.util.Arrays; +import java.util.List; + +import org.eclipse.microprofile.openapi.annotations.Operation; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; +import org.eclipse.microprofile.openapi.annotations.tags.Tag; +import org.eclipse.microprofile.openapi.annotations.tags.Tags; + +@Slf4j +@ApplicationScoped +@Path("/doc") +public class DocResource { + + @Inject + DocHelper docHelper; + <@fhm.createDocumentProcessNoHelper context=context exceptionType='WebApplicationException'/> + + <@fhm.createQuarkusPath context=context outputMime="text/markdown" outputExtension="md" outputDescription="Markdown"/> + + <@fhm.createQuarkusPath context=context outputMime="text/html" outputExtension="html" outputDescription="HTML"/> + + <#if context.asciidocFreemarkerHandlerAvailable> + <@fhm.createQuarkusPath context=context outputMime="text/asciidoc" outputExtension="adoc" outputDescription="AsciiDoc"/> + + + <#if context.modules?seq_contains("fj-doc-mod-fop")> + <@fhm.createQuarkusPath context=context outputMime="application/pdf" outputExtension="pdf" outputDescription="PDF"/> + + + <#if context.modules?seq_contains("fj-doc-mod-poi")> + <@fhm.createQuarkusPath context=context outputMime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" outputExtension="xlsx" outputDescription="Excel"/> + + + <#if context.modules?seq_contains("fj-doc-mod-opencsv")> + <@fhm.createQuarkusPath context=context outputMime="text/csv" outputExtension="csv" outputDescription="CSV"/> + + + <#if context.modules?seq_contains("fj-doc-mod-openpdf-ext")> + <@fhm.createQuarkusPathPrefix context=context outputMime="application/pdf" outputExtension="pdf" outputDescription="OpenPDF" pathPrefix='/openpdf'/> + <@fhm.createQuarkusPathPrefix context=context outputMime="text/html" outputExtension="html" outputDescription="OpenPDFHTML" pathPrefix='/openpdf'/> + + <#if context.modules?seq_contains("fj-doc-mod-openrtf-ext")> + <@fhm.createQuarkusPath context=context outputMime="application/rtf" outputExtension="rtf" outputDescription="RTF"/> + + +} diff --git a/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/DocResourceIT.ftl b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/DocResourceIT.ftl new file mode 100644 index 000000000..46d21b7c9 --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/DocResourceIT.ftl @@ -0,0 +1,9 @@ +<#import '../flavour-macro.ftl' as fhm> +package test.<@fhm.toProjectPackage context=context/>; + +import io.quarkus.test.junit.QuarkusIntegrationTest; + +@QuarkusIntegrationTest +class DocResourceIT extends DocResourceTest { + // Execute the same tests but in packaged mode. +} diff --git a/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/DocResourceTest.ftl b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/DocResourceTest.ftl new file mode 100644 index 000000000..df8a48f21 --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/DocResourceTest.ftl @@ -0,0 +1,63 @@ +<#import '../flavour-macro.ftl' as fhm> +package test.<@fhm.toProjectPackage context=context/>; + +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +import static io.restassured.RestAssured.given; + +@QuarkusTest +class DocResourceTest { + + @Test + void testMarkdown() { + given().when().get("/doc/example.md").then().statusCode(200); + } + + @Test + void testHtml() { + given().when().get("/doc/example.html").then().statusCode(200); + } + + <#if context.asciidocFreemarkerHandlerAvailable> + @Test + void testAsciiDoc() { + given().when().get("/doc/example.adoc").then().statusCode(200); + } + + <#if context.modules?seq_contains("fj-doc-mod-fop")> + @Test + void testPdf() { + given().when().get("/doc/example.pdf").then().statusCode(200); + } + + <#if context.modules?seq_contains("fj-doc-mod-poi")> + @Test + void testXlsx() { + given().when().get("/doc/example.xlsx").then().statusCode(200); + } + + <#if context.modules?seq_contains("fj-doc-mod-opencsv")> + @Test + void testCsv() { + given().when().get("/doc/example.csv").then().statusCode(200); + } + + <#if context.modules?seq_contains("fj-doc-mod-openpdf-ext")> + @Test + void testOpenPDF() { + given().when().get("/doc/openpdf/example.pdf").then().statusCode(200); + } + @Test + void testOpenPDFHTML() { + given().when().get("/doc/openpdf/example.html").then().statusCode(200); + } + + <#if context.modules?seq_contains("fj-doc-mod-openrtf-ext")> + @Test + void testOpenRTF() { + given().when().get("/doc/example.rtf").then().statusCode(200); + } + + +} \ No newline at end of file diff --git a/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/GreetingConfig.ftl b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/GreetingConfig.ftl new file mode 100644 index 000000000..6bdd13ede --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/GreetingConfig.ftl @@ -0,0 +1,13 @@ +<#import '../flavour-macro.ftl' as fhm> +package <@fhm.toProjectPackage context=context/>; + +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithName; + +@ConfigMapping(prefix = "greeting") +public interface GreetingConfig { + + @WithName("message") + String message(); + +} \ No newline at end of file diff --git a/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/GreetingResource.ftl b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/GreetingResource.ftl new file mode 100644 index 000000000..371b1247b --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/GreetingResource.ftl @@ -0,0 +1,17 @@ +<#import '../flavour-macro.ftl' as fhm> +package <@fhm.toProjectPackage context=context/>; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; + +@Path("/hello") +public class GreetingResource { + + @GET + @Produces(MediaType.TEXT_PLAIN) + public String hello() { + return "Hello from Quarkus REST"; + } +} diff --git a/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/GreetingResourceIT.ftl b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/GreetingResourceIT.ftl new file mode 100644 index 000000000..b52750b67 --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/GreetingResourceIT.ftl @@ -0,0 +1,9 @@ +<#import '../flavour-macro.ftl' as fhm> +package test.<@fhm.toProjectPackage context=context/>; + +import io.quarkus.test.junit.QuarkusIntegrationTest; + +@QuarkusIntegrationTest +class GreetingResourceIT extends GreetingResourceTest { + // Execute the same tests but in packaged mode. +} diff --git a/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/GreetingResourceTest.ftl b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/GreetingResourceTest.ftl new file mode 100644 index 000000000..882b7a20b --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/GreetingResourceTest.ftl @@ -0,0 +1,21 @@ +<#import '../flavour-macro.ftl' as fhm> +package test.<@fhm.toProjectPackage context=context/>; + +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.CoreMatchers.is; + +@QuarkusTest +class GreetingResourceTest { + @Test + void testHelloEndpoint() { + given() + .when().get("/hello") + .then() + .statusCode(200) + .body(is("Hello from Quarkus REST")); + } + +} \ No newline at end of file diff --git a/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/README.ftl b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/README.ftl new file mode 100644 index 000000000..e0e680a12 --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/README.ftl @@ -0,0 +1,132 @@ +# ${context.artifactId} + +## Quickstart + +Requirement : + +* Gradle 8+ +* java ${context.javaRelease}+ (GraalVM for native version) + +1. Verify the app + +```shell +gradle build +``` + +2. Start the app + +```shell +gradle quarkusDev +``` + +3. Try the app + +Open the [swagger-ui](http://localhost:8080/q/swagger-ui/) + +Test available paths (for instance : [/doc/example.md](http://localhost:8080/doc/example.md)) + +NOTE: + +* Powered by Quarkus ${context.flavourVersion} +* Using Fugerit Venus Doc ${context.version} (extensions : ${context.extensions}) + +## Native version + +If you picked only native modules, you should be able to build and run the AOT version (GraalVM 21+ needed). + +Further documentation : + +* [List of modules and native support](https://venusdocs.fugerit.org/guide/#available-extensions) +* [Fugerit Venus Doc native support introduction](https://venusdocs.fugerit.org/guide/#doc-native-support) + +1. Build and verify + +```shell +gradle -Dquarkus.native.enabled=true -Dquarkus.package.jar.enabled=false +``` + +2. Start + +```shell +./build/${context.artifactId}-${context.projectVersion}-runner +``` + +## Overview + +This project has been initialized using [fj-doc-maven-plugin init goal](https://venusdocs.fugerit.org/guide/#maven-plugin-goal-init). + +The quarkus 3 structure is similar to running the quarkus create goal : + +```shell +mvn io.quarkus.platform:quarkus-maven-plugin:${context.flavourVersion}:create \ +-DprojectGroupId=${context.groupId} \ +-DprojectArtifactId=${context.artifactId} \ +-Dextensions='rest,rest-jackson,config-yaml,smallrye-openapi' +``` + +## Quarkus readme + +This project uses Quarkus, the Supersonic Subatomic Java Framework. + +If you want to learn more about Quarkus, please visit its website: . + +## Running the application in dev mode + +You can run your application in dev mode that enables live coding using: + +```shell script +./gradlew quarkusDev +``` + +> **_NOTE:_** Quarkus now ships with a Dev UI, which is available in dev mode only at . + +## Packaging and running the application + +The application can be packaged using: + +```shell script +./gradlew build +``` + +It produces the `quarkus-run.jar` file in the `build/quarkus-app/` directory. +Be aware that it’s not an _über-jar_ as the dependencies are copied into the `build/quarkus-app/lib/` directory. + +The application is now runnable using `java -jar build/quarkus-app/quarkus-run.jar`. + +If you want to build an _über-jar_, execute the following command: + +```shell script +./gradlew build -Dquarkus.package.jar.type=uber-jar +``` + +The application, packaged as an _über-jar_, is now runnable using `java -jar build/*-runner.jar`. + +## Creating a native executable + +You can create a native executable using: + +```shell script +./gradlew build -Dquarkus.native.enabled=true +``` + +Or, if you don't have GraalVM installed, you can run the native executable build in a container using: + +```shell script +./gradlew build -Dquarkus.native.enabled=true -Dquarkus.native.container-build=true +``` + +You can then execute your native executable with: `./build/fj-doc-quarkus-tutorial-1.0.0-SNAPSHOT-runner` + +If you want to learn more about building native executables, please consult . + +## Related Guides + +- REST ([guide](https://quarkus.io/guides/rest)): A Jakarta REST implementation utilizing build time processing and Vert.x. This extension is not compatible with the quarkus-resteasy extension, or any of the extensions that depend on it. + +## Provided Code + +### REST + +Easily start your REST Web Services + +[Related guide section...](https://quarkus.io/guides/getting-started-reactive#reactive-jax-rs-resources) diff --git a/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/application.ftl b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/application.ftl new file mode 100644 index 000000000..e72f76974 --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/application.ftl @@ -0,0 +1,8 @@ +greeting: + message: "hello" + +quarkus: + native: + # if needed add -H:+UnlockExperimentalVMOptions + additional-build-args: -H:IncludeResources=${context.artifactId}/fm-doc-process-config.xml,\ + -H:IncludeResources=${context.artifactId}/template/document.ftl \ No newline at end of file diff --git a/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/build.gradle.ftl b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/build.gradle.ftl new file mode 100644 index 000000000..b94667c0a --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/build.gradle.ftl @@ -0,0 +1,40 @@ +plugins { + java + id("io.quarkus") +} + +repositories { + mavenCentral() + mavenLocal() +} + +val quarkusPlatformGroupId: String by project +val quarkusPlatformArtifactId: String by project +val quarkusPlatformVersion: String by project + +dependencies { + implementation(enforcedPlatform("${r"${quarkusPlatformGroupId}"}:${r"${quarkusPlatformArtifactId}"}:${r"${quarkusPlatformVersion}"}")) + implementation("io.quarkus:quarkus-rest") + implementation("io.quarkus:quarkus-rest-jackson") + implementation("io.quarkus:quarkus-smallrye-openapi") + implementation("io.quarkus:quarkus-config-yaml") + implementation("io.quarkus:quarkus-arc") + testImplementation("io.quarkus:quarkus-junit5") + testImplementation("io.rest-assured:rest-assured") +} + +group = "${context.groupId}" +version = "${context.projectVersion}" + +java { + sourceCompatibility = JavaVersion.VERSION_${context.javaRelease} + targetCompatibility = JavaVersion.VERSION_${context.javaRelease} +} + +tasks.withType { + systemProperty("java.util.logging.manager", "org.jboss.logmanager.LogManager") +} +tasks.withType { + options.encoding = "UTF-8" + options.compilerArgs.add("-parameters") +} diff --git a/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/gitignore.ftl b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/gitignore.ftl new file mode 100644 index 000000000..ba4fbcc31 --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/gitignore.ftl @@ -0,0 +1,41 @@ +# Gradle +.gradle/ +build/ + +# Eclipse +.project +.classpath +.settings/ +bin/ + +# IntelliJ +.idea +*.ipr +*.iml +*.iws + +# NetBeans +nb-configuration.xml + +# Visual Studio Code +.vscode +.factorypath + +# OSX +.DS_Store + +# Vim +*.swp +*.swo + +# patch +*.orig +*.rej + +# Local environment +.env + +# Plugin directory +/.quarkus/cli/plugins/ +# TLS Certificates +.certs/ diff --git a/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/gradle.ftl b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/gradle.ftl new file mode 100644 index 000000000..dc84e4691 --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/gradle.ftl @@ -0,0 +1,7 @@ +# Gradle properties + +quarkusPluginId=io.quarkus +quarkusPluginVersion=${context.flavourVersion} +quarkusPlatformGroupId=io.quarkus.platform +quarkusPlatformArtifactId=quarkus-bom +quarkusPlatformVersion=${context.flavourVersion} diff --git a/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/settings.gradle.ftl b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/settings.gradle.ftl new file mode 100644 index 000000000..d3a870ccb --- /dev/null +++ b/fj-doc-maven-plugin/src/main/resources/config/template/flavour/quarkus-3-gradle-kts/settings.gradle.ftl @@ -0,0 +1,13 @@ +pluginManagement { + val quarkusPluginVersion: String by settings + val quarkusPluginId: String by settings + repositories { + mavenCentral() + gradlePluginPortal() + mavenLocal() + } + plugins { + id(quarkusPluginId) version quarkusPluginVersion + } +} +rootProject.name="${context.artifactId}" diff --git a/fj-doc-maven-plugin/src/test/java/test/org/fugerit/java/doc/project/facade/TestAddVenusFacade.java b/fj-doc-maven-plugin/src/test/java/test/org/fugerit/java/doc/project/facade/TestAddVenusFacade.java index 6369c943e..d765ef89d 100644 --- a/fj-doc-maven-plugin/src/test/java/test/org/fugerit/java/doc/project/facade/TestAddVenusFacade.java +++ b/fj-doc-maven-plugin/src/test/java/test/org/fugerit/java/doc/project/facade/TestAddVenusFacade.java @@ -64,9 +64,9 @@ public void testAddVenus() throws IOException { context.setAddJunit5( addJunit5 ); context.setAddLombok( addLombok ); context.setAddDependencyOnTop( addDependencyOnTop ); - boolean result = AddVenusFacade.addVenusToMavenProject( context ); + boolean result = AddVenusFacade.addToProject( context ); Assert.assertTrue( result ); - Assert.assertThrows( ConfigRuntimeException.class, () -> AddVenusFacade.addVenusToMavenProject( context ) ); + Assert.assertThrows( ConfigRuntimeException.class, () -> AddVenusFacade.addToProject( context ) ); count++; } } @@ -98,7 +98,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { @Test public void testFail() { VenusContext context = new VenusContext( new File( "target" ), this.getVersion(),"base" ); - boolean result = AddVenusFacade.addVenusToMavenProject( context ); + boolean result = AddVenusFacade.addToProject( context ); Assert.assertFalse( result ); } @@ -107,7 +107,7 @@ public void testFailNoModule() throws IOException { for ( String currentConfig : Arrays.asList( "ko1-pom" ) ) { File projectDir = this.initConfigWorker(currentConfig); VenusContext context = new VenusContext( projectDir, this.getVersion(), "base,not-exists" ); - Assert.assertThrows( ConfigRuntimeException.class, () -> AddVenusFacade.addVenusToMavenProject( context ) ); + Assert.assertThrows( ConfigRuntimeException.class, () -> AddVenusFacade.addToProject( context ) ); } } diff --git a/fj-doc-maven-plugin/src/test/java/test/org/fugerit/java/doc/project/facade/TestInit.java b/fj-doc-maven-plugin/src/test/java/test/org/fugerit/java/doc/project/facade/TestInit.java index bc16c11bd..921965bef 100644 --- a/fj-doc-maven-plugin/src/test/java/test/org/fugerit/java/doc/project/facade/TestInit.java +++ b/fj-doc-maven-plugin/src/test/java/test/org/fugerit/java/doc/project/facade/TestInit.java @@ -22,7 +22,7 @@ public class TestInit { private static final String FREEMARKER_NATIVE_AVAILABLE = "8.11.9"; private String getVersion() { - return "8.10.5"; + return "8.10.9"; } private File initConfigWorker( String flavour ) { @@ -31,38 +31,54 @@ private File initConfigWorker( String flavour ) { return outputFolder; } + private MojoInit createMojoInit( File projectDir, String currentFlavour ) { + return new MojoInit() { + @Override + public void execute() throws MojoExecutionException, MojoFailureException { + this.baseInitFolder = projectDir.getAbsolutePath(); + this.projectVersion = "1.0.0-SNAPSHOT"; + this.groupId = "org.fugerit.java.test.gradle"; + this.artifactId = "fugerit-test-"+currentFlavour; + this.javaRelease = "21"; + this.version = getVersion(); + this.extensions = "fj-doc-base,fj-doc-base-json,fj-doc-base-yaml,fj-doc-base-kotlin,fj-doc-freemarker,fj-doc-mod-fop,fj-doc-mod-poi,fj-doc-mod-opencsv"; + this.addDocFacade = true; + this.force = true; + this.excludeXmlApis = true; + this.addVerifyPlugin = true; + this.addJunit5 = true; + this.addLombok = true; + this.flavour = currentFlavour; + super.execute(); + } + }; + } + + @Test + public void testMojoQuarkus3GradleKts() throws MojoExecutionException, MojoFailureException { + String currentFlavour = FlavourFacade.FLAVOUR_QUARKUS_3_GRADLE_KTS; + File projectDir = this.initConfigWorker(currentFlavour); + createMojoInit( projectDir, currentFlavour ).execute(); + Assert.assertTrue( projectDir.exists() ); + } + @Test public void testMojoInit() throws MojoExecutionException, MojoFailureException { for ( String currentFlavour : FlavourFacade.SUPPORTED_FLAVOURS ) { - File projectDir = this.initConfigWorker(currentFlavour); - MojoInit mojoInit = new MojoInit() { - @Override - public void execute() throws MojoExecutionException, MojoFailureException { - this.baseInitFolder = projectDir.getAbsolutePath(); - this.projectVersion = "1.0.0-SNAPSHOT"; - this.groupId = "org.fugerit.java.test"; - this.artifactId = "fugerit-test-"+currentFlavour; - this.javaRelease = "21"; - this.version = getVersion(); - this.extensions = "fj-doc-base,fj-doc-base-json,fj-doc-base-yaml,fj-doc-base-kotlin,fj-doc-freemarker,fj-doc-mod-fop,fj-doc-mod-poi,fj-doc-mod-opencsv"; - this.addDocFacade = true; - this.force = true; - this.excludeXmlApis = true; - this.addVerifyPlugin = true; - this.addJunit5 = true; - this.addLombok = true; - this.flavour = currentFlavour; - super.execute(); - } - }; - mojoInit.execute(); - Assert.assertTrue( projectDir.exists() ); - Assert.assertThrows( MojoFailureException.class, () -> mojoInit.execute() ); - Assert.assertThrows( MojoFailureException.class, () -> mojoInit.apply( () -> { - if ( Boolean.TRUE ) { - throw new ConfigException( "Scenario excetion" ); - } - } ) ); + if ( FlavourFacade.isGradleKtsFlavour( currentFlavour ) ) { + log.info( "skip gradle flavour {}", currentFlavour ); + } else { + File projectDir = this.initConfigWorker(currentFlavour); + MojoInit mojoInit = createMojoInit( projectDir, currentFlavour ); + mojoInit.execute(); + Assert.assertTrue( projectDir.exists() ); + Assert.assertThrows( MojoFailureException.class, () -> mojoInit.execute() ); + Assert.assertThrows( MojoFailureException.class, () -> mojoInit.apply( () -> { + if ( Boolean.TRUE ) { + throw new ConfigException( "Scenario excetion" ); + } + } ) ); + } } }