如何在 groovy 中排除 servlet-api-2.4

How to exclude servlet-api-2.4 in groovy

我想在我的 groovy 2.4 应用程序中使用码头 9(带有 servlet api 3.1)。但是 groovy 2.4 附带了捆绑的 servlet-api-2.4.jar。这会导致错误,例如

java.lang.NoSuchMethodError: javax.servlet.http.HttpServletResponse.getStatus()I

我尝试通过 grapes 获取 javax.servlet-api 版本 3.1.0 但无济于事。显然,groovy 的 servlet-api jar 覆盖了 grape.

我该怎么做?

通过请求到达端点时抛出上述错误的完整代码:

@Grab(group="javax.servlet", module="javax.servlet-api", version="3.1.0", force=true)
import javax.servlet.http.HttpServlet
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse
import javax.servlet.ServletException

@Grab(group="org.eclipse.jetty", module="jetty-servlet", version="9.4.8.v20171121")
import org.eclipse.jetty.servlet.ServletContextHandler

@Grab(group="org.eclipse.jetty", module="jetty-server", version="9.4.8.v20171121")
import org.eclipse.jetty.server.Server


public class WebHookServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        def slurper = new groovy.json.JsonSlurper()
        def msg = slurper.parse(req.inputStream)

        // Do something with the message

        resp.setStatus(HttpServletResponse.SC_NO_CONTENT)
    }
}

Server server = new Server(8080)
ServletContextHandler context = new ServletContextHandler(server, "/ws", ServletContextHandler.SESSIONS)
context.addServlet(WebHookServlet.class, "/webhook")
server.start()
server.join() 

尝试只添加...

@GrabExclude("javax.servlet:servlet-api")

这应该排除 Servlet 2.x 系列依赖项的默认(较旧)coordinates/location。

但 Servlet 2.5 也有许多其他位置。 尝试在命令行上列出您的依赖项,查找其他坐标位置 <groupId>:<artifactId>(无版本)以查看问题可能来自何处。

Groovy>2.5 将 servlet api 升级到 3.0.1 https://issues.apache.org/jira/browse/GROOVY-7899

不确定 Jetty 9 使用的 3.0.1 和 3.1 之间的区别,但经过几次简短的测试后,它似乎工作正常。