Springboot应用程序中的javax.servlet

时间:2017-07-25 03:00:09

标签: java maven servlets spring-boot

我有一个SpringBoot应用程序。一个类需要导入javax.servlet.filter并实现用于自定义的过滤器。它在本地成功构建,但无法在云服务器上启动并抛出llegalStateExceptions。这是过滤器类引起的问题。删除过滤器后,应用程序将在本地和云端成功运行。

我认为app可能无法在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>

我尝试添加它们(单独和两者)并更改范围以进行编译或删除范围。各种依赖关系都有微小的变化,但到目前为止还没有任何工作。如果您有任何好的建议,请告诉我。

4 个答案:

答案 0 :(得分:0)

我在SpringBoot应用程序中使用Gradle遇到了这样的问题,最后我发现javax.servlet-api丢失了问题,根本原因是它的范围不正确,当它的范围是provided时, IDEA不会构建完整的,因此servlet-api Jar文件不包含在构建文件中。在将范围从provided更改为runtime之后,它已修复。您可以参考此博客http://blog.csdn.net/u013360850/article/details/71520210

答案 1 :(得分:0)

provided范围意味着您希望该库由您部署代码的环境提供。你为什么要做这样的事情?好吧,默认情况下,tomcat会在类路径中为您提供包含javax.servlet类的库,而许多其他服务器也会这样做。它允许容器提供程序(tomcat,jboss,websphere等)提供特定于其容器的库的自定义实现。

Maven将provided范围解释为您不希望将库包含在任何捆绑包或部署,uberjars,zips等中。 Spring-boot会生成一个超级jar - 也就是说,它会将所有应用程序依赖项打包到应用程序的单个人工制品中(而不是将它们保存在单独的文件中,这就像我们以前用过的java一样)我们知道的更好。)

因此,如果您发现您在运行时错过了该软件包,可能是因为您的容器实际上不是provided而您必须通过删除范围来自己提供它完全标记。这将告诉maven将它捆绑在您的超级jar中以便在运行时使用。

查看您的具体问题,这些库都不应该是provided,因此您应该从所有依赖项中完全删除范围标记。如果这不起作用,你还有其他问题。

BTW:顺便说一下,使用LATEST作为任何依赖项的版本号是一个非常糟糕的主意。它违反了许多最佳实践和某些二进制商店(例如nexus),它几乎无法运行且无法保证。你应该找出你想要使用的tomcat-jdbc版本,而不是使用绝对版本。在这种情况下,LATEST版本几乎肯定是错误的版本。

答案 2 :(得分:0)

仅运行项目(如果在Gradle构建中提供了运行时)(如果使用gradle),它可能会自动解决您的问题。我的情况也一样

答案 3 :(得分:0)

func()的问题在于,由于有许多spring-boot个jar,有时会多次提供jar,因此,要解决此问题,因为已经嵌入了uber,我们可以简单地添加:

Tomcat

而不是您尝试的全部。

相关问题