jersey-quickstart-grizzly模板的Maven Web Service报内部服务器错误
问题:Jersey-Grizzly REST服务启动后访问出现Internal Server错误
我是Java新手,正在尝试用Maven基于jersey-quickstart-grizzly模板搭建基础RESTful Web Service。配置好pom.xml后执行命令mvn -e compile exec:java启动项目,但在浏览器访问localhost时出现了“Internal Server”错误。
我的pom.xml配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.test.rest</groupId> <artifactId>test-rest</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>test-rest</name> <dependencies> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-grizzly</artifactId> <version>1.19</version> </dependency> <!-- uncomment this to get JSON support: --> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-json</artifactId> <version>1.19</version> </dependency> <!-- uncomment this to get Fastinfoset support: <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-fastinfoset</artifactId> <version>${jersey-version}</version> </dependency> --> <!-- uncomment this to get ATOM support: <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-atom</artifactId> <version>${jersey-version}</version> </dependency> --> <!-- uncomment this to get multipart MIME types support: <dependency> <groupId>com.sun.jersey.contribs</groupId> <artifactId>jersey-multipart</artifactId> <version>${jersey-version}</version> </dependency> --> <dependency> <groupId>com.sun.grizzly</groupId> <artifactId>grizzly-servlet-webserver</artifactId> <version>1.9.45</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.2</version> <scope>test</scope> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> <version>1.19.4</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <inherited>true</inherited> <version>2.3.2</version> <configuration> <source>10</source> <target>10</target> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.1</version> <executions> <execution> <goals> <goal>java</goal> </goals> </execution> </executions> <configuration> <mainClass>com.test.rest.Main</mainClass> </configuration> </plugin> </plugins> </build> <properties> <jersey-version>1.20-SNAPSHOT</jersey-version> </properties> </project>
错误日志
Sep 29, 2023 9:52:26 PM com.sun.jersey.api.core.PackagesResourceConfig init INFO: Scanning for root resource and provider classes in the packages: com.test.rest Sep 29, 2023 9:52:26 PM com.sun.grizzly.http.servlet.ServletAdapter doService SEVERE: service exception: java.lang.IllegalArgumentException at jersey.repackaged.org.objectweb.asm.ClassReader.(ClassReader.java:170) at jersey.repackaged.org.objectweb.asm.ClassReader.(ClassReader.java:153) at jersey.repackaged.org.objectweb.asm.ClassReader.(ClassReader.java:424) at com.sun.jersey.spi.scanning.AnnotationScannerListener.onProcess(AnnotationScannerListener.java:138) at com.sun.jersey.core.spi.scanning.uri.FileSchemeScanner$1.f(FileSchemeScanner.java:86) at com.sun.jersey.core.util.Closing.f(Closing.java:71) at com.sun.jersey.core.spi.scanning.uri.FileSchemeScanner.scanDirectory(FileSchemeScanner.java:83) at com.sun.jersey.core.spi.scanning.uri.FileSchemeScanner.scan(FileSchemeScanner.java:71) at com.sun.jersey.core.spi.scanning.PackageNamesScanner.scan(PackageNamesScanner.java:226) at com.sun.jersey.core.spi.scanning.PackageNamesScanner.scan(PackageNamesScanner.java:142) at com.sun.jersey.api.core.ScanningResourceConfig.init(ScanningResourceConfig.java:80) at com.sun.jersey.api.core.PackagesResourceConfig.init(PackagesResourceConfig.java:104) at com.sun.jersey.api.core.PackagesResourceConfig.(PackagesResourceConfig.java:78) at com.sun.jersey.api.core.PackagesResourceConfig.(PackagesResourceConfig.java:89) at com.sun.jersey.spi.container.servlet.WebComponent.createResourceConfig(WebComponent.java:696) at com.sun.jersey.spi.container.servlet.WebComponent.createResourceConfig(WebComponent.java:674) at com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:205) at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:394) at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:577) at javax.servlet.GenericServlet.init(GenericServlet.java:241) at com.sun.grizzly.http.servlet.ServletAdapter.loadServlet(ServletAdapter.java:486) at com.sun.grizzly.http.servlet.ServletAdapter.doService(ServletAdapter.java:425) at com.sun.grizzly.http.servlet.ServletAdapter.service(ServletAdapter.java:379) at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:179) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run(ContextTask.java:71) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.base/java.lang.Thread.run(Thread.java:833)
问题原因及解决方案
核心原因
Jersey 1.x版本依赖的ASM库无法兼容Java 9及以上版本的字节码格式,而你的pom.xml中配置的编译版本是Java 10,导致类文件解析失败,抛出IllegalArgumentException。同时,项目中Jersey依赖版本不统一(1.19、1.19.4、1.20-SNAPSHOT),可能引发额外兼容性问题。
修复步骤
降低Java编译版本到8
修改maven-compiler-plugin的source和target参数为1.8:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <inherited>true</inherited> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin>统一Jersey依赖版本
修改properties中的jersey-version为稳定版1.19.4,并将所有Jersey相关依赖的版本替换为该变量:<properties> <jersey-version>1.19.4</jersey-version> </properties>调整后的Jersey依赖示例:
<dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-grizzly</artifactId> <version>${jersey-version}</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-json</artifactId> <version>${jersey-version}</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> <version>${jersey-version}</version> <scope>test</scope> </dependency>清理并重新构建项目
执行以下命令清理旧编译产物并重新构建启动:mvn clean install mvn -e compile exec:java
完成以上步骤后,重新访问localhost对应的接口即可正常使用。
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

