Currently, I am working on a Spring MVC project and want to divide the project to smaller modules. I have been searching for the info and found this page. Although this page describes how to build multiple maven module but I think it lacks of configuration information such as: how can I load persistence.xml to my persistence module? How can I read my applicationcontext.xml in service module? In my original code, the web.xml will locate and load the persistence.xml and applicationcontext.xml, but maven module doesn't have web.xml. So do I have to build java configuration class for each module? If anyone can provide basic information of working with multiple maven modules and Spring MVC, I am really thankful for that.
Assuming that the whole purpose of creating multiple modules for your project is to isolate the code by its functional parts, then yes, you will want to have separate config files for each deployable instance. This means that the only place (outside tests) where config files/classes will exist in your project, will be in your web app. Since your web app is likely using your other modules as dependencies packaged as JARs, config files in those JARs would not be very convenient.
Note: It is possible to bake config files into your other modules, but in my experience, this only causes confusion and headaches down the road.
Related
As Springboot multimodule produces single fat jar will that be good idea to use spring boot multimodule project for microservices
Yes, Actually it is a very good idea to use the multimodule project.
Below are some advantages of that:
Gives clarity about the code and project module
Decouples the layer.
Easy to modify/add the module. Suppose your persistence module is already implemented with Couchbase and now you wanted to switch to Mongo DB then you just need to change the persistence module(dependency, code, configuration) not other parts of a project.
Easy to maintain.
No, I believe. Actually, it is bad design to generate single fat jar for multimodule project in Spring Boot. Suppose, we have multimodule project having 3 sub-modules for different microservices. Then each module will have its individual pom right? that we need to refer in main project's pom as module. Now, assume anyhow we are able to define packaging in main module pom as single fat jar for all the sub-modules. Then, you are not following the microservices architecture guidlines. It will be a kind of monolithic architecture, because all your services are there in a single unit (a jar). Although it would be easy to maintain, but difficuilt to configure through Jenkins pipelines. I mean you have to customize your Jenkins pipelines.
You may refer following url for more details : https://thebasictechinfo.com/spring-boot/spring-boot-microservices-architecture-spring-cloud-netflix-oss
We are trying to migrate our existing Spring MVC applications to Spring Boot application. Our existing applications are using 3.2.9, so tons of XML configurations. All the beans are defined in the XML files. What we have done is first we have upgraded our existing applications to Spring 4.2.5 version since Spring Boot will work only with Spring 4 versions.
Our requirement is to have both FAT JARs and WAR files from the build. Most of our existing customers would prefer Application Server deployment, so we have to create WAR file for them. Also for our internal testing and new deployments, we are planning to use FAT JARs.
How can we achieve them in the Maven file, we are able to provide separately as below. Is there any maven plug-in to generate both in single build?
<packaging>jar</packaging>
or
<packaging>war</packaging>
We are publishing our artifacts into Nexus repository. So, we want to have the separate repository location for JAR files and WAR files. Can we do that using the single pom.xml file?
Also another question, we have all the XML configurations under WEB-INF folder. When we are moving to the Spring Boot application, it has to be under the resources folder. How can we handle them easily. When we build FAT jars, the resources are not looked under WEB-INF because it simply ignores the webapp project.
I am looking forward for some guidance to complete the migration. Infact, we have already done that changes and it is working fine, but we are confused on this WAR / JAR generations.
Update:
I have got another question in mind, if we are converting our existing applications to spring boot, do we still have to maintain WEB-INF folder in the web-app or can move everything to the resources folder?. While building the WAR file, whether spring boot takes care of moving the resources to WEB-INF? How spring boot would manage to create the WAR file if you are putting all the resources under the resources folder.
Building WAR and FAT JAR is very easy with Gradle.
With Maven, I would try multi module setup, where one sub-module will build fat JAR and second will build WAR file.
Application logic can be as third sub-module and thus being standalone JAR with Spring configuration and beans. This application logic JAR would be as dependency for fat JAR and WAR module.
WAR specific configuration can be placed in Maven WAR sub-module.
I didn't have such requirement before, so don't know what challenges may occur. For sure I wouldn't try to integrate maven-assembly-plugin or other packaging plugins with spring-boot-maven-plugin.
Concerning location of config files, just place them into src/main/resources or it's sub-folders according Spring Boot conventions. Spring Boot is opinionated framework and will be most friendly to you if you don't try to resist defaults.
Maven does not handle this gracefully, but its far from difficult to solve. You can do this with 3 pom files. One parent pom that contains the majority of the configuration, and one each for the packaging portion of the work. This would neatly separate the concerns of the two different assembly patterns too.
To clarify -- I'm not recommending a multi-module configuration here, just multiple poms with names like war-pom.xml and fat-jar-pom.xml, along with parent-pom.xml.
I am working on a webapp which uses Primefaces as a view, and I inject Spring beans from other projects into JSF Managed beans.
I have an architectural problem:
I've created separate projects(modules) for each component that I use (Business Logic, Persistence, and others) and also create separate projects with their interfaces.
I want my webApp to depend only on the interface of the Business Logic, and to inject the implementation of the BL using Spring Dependency Injection.
I want to achive this recursively: Business logic to depend only on other interfaces, and to inject implementations using spring.
The problem is that having no dependency in the Maven pom file to the actual implementations, when I deploy the application (on a web logic server) the implementation jars are not deployed, and Spring doesn't find the beans to wire.
Is there a way to achieve decoupling without adding dependencies to actual implementations?
Can I include Spring's bean configuration files from other projects if the projects are not added as dependencies?
Did I figured this decoupling all wrong?
I appreciate your ideas.
Well obviously you need the dependencies in your maven pom else nothing will be included. You can add the dependencies with a scope of runtime which includes them in your final war but not during development (scope compile).
For loading the context of modules you might come-up with a naming convention and/or standard location for your files. With that you could do something like this in your web applications beans xml
<import resource="classpath*:/META-INF/spring/*-context.xml" />
This would load all files ending with -context.xml from the /META-INF/spring directory on the classpath (including jar files).
I have checked a lot of different links for creating spring mvc with maven but I don't understand why everybody have different xml-files, someone create a webapp login/logout with only pom.xml and web.xml and someone else do the same thing but this one has an applicationservice.xml and an application-dispatcher.xml too. So I'm very confused what roles are and what is the best structure for spring mvc with maven (even JPA and JAX-RS and JAX-B included). How many xml-files I need for a project and so on.
Please
Anyone how have any idea about it?
Spring is about choice, lot of solutions are available. you can have zero spring xml files and configure it programmatically or put all spring configuration in several xml files (with <import> for instance). For persistence, you can create a simple META-INF/persistence.xml with mostly nothing and put all the JPA configuration in your xml spring files, or concentrate all JPA configurations in META-INF/persistence.xml.
For my projects my choice is:
One central XML file for main spring configuration (configuration of beans)
It contains lots of <import> to several other XML files wher I put dedicated configurations:
project-security.xml
project-persitence.xml (with a mostly empty META-INFO/persistence.xml
project-web.xml
...
I'm new to Spring and try to setup a project which is split into 3 submodules. As build tool I'm using maven. My problem is, that I don't know where to add Springs "magic".
My 3 submodules are "ORM" (holds all the hibernate staff to access the database) "BusinessLogic" (which should hold the complete logic) and "WebApp" (adds as the only "client" to the app / logic).
I want to use SpringMVC for the WebApp which seems to be no problem. As "BusinessLogic" should hold the complete logic I thought of adding the Spring related stuff (Bean definition / DI) in that module. But then I don't know how to setup Spring when accessing the module form the webapp.
The hole project is being ported from a JavaEE / JBoss app where "ORM" and "BusinessLogic" (implemented as EJBs) where put into one .ear archive and the webapp into a seperate one (.war). JNDI was used to access the beans from the webapp, but I completely want to decouple the application from JBoss and deploy it on a Tomcat webserver.
At the moment I've created all three modules as separate Maven projects ("ORM" and "BusinessLogic" as .jar, "WebApp" as .war packaging), linked by a "parent" project.
Thanks for any hints on project setup :).
Greetings
Ben
you could configure spring context in your web.xml and you can perform import of Spring sub-modules context. You can add import's configuration of sub-modules in your webApp application context.