You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:07:47