MULTIPLE SPRING BOOT FAT JAR - spring

Is it possible to create multiple fat JARS for the same spring boot application using spring boot maven plugin ?

Yes can create like following,
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>create-fat-jar1</id>
<goals>
<goal>repackage</goal>
<goal>build-info</goal>
</goals>
<configuration>
<mainClass>com.mycomp.ExampleApplication</mainClass>
<addResources>true</addResources>
<finalName>fatJar1</finalName>
</configuration>
</execution>
<execution>
<id>create-fat-jar2</id>
<goals>
<goal>repackage</goal>
<goal>build-info</goal>
</goals>
<configuration>
<mainClass>com.mycomp.ExampleApplication</mainClass>
<addResources>true</addResources>
<finalName>fatJar2</finalName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
It will create two spring boot fat jars

Related

Quarkus: maven deploy the runner jar

I need to deploy the quarkus runner jar from maven, however with a basic mvn deploy it only deploys the usual .jar and the .pom.
I tried the following plugin:
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
<executions>
<execution>
<id>deploy-executable</id>
<goals>
<goal>deploy-file</goal>
</goals>
<configuration>
<file>quarkus/target/quarkus-1.0-SNAPSHOT-runner.jar</file>
</configuration>
</execution>
</executions>
</plugin>
But it seems that it cannot work this way (file name should be provided in the command line, which is not what I need).
Is there an easy way to deploy the runner jar? Also for a native image?
You can use the builder-helper-maven-plugin like this:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<id>attach-artifacts</id>
<phase>package</phase>
<goals>
<goal>attach-artifact</goal>
</goals>
<configuration>
<artifacts>
<artifact>
<file>${project.build.directory}/${project.build.finalName}-runner.jar</file>
<classifier>runner</classifier>
<type>jar</type>
</artifact>
</artifacts>
</configuration>
</execution>
</executions>
</plugin>

Spring Boot jar - META-INF inside BOOT-INF folder

Is there any way to have META-INF folder inside BOOT-INF in spring boot packaging jar?
This might be a trivial question, but not sure how to do it. Below is the way i am packaging right now which created three folders BOOT_INF, META_INF, ORG. The reason of asking this is because runnable jar is not able to locate a folder which is inside META-INF.
<build>
<finalName>XYZ</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>XYZ</version>
<executions>
<execution>
<id>default-jar</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<excludes>
<exclude>XYZ</exclude>
<exclude>XYZ</exclude>
</excludes>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>XYZ</mainClass>
<addResources>true</addResources>
<wait>1000</wait>
<maxAttempts>250</maxAttempts>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>XYZ</version>
<configuration>
<tarLongFileMode>XYZ</tarLongFileMode>
<tarLongFileMode>XYZ</tarLongFileMode>
<descriptors>
<descriptor>XYZ</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>XYZ</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Any help which plugin i can use in order to do that?
Similar issue resolved in my case after adding META-INF folder under resources.

how to include static resource from a dependency in spring boot fat jar at the time of build

I have a spring boot application whose UI separately is built and added as a dependency to my application. Now I want to unpack the dependency and add to the resource folder of the spring boot application at the time of build so that it becomes a part of fat jar. Could someone guide me as to how this can be done with spring-boot-maven-plugin.
note: the project is using maven for build
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>nflow-explorer</id>
<phase>package</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<includeGroupIds>io.nflow</includeGroupIds>
<includeArtifactIds>nflow-explorer</includeArtifactIds>
<outputDirectory>
${project.build.directory}/resources/main/static/explorer
<!-- or: ${project.basedir}/wherever/you/want/it -->
</outputDirectory>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.2.6.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
You don't have to unpack the JAR.
Simply use the Maven Resource Plugin http://maven.apache.org/plugins/maven-resources-plugin/index.html
You can specify directories to include like this:
<project>
...
<build>
...
<resources>
<resource>
<directory>[your folder here]</directory>
</resource>
</resources>
...
</build>
...
</project>

