Gradle替换Jetty插件为Gretty时遇报错,寻求解决办法
解决Gretty插件运行
:appRunWar时找不到com.sun.jersey.spi.inject.InjectableProvider的问题 看样子你在从旧版Jetty插件迁移到Gretty时碰到了Jersey类加载的坑,这个错误本质是运行时找不到Jersey 1.x的核心依赖类,我给你几个针对性的解决方案:
1. 先检查Jersey 1.x依赖是否完整
com.sun.jersey.spi.inject.InjectableProvider是Jersey 1.x的核心类,你的项目大概率是漏加了关键依赖,或者依赖版本不一致。打开你的build.gradle,确保包含以下依赖:
dependencies { // Jersey 1.x核心依赖,版本号可根据实际情况调整,但要保证三者一致 implementation 'com.sun.jersey:jersey-core:1.19.4' implementation 'com.sun.jersey:jersey-server:1.19.4' implementation 'com.sun.jersey:jersey-servlet:1.19.4' // 若项目用到JAX-RS API,需添加此依赖 implementation 'javax.ws.rs:javax.ws.rs-api:1.1.1' }
2. 调整Gretty的类加载配置
Gretty的类加载逻辑和旧Jetty插件不一样,默认情况下可能不会自动把所有runtime依赖复制到Web应用的WEB-INF/lib目录,这会导致运行时找不到类。你可以在Gretty配置里添加依赖复制规则:
gretty { httpPort = 8080 reload = 'automatic' // 显式将runtime依赖复制到webapp的lib目录 webappCopy { from configurations.runtimeClasspath into 'WEB-INF/lib' } }
另外也可以尝试调整inplaceMode参数(可选),比如设置inplaceMode = 'hard',强制Gretty使用完整的webapp结构运行。
3. 推荐:迁移到Jersey 2.x(长期解决方案)
Jersey 1.x已经停止维护多年,不仅存在安全隐患,后续和新插件的兼容性也会越来越差。如果你的项目允许迁移,建议升级到Jersey 2.x:
- 替换依赖:
dependencies { implementation 'org.glassfish.jersey.core:jersey-server:2.41' implementation 'org.glassfish.jersey.containers:jersey-container-servlet-core:2.41' implementation 'javax.ws.rs:javax.ws.rs-api:2.1.1' }
- 修改
web.xml里的Servlet配置,替换旧版Jersey Servlet:
<servlet> <servlet-name>Jersey Web Application</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>你的REST接口所在包路径</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
完整的迁移后build.gradle示例
最后给你一个完整的配置参考,替换掉旧的Jetty插件:
plugins { id 'java' id 'war' id 'eclipse' id 'org.gretty' version '4.0.3' // 建议使用最新稳定版 } repositories { mavenCentral() } dependencies { // 这里根据实际情况选择Jersey 1.x或2.x依赖 implementation 'com.sun.jersey:jersey-core:1.19.4' implementation 'com.sun.jersey:jersey-server:1.19.4' implementation 'com.sun.jersey:jersey-servlet:1.19.4' implementation 'javax.ws.rs:javax.ws.rs-api:1.1.1' // 其他项目依赖... } gretty { httpPort = 8080 reload = 'automatic' scanInterval = 2 // 自动扫描文件修改的间隔时间(秒) }
按照上面的步骤调整后,再运行:appRunWar应该就能解决这个类找不到的问题了。
内容的提问来源于stack exchange,提问作者Ros
相关产品推荐
相关产品推荐

