I have to create a Spring Boot project that will have a web interactive part and a batch part a,d both with the same DB (so they share the DAOs and Services), I wonder how to do it and I guess that the best approach is to create a Multi Module Project
something like this
<modules>
<module>core</module>
<module>batchApplication</module>
<module>userApplication</module>
</modules>
But, do I have to create more than 1 pom and project ??? or I can do it in the same pom ?
You will need a parent pom which has the spring-boot as a parent, then a directory and with pom for each child project. Your parent pom will be like:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.3.RELEASE</version>
</parent>
<groupId>com.barclaycard</groupId>
<artifactId>bc-alu</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Barclaycard Address LookUp</name>
<modules>
<module>bc-alu-ref</module>
<module>bc-alu-web</module>
</modules>
</project>
See here for mutil module project https://maven.apache.org/guides/mini/guide-multiple-modules.html
Related
I am trying to make a new multi-module Spring project with Maven. I have one main Pom.xml, and to other modules.
This is the main pom.xml :
<?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>org.ev</groupId>
<artifactId>multi</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>main</module>
<module>user</module>
</modules>
And this is the module1 pom.xml :
<?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>multi</artifactId>
<groupId>org.ev</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>user</artifactId>
</project>
Where should i add the dependencies? When i put them into main pom.xml , i get an error "cant resolve pom" .
Do you have any idea about this issue? Because its very hard to create multi module project for me.
try to change main/pom.xml
<artifactId>multi</artifactId>
to
<artifactId>main</artifactId>
Once you set packaging equal to pom, do you need the groupID, artifactId and version tags and if so, what purpose do they serve? Are there any tags you should use (after all groupID is clearly intended for java so I wouldn't be surprised if there are other language or artifact type specific tags that should be used). Samples:
Simple parent pom:
<?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>org.company</groupId>
<artifactId>project_name</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<modules>
<module>hosts</module>
</modules>
</project>
Simple child pom:
<?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>org.company</groupId>
<artifactId>hosts</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
</project>
Then sub children are various projects of many types, java, C++, angular, python, more poms.
You need all those tags.
The POMs are deployed along with the JARs, WARs etc. with their respective Maven coordinates (GroupId, ArtifactId, Version). They are resolved if anybody uses e.g. a dependency with your parent.
I have a test project which is based on a parent project. This parent is build beforehand and is available on local artifactory server. The parent project is not available locally and this should stay this way.
As you see I am not using the relativePath element.
Still, when running "mvn clean install -U" I get an error about missing parent.
[ERROR] Non-resolvable parent POM for com.test.example:test:0.0.1-SNAPSHOT: Could not find artifact com.test:projects-parent:pom:0.0.1-SNAPSHOT and 'parent.relativePath' points at wrong local POM # line 6, column 10 -> [Help 2]
The test project pom.xml is:
<?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.test.example</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>test</name>
<parent>
<groupId>com.test</groupId>
<artifactId>projects-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
...
</dependencies>
<build>
...
</build>
</project>
Here is the parent pom.xml
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<groupId>com.test</groupId>
<artifactId>projects-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
</project>
According to this, the default value for <relativePath> is ../pom.xml, so Maven will look locally first.
If you want to force the lookup to occur in your repository manager, use this trick:
<parent>
<groupId>com.test</groupId>
<artifactId>projects-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!— This forces a lookup against the repo —>
</parent>
I'm working on a multi-module project which contains a service and an integration-tests module.
In the service module there is a service for some reset password functionality, based on Spring greenhouse which is using a template file which is expected to be loaded on initialization. While trying to solve this issue I changed slightly the initialization of the class based on the loaded file and moved it to xml configuration:
<bean id="resetPasswordMailMessageConverter" class="com.myapp.service.reset.ResetPasswordMailMessageConverter">
<constructor-arg name="resource">
<value>classpath*:**/spring/reset-password.st</value>
</constructor-arg>
</bean>
The service works fine once deployed and used in tomcat but there are issues when integration tests are executed : Unable to read template resource class path resource [classpath*:**/spring/reset-password.st]
I placed that file in both places serviceModule/META-INF/spring/ and integrationTestsModule/META-INF/spring/ but still it can't be found.
I placed some code both in service and in integration tests where I export the result of ClassLoader.getSystemResources("META-INF") and noticed that in both cases the integrationModule/target/test-classes/META-INF and the .m2/repository/../serviceModule.jar!META-INF are included in the exported path and the file is contained inside both META-INF/spring/ but not found.
I tried also keeping the file in the same package with the converter and initializing converter's resource as new ClassPathResource("reset-password.st", getClass().getClassLoader()) or new ClassPathResource("reset-password.st") but didn't work.
The structure of the project is mainModule->[mainSubmoduleA->[serviceModule, integrationTestsModule, etc], mainSubmoduleB[other modules]]
Any idea?
There's a basic layout of the project structure
Parts of the pom files:
main:
...........
<groupId>com.myapp</groupId>
<artifactId>mainModule</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
.............
<modules>
<module>mainSubmoduleA</module>
<module>mainSubmoduleB</module>
</modules>
mainSubmoduleA:
..............
<parent>
<groupId>com.myapp</groupId>
<artifactId>mainModule</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
.........
<modelVersion>4.0.0</modelVersion>
<groupId>com.myapp.mainsuba</groupId>
<artifactId>mainSubmoduleA</artifactId>
<packaging>pom</packaging>
<name>mainSubmoduleA</name>
..........
<modules>
<module>subModuleAA</module>
</modules>
...............
subModuleAA:
<parent>
<groupId>com.myapp.mainsuba</groupId>
<artifactId>mainSubmoduleA</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.myapp.mainsuba.subaa</groupId>
<artifactId>subModuleAA</artifactId>
<packaging>pom</packaging>
<name>subModuleAA</name>
..........
<modules>
<module>service</module>
<module>web</module>
<module>integration</module>
</modules>
service:
<parent>
<groupId>com.myapp.mainsuba.subaa</groupId>
<artifactId>subModuleAA</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.myapp.mainsuba.service</groupId>
<artifactId>service</artifactId>
<packaging>jar</packaging>
<name>service</name>
web:
<parent>
<groupId>com.myapp.mainsuba.subaa</groupId>
<artifactId>subModuleAA</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.myapp.mainsuba.web</groupId>
<artifactId>web</artifactId>
<packaging>war</packaging>
<name>web</name>
integration:
<parent>
<groupId>com.myapp.mainsuba.subaa</groupId>
<artifactId>subModuleAA</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>integration</artifactId>
<packaging>jar</packaging>
<name>integration</name>
<description>Integration Tests</description>
Chris,
try setting the resource value without any ant-style wildcard matchers. I.e.:
<value>META-INF/spring/reset-password.st</value>
More info on wildcard restrictions can be found here: Other notes relating to wildcards
I am creating multimodule project using maven in eclipse.After configuring parent in that configuration tab,to add modules I have selected Add and selected the modules to be added and I have checked the 'Update POM parent section in selected projects'.But it doesnot include the parent information in the selected modules.
I was not aware that such a feature exists, but you can do it by your own, with more reliability adding those lines to your parent pom :
parent pom.xml
Here put your modules configuration
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.company.bla.bla</groupId>
<artifactId>you-parent-artifact</artifactId>
<version>1.0</version>
<modules>
<module>module-child-1</module>
<module>module-child-2</module>
</modules>
childs pom.xml
Here put you parent reference and ommit version
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.company.bla.bla</groupId>
<artifactId>you-parent-artifact</artifactId>
<version>1.0</version>
</parent>
<artifactId>child-1</artifactId>
More information here : http://www.sonatype.com/books/mvnex-book/reference/multimodule.html