Springboot failsafe multi-module integration test

I have to run integration-test with fail safe and my project is a multi module project, with one module for selenium test and another one with the actual web app.
I want to run the web app then the test over this app and then stopping this app and getting the report of the integration tests.
In order to do this I used this, inside the pom of the selenium test module :
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<id>reserve-tomcat-port</id>
<goals>
<goal>reserve-network-port</goal>
</goals>
<phase>process-resources</phase>
<configuration>
<portNames>
<portName>tomcat.http.port</portName>
</portNames>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.5.9.RELEASE</version>
<executions>
<execution>
<id>pre-integration-test</id>
<goals>
<goal>start</goal>
</goals>
<configuration>
<includes>
<include>
<groupId>com.example</groupId>
<artifactId>web-app</artifactId>
</include>
</includes>
<mainClass>com.example.App</mainClass>
<arguments>
<argument>--server.port=${tomcat.http.port}</argument>
</arguments>
</configuration>
</execution>
<execution>
<id>post-integration-test</id>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<test.server.port>${tomcat.http.port}</test.server.port>
</systemPropertyVariables>
</configuration>
</plugin>
The error I get is that the main class is not found :
java.lang.ClassNotFoundException: App
It feels like inside the selenium test I can't get to the webapp classPath, It seems like its trying to run the selenium test main instead of the webapp's one

how do I create a maven project for apache cxf wsdl first

I want to create a apache cxf maven project from scratch using a wsdl. I need to use the wsdl2java. I can not find an archetype for wsdl first. When I try
mvn archetype:generate -Dfilter=org.apache.cxf.archetype:
I see only these. Is there not an archetype for wsdl first? If not can some recommend the most efficient approach? Thanks
Choose archetype:
1: remote -> org.apache.cxf.archetype:cxf-jaxrs-service (Simple CXF JAX-RS webap
p service using Spring configuration)
2: remote -> org.apache.cxf.archetype:cxf-jaxws-javafirst (Creates a project for
developing a Web service starting from Java code)
I always create submodule for generated wsdl. Eclipse has a problem with paths - and this module do not need to be compiled many times.
For client:
<properties>
<wsdl.dir>${basedir}/src/main/resources/axis2</wsdl.dir>
<generateServerSide>false</generateServerSide>
<sourceRoot>${basedir}/target/generated/src/main/java</sourceRoot>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.version}</version><!--$NO-MVN-MAN-VER$ -->
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${sourceRoot}</sourceRoot>
<defaultOptions>
<bindingFiles>
<bindingFile>${wsdl.dir}/binding.xml</bindingFile>
</bindingFiles>
</defaultOptions>
<wsdlOptions>
<wsdlOption>
<wsdl>${wsdl.dir}/first.wsdl</wsdl>
<packagenames>
<packagename>com.company.gen.first</packagename>
</packagenames>
<extraargs>
<extraarg>-impl</extraarg>
<extraarg>-autoNameResolution</extraarg>
<extraarg>-wsdlLocation</extraarg>
<wsdlurl />
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin> <!-- for idea/eclipse -->
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<id>add-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>${sourceRoot}</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
For server:
<execution>
<id>first</id>
<goals>
<goal>wsdl2code</goal>
</goals>
<configuration>
<generateServerSide>${generateServerSide}</generateServerSide>
<generateAllClasses>${generateServerSide}</generateAllClasses>
<generateServicesXml>${generateServerSide}</generateServicesXml>
<generateServerSideInterface>${generateServerSide}</generateServerSideInterface>
<wsdlFile>${wsdl.dir}/first.wsdl</wsdlFile>
<packageName>com.company.gen.first</packageName>
<unpackClasses>true</unpackClasses>
<syncMode>sync</syncMode>
<namespaceURIs>
<namespaceURI>
<uri>http://uri.company.com</uri>
<packageName>com.company.gen.first</packageName>
</namespaceURI>
</namespaceURIs>
</configuration>
</execution>

Resources