我有一个Java Web应用程序,它公开了几个REST端点。他们都工作。它们可以被命中并返回预期的数据(纯文本)。我需要它们来代替JSON。为此,应用程序需要:
@XmlRootElement
我在课堂上添加了@XmlRootElement
。我们的项目以gradle为基础。我将此行添加到build.gradle文件的dependencies
部分的底部:
compile group: 'org.glassfish.jersey.media', name: 'jersey-media-moxy', version: '2.26'
它看起来几乎与上面的一行相同:
compile group: 'org.glassfish.jersey.media', name: 'jersey-media-multipart', version: '2.22.2'
当然,除了名称和版本。它建立得很好。我不得不将jar(jersey-media-moxy-2.26.jar
)添加到我们的依赖层次结构中,但没什么大不了的。
它运行正常,直到用户登录。主屏幕上的许多组件都丢失了,并且它会出现错误(应用程序总是会出现错误,但是它们是预期的)。新的错误是多种多样的,但重复的错误是:
SEVERE: StandardWrapper.Throwable
java.lang.NoClassDefFoundError: jersey/repackaged/com/google/common/base/Predicate
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:177)
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:369)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
...
堆栈跟踪从不包含任何源代码作为罪魁祸首。这都是org.glassfish.jersey
和org.apache.catalina.core
错误(我们使用Tomcat作为我们的服务器)。显然,出了点问题。
我已经尝试了更多的事情来解决它而不是我想回忆起来,但有些包括:
jersey-media-moxy
添加到我们拥有的40个左右依赖项的不同位置(没有区别)jersey-media-moxy
依赖项(即使它没有它们构建正常; 没有区别)jersey-media-multipart
依赖关系(构建失败)jersey-media-moxy
依赖项(无差异)jersey-media-multipart
带到最新版本(不构建)jersey-media-moxy
依赖项以查看我是否真的需要它(谁知道?可能jersey-media-multipart
已经包含它)并更改了对象我正在返回一个非常简单的类(它只包含一个string
)。 (失败,确实需要jersey-media-moxy
)我是这里唯一的Java开发人员,这是我第一次使用gradle或Jersey。我知道还有其他方法可以生成JSON(例如使用gson),但我们真的希望泽西做它,因为我们已经在使用框架了。
我们使用Eclipse(Oxygen)作为IDE,使用Tomcat作为服务器。
我遇到的一个重要问题是为什么新罐子会破坏现有罐子?
第二个问题是重要问题,当然:我该怎么做才能解决这个问题?
答案 0 :(得分:1)
您的2.26和2.22.2差异可能是问题所在。不要混合泽西模块版本。
为什么新罐子会破坏现有罐子?
因为您要添加的不仅仅是一个 jar 。当使用像Maven或Gradle这样的依赖管理系统时,您正在处理依赖而不仅仅是 jars ,而您明确列出的那些可以拥有自己的隐式获取的依赖关系拉入。例如,如果您只是添加jersey-media-moxy
,它会像10个额外的罐子一样拉入。
问题在于,如果您使用不兼容的版本,jersey-media-moxy
和jersey-media-multipart
都会引入一些相同的jar,那么就不能有多个版本的类。因此,只使用这两个罐中的一个类。如您所知,软件会随着版本的变化而变化。因此,一个类可能尝试使用存在于一个版本而不存在于另一个版本中的类。如果您没有正确管理依赖项版本,这只是您可能遇到的问题之一。