我有一个SpringBoot应用。一类需要进口javax.servlet.Filter接口并实现定制过滤器。它成功地建立本地,但未能启动云服务器上,并抛出llegalStateExceptions。这是过滤器类导致此问题。一旦我删除了过滤器,应用程序成功运行在本地和云计算。
我想这可能是可能的应用程序无法在Maven中找到的javax.servlet API,或者它是一个servlet / tomcat的嵌入不兼容问题。我们大部分依赖从org.springframework.boot。我们唯一的Tomcat相关的部分是:
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>LATEST</version>
</dependency>
我们不具备以下条件:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
我试图将它们添加(单独或两者),改变范围,编译或删除范围。依赖的种种细微的变化,但没有任何至今的作品。请让我知道,如果你有什么好的建议。
我不得不在SpringBoot应用程序中使用摇篮满足这样的问题,最后我发现它的问题是失去的javax.servlet-API的,根本原因就在于它的范围是不正确的,当它的范围是provided
,IDEA不会建立完整,所以servlet的API JAR文件不包含在构建文件。从provided
变化范围runtime
后,固定。您可以参考这个博客http://blog.csdn.net/u013360850/article/details/71520210
该provided
范围意味着你打算该库由在其中部署代码的环境中提供。你为什么会做这样的事?那么,在默认情况下的tomcat把含有的javax.servlet类库在classpath对你来说,和许多其他的服务器做同样的。这使容器供应商(是Tomcat,JBoss和WebSphere中,等)提供一个图书馆的定制实现的一种方式,具体到它们的容器。
Maven的解释provided
范围,因为你不想要在任何束或部署,uberjars,拉链,或任何图书馆的意义。春季启动产生尤伯杯罐子 - 也就是说,它包在你的应用程序的单一假象所有应用程序的依赖关系(而不是让他们在其中是如何我们用来做Java中的古老的过去单独的文件之前,我们知道更好) 。
所以,如果你发现你错过了这个包在运行时可能是因为它实际上不是由你的容器provided
,你必须通过完全删除范围标签,以自己为它供给。这将告诉Maven来捆绑它,在你的超级-JAR在运行时使用。
看你的具体问题,无论这些库的应该是provided
所以你应该从你所有的依赖关系彻底删除范围的标签。如果不工作,你有其他问题。
BTW:顺便说一句,这是一个非常糟糕的主意,用LATEST
作为任何依赖的版本号。它违背了几十个最佳做法和对某些二进制存储(关系为例)它几乎没有工作,并且不保证。而应该找出其中的tomcat-JDBC的版本你打算使用和使用绝对替代版本。在这种情况下,LATEST
版本几乎可以肯定是错误的要使用。
只要运行该项目如果运行在你的摇篮建设提供(如果您正在使用gradle这个)它可能会自动解决您的问题。做了同样的在我的情况
与spring-boot
的问题是有时会出现的罐子中提供多次由于许多uber
罐子,因为已经嵌入Tomcat
我们可以简单地添加这么解决问题:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
而不能同时你尝试过。