Reputation: 547
I sometimes see these following declaration in pom.xml...
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
....
as you can see, spring-boot-starter-web was declared as well as tomcat-embed-jasper.
isn't it spring-boot-starter-web already have an embedded tomcat? why some developers still declare tomcat-embed-jasper along with boot-starter-web? or is there any reason?
Upvotes: 29
Views: 70513
Reputation: 1
In Spring Initializr, do not use last version specially with (snapshot) like 3.2.0(snapshot) use lower version like 2.7.17 in this state with lower version no problem by entering jasper dependency
Upvotes: -1
Reputation: 11
To those who are still facing this error in 2022 with Java Version 17, Maven Version 3.0.0 and Package Jar. I also ran into the same issue just now, seems like even though we set <scope>Provided</scope>
Maven is not picking up the jar. What you can do instead is just take that completely off while adding the dependency and run the Maven to install dependencies again. It will fix it for sure. So your pom.xml file will go:-
From
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
To
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
Upvotes: 1
Reputation: 3882
As you said, the spring-boot-starter-web
includes the spring-boot-starter-tomcat
. You could check it here
The spring-boot-starter-tomcat
includes the tomcat-embed-core
. You could check it here
But, seems like tomcat-embed-core
doesn't include tomcat-embed-jasper
. In fact, is tomcat-embed-jasper
who includes dependency with tomcat-embed-core
. Check it here
Anyway, the tomcat-embed-jasper
is marked as provided
, so indicates that you expect the JDK or a container to provide the dependency at runtime. This scope is only available on the compilation and test classpath, and is not transitive.
In conclusion, the spring-boot-starter-web
includes the tomcat embedded dependency but it doesn't includes the jasper embedded dependency, so that should be the reason to declare it separately.
Also, remember that using Spring IO Platform as parent you are able to manage dependencies easily. To know more about this you could read my post
Hope it helps,
Upvotes: 28
Reputation: 5850
Extended from jcgarcia's answer.
Even it is provided, but when you build as war, spring-boot-maven-plugin will include two more jar : ecj-3.12.3.jar tomcat-embed-jasper-8.5.23.jar
Upvotes: 2